summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2019-04-12 04:02:58 -0400
committerDavid Sterba <dsterba@suse.com>2019-04-29 13:02:44 -0400
commit04e6863b19c72279bcbeffa26d85d649ab9c8205 (patch)
tree9b8c3dead2ef66371726b7b16a155d2903ff3218
parent353c2ea735e4b54fb6250861e67b51b1bcb47198 (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.c6
-rw-r--r--fs/btrfs/props.c34
-rw-r--r--fs/btrfs/xattr.c6
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
97out: 101out:
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;