summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2019-04-20 07:48:51 -0400
committerDavid Sterba <dsterba@suse.com>2019-04-29 13:02:52 -0400
commitf22125e5d8ae136adb99552d97078702e1ee68ab (patch)
tree091574a84bd201eff96baa3e9d20b3751c3f2f6c
parent7c15d41016dc886cc011e3854d855e219759ae68 (diff)
btrfs: refactor btrfs_set_props to validate externally
In preparation to merge multiple transactions when setting the compression flags, split btrfs_set_props() validation part outside of it. 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/ioctl.c3
-rw-r--r--fs/btrfs/props.c23
-rw-r--r--fs/btrfs/props.h1
-rw-r--r--fs/btrfs/xattr.c5
4 files changed, 26 insertions, 6 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 7755b503b348..3f9263ddeff8 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -284,6 +284,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
284 binode->flags &= ~BTRFS_INODE_COMPRESS; 284 binode->flags &= ~BTRFS_INODE_COMPRESS;
285 binode->flags |= BTRFS_INODE_NOCOMPRESS; 285 binode->flags |= BTRFS_INODE_NOCOMPRESS;
286 286
287 /* set no-compression no need to validate prop here */
287 ret = btrfs_set_prop_trans(inode, "btrfs.compression", NULL, 288 ret = btrfs_set_prop_trans(inode, "btrfs.compression", NULL,
288 0, 0); 289 0, 0);
289 if (ret && ret != -ENODATA) 290 if (ret && ret != -ENODATA)
@@ -299,6 +300,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
299 binode->flags |= BTRFS_INODE_COMPRESS; 300 binode->flags |= BTRFS_INODE_COMPRESS;
300 binode->flags &= ~BTRFS_INODE_NOCOMPRESS; 301 binode->flags &= ~BTRFS_INODE_NOCOMPRESS;
301 302
303 /* compress_type is already validated during mount options */
302 comp = btrfs_compress_type2str(fs_info->compress_type); 304 comp = btrfs_compress_type2str(fs_info->compress_type);
303 if (!comp || comp[0] == 0) 305 if (!comp || comp[0] == 0)
304 comp = btrfs_compress_type2str(BTRFS_COMPRESS_ZLIB); 306 comp = btrfs_compress_type2str(BTRFS_COMPRESS_ZLIB);
@@ -309,6 +311,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
309 goto out_drop; 311 goto out_drop;
310 312
311 } else { 313 } else {
314 /* reset prop, no need of validate prop here */
312 ret = btrfs_set_prop_trans(inode, "btrfs.compression", NULL, 315 ret = btrfs_set_prop_trans(inode, "btrfs.compression", NULL,
313 0, 0); 316 0, 0);
314 if (ret && ret != -ENODATA) 317 if (ret && ret != -ENODATA)
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index 44b7bf647ab3..e356dd2a0f73 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -55,6 +55,23 @@ find_prop_handler(const char *name,
55 return NULL; 55 return NULL;
56} 56}
57 57
58int btrfs_validate_prop(const char *name, const char *value, size_t value_len)
59{
60 const struct prop_handler *handler;
61
62 if (strlen(name) <= XATTR_BTRFS_PREFIX_LEN)
63 return -EINVAL;
64
65 handler = find_prop_handler(name, NULL);
66 if (!handler)
67 return -EINVAL;
68
69 if (value_len == 0)
70 return 0;
71
72 return handler->validate(value, value_len);
73}
74
58static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, 75static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
59 const char *name, const char *value, size_t value_len, 76 const char *name, const char *value, size_t value_len,
60 int flags) 77 int flags)
@@ -62,9 +79,6 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
62 const struct prop_handler *handler; 79 const struct prop_handler *handler;
63 int ret; 80 int ret;
64 81
65 if (strlen(name) <= XATTR_BTRFS_PREFIX_LEN)
66 return -EINVAL;
67
68 handler = find_prop_handler(name, NULL); 82 handler = find_prop_handler(name, NULL);
69 if (!handler) 83 if (!handler)
70 return -EINVAL; 84 return -EINVAL;
@@ -85,9 +99,6 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
85 return ret; 99 return ret;
86 } 100 }
87 101
88 ret = handler->validate(value, value_len);
89 if (ret)
90 return ret;
91 if (trans) 102 if (trans)
92 ret = btrfs_setxattr(trans, inode, handler->xattr_name, value, 103 ret = btrfs_setxattr(trans, inode, handler->xattr_name, value,
93 value_len, flags); 104 value_len, flags);
diff --git a/fs/btrfs/props.h b/fs/btrfs/props.h
index b1a6b233b774..01d2c1899bc7 100644
--- a/fs/btrfs/props.h
+++ b/fs/btrfs/props.h
@@ -12,6 +12,7 @@ void __init btrfs_props_init(void);
12 12
13int btrfs_set_prop_trans(struct inode *inode, const char *name, 13int btrfs_set_prop_trans(struct inode *inode, const char *name,
14 const char *value, size_t value_len, int flags); 14 const char *value, size_t value_len, int flags);
15int btrfs_validate_prop(const char *name, const char *value, size_t value_len);
15 16
16int btrfs_load_inode_props(struct inode *inode, struct btrfs_path *path); 17int btrfs_load_inode_props(struct inode *inode, struct btrfs_path *path);
17 18
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index cb45c02cdc44..09db8f5f08fe 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -371,7 +371,12 @@ static int btrfs_xattr_handler_set_prop(const struct xattr_handler *handler,
371 const char *name, const void *value, 371 const char *name, const void *value,
372 size_t size, int flags) 372 size_t size, int flags)
373{ 373{
374 int ret;
375
374 name = xattr_full_name(handler, name); 376 name = xattr_full_name(handler, name);
377 ret = btrfs_validate_prop(name, value, size);
378 if (ret)
379 return ret;
375 return btrfs_set_prop_trans(inode, name, value, size, flags); 380 return btrfs_set_prop_trans(inode, name, value, size, flags);
376} 381}
377 382