Commit 04e6863b authored by Anand Jain's avatar Anand Jain Committed by David Sterba

btrfs: split btrfs_setxattr calls regarding transaction

When the caller has already created the transaction handle,
btrfs_setxattr() will use it. Also adds assert in btrfs_setxattr().
Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 353c2ea7
...@@ -93,7 +93,11 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, ...@@ -93,7 +93,11 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans,
goto out; goto out;
} }
ret = btrfs_setxattr_trans(trans, inode, name, value, size, 0); if (trans)
ret = btrfs_setxattr(trans, inode, name, value, size, 0);
else
ret = btrfs_setxattr_trans(NULL, inode, name, value, size, 0);
out: out:
kfree(value); kfree(value);
......
...@@ -70,8 +70,13 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, ...@@ -70,8 +70,13 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
return -EINVAL; return -EINVAL;
if (value_len == 0) { if (value_len == 0) {
ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name, if (trans)
NULL, 0, flags); ret = btrfs_setxattr(trans, inode, handler->xattr_name,
NULL, 0, flags);
else
ret = btrfs_setxattr_trans(NULL, inode,
handler->xattr_name, NULL, 0,
flags);
if (ret) if (ret)
return ret; return ret;
...@@ -84,14 +89,23 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, ...@@ -84,14 +89,23 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
ret = handler->validate(value, value_len); ret = handler->validate(value, value_len);
if (ret) if (ret)
return ret; return ret;
ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name, if (trans)
value, value_len, flags); ret = btrfs_setxattr(trans, inode, handler->xattr_name, value,
value_len, flags);
else
ret = btrfs_setxattr_trans(NULL, inode, handler->xattr_name,
value, value_len, flags);
if (ret) if (ret)
return ret; return ret;
ret = handler->apply(inode, value, value_len); ret = handler->apply(inode, value, value_len);
if (ret) { if (ret) {
btrfs_setxattr_trans(trans, inode, handler->xattr_name, if (trans)
NULL, 0, flags); btrfs_setxattr(trans, inode, handler->xattr_name, NULL,
0, flags);
else
btrfs_setxattr_trans(NULL, inode, handler->xattr_name,
NULL, 0, flags);
return ret; return ret;
} }
...@@ -358,13 +372,13 @@ static int inherit_props(struct btrfs_trans_handle *trans, ...@@ -358,13 +372,13 @@ static int inherit_props(struct btrfs_trans_handle *trans,
if (ret) if (ret)
return ret; return ret;
ret = btrfs_setxattr_trans(trans, inode, h->xattr_name, value, ret = btrfs_setxattr(trans, inode, h->xattr_name, value,
strlen(value), 0); strlen(value), 0);
if (!ret) { if (!ret) {
ret = h->apply(inode, value, strlen(value)); ret = h->apply(inode, value, strlen(value));
if (ret) if (ret)
btrfs_setxattr_trans(trans, inode, h->xattr_name, btrfs_setxattr(trans, inode, h->xattr_name,
NULL, 0, 0); NULL, 0, 0);
else else
set_bit(BTRFS_INODE_HAS_PROPS, set_bit(BTRFS_INODE_HAS_PROPS,
&BTRFS_I(inode)->runtime_flags); &BTRFS_I(inode)->runtime_flags);
......
...@@ -86,6 +86,8 @@ int btrfs_setxattr(struct btrfs_trans_handle *trans, struct inode *inode, ...@@ -86,6 +86,8 @@ int btrfs_setxattr(struct btrfs_trans_handle *trans, struct inode *inode,
size_t name_len = strlen(name); size_t name_len = strlen(name);
int ret = 0; int ret = 0;
ASSERT(trans);
if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info)) if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info))
return -ENOSPC; return -ENOSPC;
...@@ -437,8 +439,8 @@ static int btrfs_initxattrs(struct inode *inode, ...@@ -437,8 +439,8 @@ static int btrfs_initxattrs(struct inode *inode,
} }
strcpy(name, XATTR_SECURITY_PREFIX); strcpy(name, XATTR_SECURITY_PREFIX);
strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name); strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name);
err = btrfs_setxattr_trans(trans, inode, name, xattr->value, err = btrfs_setxattr(trans, inode, name, xattr->value,
xattr->value_len, 0); xattr->value_len, 0);
kfree(name); kfree(name);
if (err < 0) if (err < 0)
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment