diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index ed3edc283255..3970f32b2b80 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -56,6 +56,7 @@ | |||
56 | #include "rcu-string.h" | 56 | #include "rcu-string.h" |
57 | #include "send.h" | 57 | #include "send.h" |
58 | #include "dev-replace.h" | 58 | #include "dev-replace.h" |
59 | #include "props.h" | ||
59 | #include "sysfs.h" | 60 | #include "sysfs.h" |
60 | 61 | ||
61 | static int btrfs_clone(struct inode *src, struct inode *inode, | 62 | static int btrfs_clone(struct inode *src, struct inode *inode, |
@@ -281,9 +282,25 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
281 | if (flags & FS_NOCOMP_FL) { | 282 | if (flags & FS_NOCOMP_FL) { |
282 | ip->flags &= ~BTRFS_INODE_COMPRESS; | 283 | ip->flags &= ~BTRFS_INODE_COMPRESS; |
283 | ip->flags |= BTRFS_INODE_NOCOMPRESS; | 284 | ip->flags |= BTRFS_INODE_NOCOMPRESS; |
285 | |||
286 | ret = btrfs_set_prop(inode, "btrfs.compression", NULL, 0, 0); | ||
287 | if (ret && ret != -ENODATA) | ||
288 | goto out_drop; | ||
284 | } else if (flags & FS_COMPR_FL) { | 289 | } else if (flags & FS_COMPR_FL) { |
290 | const char *comp; | ||
291 | |||
285 | ip->flags |= BTRFS_INODE_COMPRESS; | 292 | ip->flags |= BTRFS_INODE_COMPRESS; |
286 | ip->flags &= ~BTRFS_INODE_NOCOMPRESS; | 293 | ip->flags &= ~BTRFS_INODE_NOCOMPRESS; |
294 | |||
295 | if (root->fs_info->compress_type == BTRFS_COMPRESS_LZO) | ||
296 | comp = "lzo"; | ||
297 | else | ||
298 | comp = "zlib"; | ||
299 | ret = btrfs_set_prop(inode, "btrfs.compression", | ||
300 | comp, strlen(comp), 0); | ||
301 | if (ret) | ||
302 | goto out_drop; | ||
303 | |||
287 | } else { | 304 | } else { |
288 | ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS); | 305 | ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS); |
289 | } | 306 | } |
@@ -502,7 +519,7 @@ static noinline int create_subvol(struct inode *dir, | |||
502 | 519 | ||
503 | btrfs_record_root_in_trans(trans, new_root); | 520 | btrfs_record_root_in_trans(trans, new_root); |
504 | 521 | ||
505 | ret = btrfs_create_subvol_root(trans, new_root, new_dirid); | 522 | ret = btrfs_create_subvol_root(trans, new_root, root, new_dirid); |
506 | if (ret) { | 523 | if (ret) { |
507 | /* We potentially lose an unused inode item here */ | 524 | /* We potentially lose an unused inode item here */ |
508 | btrfs_abort_transaction(trans, root, ret); | 525 | btrfs_abort_transaction(trans, root, ret); |