| From 78a017a2c92df9b571db0a55a016280f9019c65e Mon Sep 17 00:00:00 2001 |
| From: Filipe Manana <fdmanana@suse.com> |
| Date: Thu, 11 Sep 2014 11:44:49 +0100 |
| Subject: Btrfs: add missing compression property remove in btrfs_ioctl_setflags |
| |
| From: Filipe Manana <fdmanana@suse.com> |
| |
| commit 78a017a2c92df9b571db0a55a016280f9019c65e upstream. |
| |
| The behaviour of a 'chattr -c' consists of getting the current flags, |
| clearing the FS_COMPR_FL bit and then sending the result to the set |
| flags ioctl - this means the bit FS_NOCOMP_FL isn't set in the flags |
| passed to the ioctl. This results in the compression property not being |
| cleared from the inode - it was cleared only if the bit FS_NOCOMP_FL |
| was set in the received flags. |
| |
| Reproducer: |
| |
| $ mkfs.btrfs -f /dev/sdd |
| $ mount /dev/sdd /mnt && cd /mnt |
| $ mkdir a |
| $ chattr +c a |
| $ touch a/file |
| $ lsattr a/file |
| --------c------- a/file |
| $ chattr -c a |
| $ touch a/file2 |
| $ lsattr a/file2 |
| --------c------- a/file2 |
| $ lsattr -d a |
| ---------------- a |
| |
| Reported-by: Andreas Schneider <asn@cryptomilk.org> |
| Signed-off-by: Filipe Manana <fdmanana@suse.com> |
| Signed-off-by: Chris Mason <clm@fb.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/ioctl.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/fs/btrfs/ioctl.c |
| +++ b/fs/btrfs/ioctl.c |
| @@ -332,6 +332,9 @@ static int btrfs_ioctl_setflags(struct f |
| goto out_drop; |
| |
| } else { |
| + ret = btrfs_set_prop(inode, "btrfs.compression", NULL, 0, 0); |
| + if (ret && ret != -ENODATA) |
| + goto out_drop; |
| ip->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS); |
| } |
| |