diff options
author | Anand Jain <anand.jain@oracle.com> | 2019-04-20 07:48:51 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2019-04-29 13:02:52 -0400 |
commit | f22125e5d8ae136adb99552d97078702e1ee68ab (patch) | |
tree | 091574a84bd201eff96baa3e9d20b3751c3f2f6c | |
parent | 7c15d41016dc886cc011e3854d855e219759ae68 (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.c | 3 | ||||
-rw-r--r-- | fs/btrfs/props.c | 23 | ||||
-rw-r--r-- | fs/btrfs/props.h | 1 | ||||
-rw-r--r-- | fs/btrfs/xattr.c | 5 |
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 | ||
58 | int 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 | |||
58 | static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode, | 75 | static 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 | ||
13 | int btrfs_set_prop_trans(struct inode *inode, const char *name, | 13 | int 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); |
15 | int btrfs_validate_prop(const char *name, const char *value, size_t value_len); | ||
15 | 16 | ||
16 | int btrfs_load_inode_props(struct inode *inode, struct btrfs_path *path); | 17 | int 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 | ||