From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:31643 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751782AbcFNHMn (ORCPT ); Tue, 14 Jun 2016 03:12:43 -0400 Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u5E79Ick140216 for ; Tue, 14 Jun 2016 03:12:43 -0400 Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.150]) by mx0a-001b2d01.pphosted.com with ESMTP id 23gdxtw1rw-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 14 Jun 2016 03:12:43 -0400 Received: from localhost by e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 14 Jun 2016 01:12:42 -0600 From: Chandan Rajendra To: clm@fb.com, jbacik@fb.com, dsterba@suse.cz Cc: Chandan Rajendra , linux-btrfs@vger.kernel.org, chandan@mykolab.com Subject: [PATCH V19 19/19] Btrfs: subpage-blocksize: Disable compression Date: Tue, 14 Jun 2016 12:41:16 +0530 In-Reply-To: <1465888276-30670-1-git-send-email-chandan@linux.vnet.ibm.com> References: <1465888276-30670-1-git-send-email-chandan@linux.vnet.ibm.com> Message-Id: <1465888276-30670-20-git-send-email-chandan@linux.vnet.ibm.com> Sender: linux-btrfs-owner@vger.kernel.org List-ID: 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 ' command. Signed-off-by: Chandan Rajendra --- fs/btrfs/ioctl.c | 8 +++++++- fs/btrfs/super.c | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 77c2aa8..c4fd80e 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -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; @@ -1342,7 +1347,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; diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index ae30f52..70c0ee3 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -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 -- 2.1.0