diff options
author | Anand Jain <anand.jain@oracle.com> | 2019-04-12 04:02:58 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2019-04-29 13:02:44 -0400 |
commit | 04e6863b19c72279bcbeffa26d85d649ab9c8205 (patch) | |
tree | 9b8c3dead2ef66371726b7b16a155d2903ff3218 | |
parent | 353c2ea735e4b54fb6250861e67b51b1bcb47198 (diff) |
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, | |||
93 | goto out; | 93 | goto out; |
94 | } | 94 | } |
95 | 95 | ||
96 | ret = btrfs_setxattr_trans(trans, inode, name, value, size, 0); | 96 | if (trans) |
97 | ret = btrfs_setxattr(trans, inode, name, value, size, 0); | ||
98 | else | ||
99 | ret = btrfs_setxattr_trans(NULL, inode, name, value, size, 0); | ||
100 | |||
97 | out: | 101 | out: |
98 | kfree(value); | 102 | kfree(value); |
99 | 103 | ||
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, | |||
70 | return -EINVAL; | 70 | return -EINVAL; |
71 | 71 | ||
72 | if (value_len == 0) { | 72 | if (value_len == 0) { |
73 | ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name, | 73 | if (trans) |
74 | NULL, 0, flags); | 74 | ret = btrfs_setxattr(trans, inode, handler->xattr_name, |
75 | NULL, 0, flags); | ||
76 | else | ||
77 | ret = btrfs_setxattr_trans(NULL, inode, | ||
78 | handler->xattr_name, NULL, 0, | ||
79 | flags); | ||
75 | if (ret) | 80 | if (ret) |
76 | return ret; | 81 | return ret; |
77 | 82 | ||
@@ -84,14 +89,23 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, | |||
84 | ret = handler->validate(value, value_len); | 89 | ret = handler->validate(value, value_len); |
85 | if (ret) | 90 | if (ret) |
86 | return ret; | 91 | return ret; |
87 | ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name, | 92 | if (trans) |
88 | value, value_len, flags); | 93 | ret = btrfs_setxattr(trans, inode, handler->xattr_name, value, |
94 | value_len, flags); | ||
95 | else | ||
96 | ret = btrfs_setxattr_trans(NULL, inode, handler->xattr_name, | ||
97 | value, value_len, flags); | ||
98 | |||
89 | if (ret) | 99 | if (ret) |
90 | return ret; | 100 | return ret; |
91 | ret = handler->apply(inode, value, value_len); | 101 | ret = handler->apply(inode, value, value_len); |
92 | if (ret) { | 102 | if (ret) { |
93 | btrfs_setxattr_trans(trans, inode, handler->xattr_name, | 103 | if (trans) |
94 | NULL, 0, flags); | 104 | btrfs_setxattr(trans, inode, handler->xattr_name, NULL, |
105 | 0, flags); | ||
106 | else | ||
107 | btrfs_setxattr_trans(NULL, inode, handler->xattr_name, | ||
108 | NULL, 0, flags); | ||
95 | return ret; | 109 | return ret; |
96 | } | 110 | } |
97 | 111 | ||
@@ -358,13 +372,13 @@ static int inherit_props(struct btrfs_trans_handle *trans, | |||
358 | if (ret) | 372 | if (ret) |
359 | return ret; | 373 | return ret; |
360 | 374 | ||
361 | ret = btrfs_setxattr_trans(trans, inode, h->xattr_name, value, | 375 | ret = btrfs_setxattr(trans, inode, h->xattr_name, value, |
362 | strlen(value), 0); | 376 | strlen(value), 0); |
363 | if (!ret) { | 377 | if (!ret) { |
364 | ret = h->apply(inode, value, strlen(value)); | 378 | ret = h->apply(inode, value, strlen(value)); |
365 | if (ret) | 379 | if (ret) |
366 | btrfs_setxattr_trans(trans, inode, h->xattr_name, | 380 | btrfs_setxattr(trans, inode, h->xattr_name, |
367 | NULL, 0, 0); | 381 | NULL, 0, 0); |
368 | else | 382 | else |
369 | set_bit(BTRFS_INODE_HAS_PROPS, | 383 | set_bit(BTRFS_INODE_HAS_PROPS, |
370 | &BTRFS_I(inode)->runtime_flags); | 384 | &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, | |||
86 | size_t name_len = strlen(name); | 86 | size_t name_len = strlen(name); |
87 | int ret = 0; | 87 | int ret = 0; |
88 | 88 | ||
89 | ASSERT(trans); | ||
90 | |||
89 | if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info)) | 91 | if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info)) |
90 | return -ENOSPC; | 92 | return -ENOSPC; |
91 | 93 | ||
@@ -437,8 +439,8 @@ static int btrfs_initxattrs(struct inode *inode, | |||
437 | } | 439 | } |
438 | strcpy(name, XATTR_SECURITY_PREFIX); | 440 | strcpy(name, XATTR_SECURITY_PREFIX); |
439 | strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name); | 441 | strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name); |
440 | err = btrfs_setxattr_trans(trans, inode, name, xattr->value, | 442 | err = btrfs_setxattr(trans, inode, name, xattr->value, |
441 | xattr->value_len, 0); | 443 | xattr->value_len, 0); |
442 | kfree(name); | 444 | kfree(name); |
443 | if (err < 0) | 445 | if (err < 0) |
444 | break; | 446 | break; |