diff options
Diffstat (limited to 'fs/jfs/xattr.c')
| -rw-r--r-- | fs/jfs/xattr.c | 55 | 
1 files changed, 27 insertions, 28 deletions
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index e87fedef23d..26683e15b3a 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c @@ -1089,38 +1089,37 @@ int jfs_removexattr(struct dentry *dentry, const char *name)  }  #ifdef CONFIG_JFS_SECURITY -int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir, -		      const struct qstr *qstr) +int jfs_initxattrs(struct inode *inode, const struct xattr *xattr_array, +		   void *fs_info)  { -	int rc; -	size_t len; -	void *value; -	char *suffix; +	const struct xattr *xattr; +	tid_t *tid = fs_info;  	char *name; +	int err = 0; -	rc = security_inode_init_security(inode, dir, qstr, &suffix, &value, -					  &len); -	if (rc) { -		if (rc == -EOPNOTSUPP) -			return 0; -		return rc; -	} -	name = kmalloc(XATTR_SECURITY_PREFIX_LEN + 1 + strlen(suffix), -		       GFP_NOFS); -	if (!name) { -		rc = -ENOMEM; -		goto kmalloc_failed; -	} -	strcpy(name, XATTR_SECURITY_PREFIX); -	strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix); - -	rc = __jfs_setxattr(tid, inode, name, value, len, 0); +	for (xattr = xattr_array; xattr->name != NULL; xattr++) { +		name = kmalloc(XATTR_SECURITY_PREFIX_LEN + +			       strlen(xattr->name) + 1, GFP_NOFS); +		if (!name) { +			err = -ENOMEM; +			break; +		} +		strcpy(name, XATTR_SECURITY_PREFIX); +		strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name); -	kfree(name); -kmalloc_failed: -	kfree(suffix); -	kfree(value); +		err = __jfs_setxattr(*tid, inode, name, +				     xattr->value, xattr->value_len, 0); +		kfree(name); +		if (err < 0) +			break; +	} +	return err; +} -	return rc; +int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir, +		      const struct qstr *qstr) +{ +	return security_inode_init_security(inode, dir, qstr, +					    &jfs_initxattrs, &tid);  }  #endif  |