diff options
author | Anand Jain <anand.jain@oracle.com> | 2019-04-12 10:02:58 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2019-04-29 19:02:44 +0200 |
commit | 04e6863b19c72279bcbeffa26d85d649ab9c8205 (patch) | |
tree | 9b8c3dead2ef66371726b7b16a155d2903ff3218 | |
parent | btrfs: remove redundant readonly root check in btrfs_setxattr_trans (diff) | |
download | linux-04e6863b19c72279bcbeffa26d85d649ab9c8205.tar.xz linux-04e6863b19c72279bcbeffa26d85d649ab9c8205.zip |
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: Anand Jain <anand.jain@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | fs/btrfs/acl.c | 6 | ||||
-rw-r--r-- | fs/btrfs/props.c | 34 | ||||
-rw-r--r-- | fs/btrfs/xattr.c | 6 |
3 files changed, 33 insertions, 13 deletions
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index d3b04c6abc61..7fe6551bc59b 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c @@ -93,7 +93,11 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, 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: kfree(value); diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c index 61ced0ebb5ba..a73c1bdc7b05 100644 --- a/fs/btrfs/props.c +++ b/fs/btrfs/props.c @@ -70,8 +70,13 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, return -EINVAL; if (value_len == 0) { - ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name, - NULL, 0, flags); + if (trans) + 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) return ret; @@ -84,14 +89,23 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, ret = handler->validate(value, value_len); if (ret) return ret; - ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name, - value, value_len, flags); + if (trans) + 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) return ret; ret = handler->apply(inode, value, value_len); if (ret) { - btrfs_setxattr_trans(trans, inode, handler->xattr_name, - NULL, 0, flags); + if (trans) + btrfs_setxattr(trans, inode, handler->xattr_name, NULL, + 0, flags); + else + btrfs_setxattr_trans(NULL, inode, handler->xattr_name, + NULL, 0, flags); return ret; } @@ -358,13 +372,13 @@ static int inherit_props(struct btrfs_trans_handle *trans, if (ret) return ret; - ret = btrfs_setxattr_trans(trans, inode, h->xattr_name, value, - strlen(value), 0); + ret = btrfs_setxattr(trans, inode, h->xattr_name, value, + strlen(value), 0); if (!ret) { ret = h->apply(inode, value, strlen(value)); if (ret) - btrfs_setxattr_trans(trans, inode, h->xattr_name, - NULL, 0, 0); + btrfs_setxattr(trans, inode, h->xattr_name, + NULL, 0, 0); else set_bit(BTRFS_INODE_HAS_PROPS, &BTRFS_I(inode)->runtime_flags); diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index 4c447b1f32e5..623d508f21a6 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c @@ -86,6 +86,8 @@ int btrfs_setxattr(struct btrfs_trans_handle *trans, struct inode *inode, size_t name_len = strlen(name); int ret = 0; + ASSERT(trans); + if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info)) return -ENOSPC; @@ -437,8 +439,8 @@ static int btrfs_initxattrs(struct inode *inode, } strcpy(name, XATTR_SECURITY_PREFIX); strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name); - err = btrfs_setxattr_trans(trans, inode, name, xattr->value, - xattr->value_len, 0); + err = btrfs_setxattr(trans, inode, name, xattr->value, + xattr->value_len, 0); kfree(name); if (err < 0) break; |