@@ -322,6 +322,11 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
} else if (flags & FS_COMPR_FL) {
const char *comp;
+ if (root->sectorsize < PAGE_SIZE) {
+ ret = -EINVAL;
+ goto out_drop;
+ }
+
ip->flags |= BTRFS_INODE_COMPRESS;
ip->flags &= ~BTRFS_INODE_NOCOMPRESS;
@@ -1344,7 +1349,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
return -EINVAL;
if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) {
- if (range->compress_type > BTRFS_COMPRESS_TYPES)
+ if ((range->compress_type > BTRFS_COMPRESS_TYPES)
+ || (root->sectorsize < PAGE_SIZE))
return -EINVAL;
if (range->compress_type)
compress_type = range->compress_type;
@@ -368,6 +368,17 @@ static const match_table_t tokens = {
{Opt_err, NULL},
};
+static int can_enable_compression(struct btrfs_fs_info *fs_info)
+{
+ if (btrfs_super_sectorsize(fs_info->super_copy) < PAGE_SIZE) {
+ btrfs_err(fs_info,
+ "Compression is not supported for subpage-blocksize");
+ return 0;
+ }
+
+ return 1;
+}
+
/*
* Regular mount options parser. Everything that is needed only when
* reading in a new superblock is parsed here.
@@ -477,6 +488,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options,
if (token == Opt_compress ||
token == Opt_compress_force ||
strcmp(args[0].from, "zlib") == 0) {
+ if (!can_enable_compression(info)) {
+ ret = -EINVAL;
+ goto out;
+ }
compress_type = "zlib";
info->compress_type = BTRFS_COMPRESS_ZLIB;
btrfs_set_opt(info->mount_opt, COMPRESS);
@@ -484,6 +499,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options,
btrfs_clear_opt(info->mount_opt, NODATASUM);
no_compress = 0;
} else if (strcmp(args[0].from, "lzo") == 0) {
+ if (!can_enable_compression(info)) {
+ ret = -EINVAL;
+ goto out;
+ }
compress_type = "lzo";
info->compress_type = BTRFS_COMPRESS_LZO;
btrfs_set_opt(info->mount_opt, COMPRESS);
@@ -806,6 +825,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options,
break;
}
}
+
check:
/*
* Extra check for current option against current flag
The subpage-blocksize patchset does not yet support compression. Hence, the kernel might crash when executing compression code in subpage-blocksize scenario. This commit disables enabling compression feature during 'mount' and also when the user invokes 'chattr +c <filename>' command. Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com> --- fs/btrfs/ioctl.c | 8 +++++++- fs/btrfs/super.c | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-)