Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp4082002ybi; Mon, 29 Jul 2019 18:52:10 -0700 (PDT) X-Google-Smtp-Source: APXvYqwzVjH8aE3Zfg2Cv0dUQQeEcOe4llYfiHmeVQoLOMV/0TEtiAHG4nKvUa6byP3TykYTigHG X-Received: by 2002:a17:90b:95:: with SMTP id bb21mr116101613pjb.8.1564451530522; Mon, 29 Jul 2019 18:52:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564451530; cv=none; d=google.com; s=arc-20160816; b=E0HvY1LRZjQhKeMFYzHs9mbNl33UapNDSr+gB0GzEO7Rl426hfAt1ldLYBo1RLiczG rjapZ34vraFR+vk6za1uVT6hiuI24LOknrhaggoBzW44vlY5ijyfI2M+3M5dbMm5f6Ea qmPrQvnOW31OGBDOJjzayllukTy/arESXyioSRekLkPEORktuZDOtn3qV2C4vmjrNEgd LOO6+yUQY7QtnJ5JSMn/AslbxriIJ2g7LInJFhzrRuzLl9H4g0fKC7gWMotLiUVtruZH 0uac6JwKBtERbfkj2D+XyFELdsa868oMbv6ICMbPZChw1kKGUfZaCALVy6pE5W1oV8tv anYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=UDblicyqGItRD6PL+PmY3BWPO4ng8XpZ/D2cx9hSeAQ=; b=X+quV5ljkS3H3Tr56pEYRugx4p5gViaqScKhClZ4EdXVvpO+JmiAOlqOFM40xMuh2y Qc8kzcrYUrAN1SkVcpevZ+Cq73yxTYw/9teiLzibdIIWm7Hgm5rBmthx+183SKdqFe7L 8bRGGCgZ9mc9hS9F1vsav1hujb+xwSerZNc3HUkLIQbtKmJ5ajrYSEskdrwzkHJ9jf5l RYL4T02UgG9jjk03cG2tMGj3FmIqzG8Ify6tyGtyNmJZ+DuYDGBoPtVSdCp/wd7c4lXR dxP5YtQ+tE5Z7R9HPu+JMs7ZW5Pp0n3qsvw2m82a5RCuLW74UlfgUb9RTmI2Wu9JCipS dXBQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=xkURDhzQ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 78si27581336pfz.268.2019.07.29.18.51.55; Mon, 29 Jul 2019 18:52:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=xkURDhzQ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389035AbfG2ToK (ORCPT + 99 others); Mon, 29 Jul 2019 15:44:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:60826 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389741AbfG2ToH (ORCPT ); Mon, 29 Jul 2019 15:44:07 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D31AE205F4; Mon, 29 Jul 2019 19:44:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564429446; bh=xNwiuznsOjYzk1ckiVdZu9i10yFwm7YgRHBwL1Elp+w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xkURDhzQy+hyVJdI/OSATVV6dDmAM96KEg4JPJ0lQDTGJPrVXs04rkz7AKE8fUTPi UfznpEp+YqnL+8dps1RuncBf8i0BoF/FXaLFAgTzsbVhBm5fnR/sFuXex4zIiVsGXY MogtGuVpnq2U3W0KI5OJ9dF/GF3CukaA7uqHFhrI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, James Harvey , Qu Wenruo , David Sterba Subject: [PATCH 4.19 100/113] btrfs: inode: Dont compress if NODATASUM or NODATACOW set Date: Mon, 29 Jul 2019 21:23:07 +0200 Message-Id: <20190729190719.413799969@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190729190655.455345569@linuxfoundation.org> References: <20190729190655.455345569@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Qu Wenruo commit 42c16da6d684391db83788eb680accd84f6c2083 upstream. As btrfs(5) specified: Note If nodatacow or nodatasum are enabled, compression is disabled. If NODATASUM or NODATACOW set, we should not compress the extent. Normally NODATACOW is detected properly in run_delalloc_range() so compression won't happen for NODATACOW. However for NODATASUM we don't have any check, and it can cause compressed extent without csum pretty easily, just by: mkfs.btrfs -f $dev mount $dev $mnt -o nodatasum touch $mnt/foobar mount -o remount,datasum,compress $mnt xfs_io -f -c "pwrite 0 128K" $mnt/foobar And in fact, we have a bug report about corrupted compressed extent without proper data checksum so even RAID1 can't recover the corruption. (https://bugzilla.kernel.org/show_bug.cgi?id=199707) Running compression without proper checksum could cause more damage when corruption happens, as compressed data could make the whole extent unreadable, so there is no need to allow compression for NODATACSUM. The fix will refactor the inode compression check into two parts: - inode_can_compress() As the hard requirement, checked at btrfs_run_delalloc_range(), so no compression will happen for NODATASUM inode at all. - inode_need_compress() As the soft requirement, checked at btrfs_run_delalloc_range() and compress_file_range(). Reported-by: James Harvey CC: stable@vger.kernel.org # 4.4+ Signed-off-by: Qu Wenruo Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Greg Kroah-Hartman --- fs/btrfs/inode.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -388,10 +388,31 @@ static noinline int add_async_extent(str return 0; } +/* + * Check if the inode has flags compatible with compression + */ +static inline bool inode_can_compress(struct inode *inode) +{ + if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW || + BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) + return false; + return true; +} + +/* + * Check if the inode needs to be submitted to compression, based on mount + * options, defragmentation, properties or heuristics. + */ static inline int inode_need_compress(struct inode *inode, u64 start, u64 end) { struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); + if (!inode_can_compress(inode)) { + WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG), + KERN_ERR "BTRFS: unexpected compression for ino %llu\n", + btrfs_ino(BTRFS_I(inode))); + return 0; + } /* force compress */ if (btrfs_test_opt(fs_info, FORCE_COMPRESS)) return 1; @@ -1596,7 +1617,8 @@ static int run_delalloc_range(void *priv } else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC && !force_cow) { ret = run_delalloc_nocow(inode, locked_page, start, end, page_started, 0, nr_written); - } else if (!inode_need_compress(inode, start, end)) { + } else if (!inode_can_compress(inode) || + !inode_need_compress(inode, start, end)) { ret = cow_file_range(inode, locked_page, start, end, end, page_started, nr_written, 1, NULL); } else {