From patchwork Wed Oct 19 08:23:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 4593 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp206247wrs; Wed, 19 Oct 2022 01:51:57 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7t+WdH5PukYtH9QvOp0wNQ1cvoX+luK7hzYlsjaBIoVmQ0rTHCMYrQTsSLPFDqFyVLyJ/P X-Received: by 2002:a17:90b:1808:b0:20c:8409:2007 with SMTP id lw8-20020a17090b180800b0020c84092007mr8647465pjb.226.1666169506167; Wed, 19 Oct 2022 01:51:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666169506; cv=none; d=google.com; s=arc-20160816; b=m7nGr9QOmmBF0P/ftnjVPr6Dabyc0+YIyBfZKLdYEmdoDlleUg1k1vOmt7ZaWN0dS6 kzNaz+LKhW4iKGCXlzvhmVXaB+YVxamUtyyT7gESLq3rVtxT7fSkehjIeQaHZRU5wu9O Fmw92no8IjaMOChWfkyN0+Nett9k6S5eUm4VSLvVew/pe8o77XT0bATcWJXHqur7BuGf CrJ8lidDMcBLLCQR8VQEwcuRuSmKWo/s1uLeGeGXsczexzFFoGJLj9Nxo2918x8/6/sY g1UY/ubSWyDcPLsKKxVxMSH0y1arO9IBfhieUQC90JwNfyDGmdrrShWsbLtVKPiwDXHL +LXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=8Vm8G7yAPoSmvi3kN3hXmaoC0RnVV0ue0jWRIaWI9lk=; b=NDdefzsC091IE2Lq5wBz/pnU4Xmi/uhTf0iRKiWhYnkU//q+O1rl5z6bHGju2QduQx 5U3Tk08mHI2CcP0xs67iP3BH/dnAB+fB+AK9XK3CkJ3Kp5gE+WGs45tjYiULdXFJBBRt napcQ9szrZ5MiT5lOS1XLJrviLdzi5Uc/P+cbveU8VrlNdrj1yw6ONz/47KNyf39ePzs H2geeyoCxhW1+1gyO1UnFoPNBawMB8g2fKowOkdfco0jzyOOP3IcFCwIzu69S7ajWLoo ALwgBeAzw0FJ9glzBd6aGqaA+rRdCIQqKIgBKwUXEZiPUKdwz0/cKZIMVTMRECgE8gad Jbow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UZ5g9RbN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k30-20020a63ff1e000000b004600ab82237si17685821pgi.293.2022.10.19.01.51.33; Wed, 19 Oct 2022 01:51:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UZ5g9RbN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231661AbiJSIvL (ORCPT + 99 others); Wed, 19 Oct 2022 04:51:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60260 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231649AbiJSItA (ORCPT ); Wed, 19 Oct 2022 04:49:00 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C1708E9BF; Wed, 19 Oct 2022 01:46:46 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A25F8617F7; Wed, 19 Oct 2022 08:44:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A71E3C433C1; Wed, 19 Oct 2022 08:44:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1666169058; bh=hG4656HVgNHfCYkV2W0FvXrC1cK0TQX9tjDFOzCTUWk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UZ5g9RbN/see9F1rwHV473LDw9E8lz1DdloE7g/F6S2mydHJ1UiflrvCn3D2+RCsM Ikiq2rWumKcvKmnV2J40Tww6NYaZBPE44yY/Gwmt+Px8UqH2TVnMEY2Ld52mH7Q1LK GlfoRZLXo0SVPDXSiq4LTi8OOrUI7fhRq/gpJbXk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, stable@kernel.org, Lukas Czerner , Jan Kara , "Christian Brauner (Microsoft)" , Jeff Layton , Theodore Tso Subject: [PATCH 6.0 143/862] ext4: fix i_version handling in ext4 Date: Wed, 19 Oct 2022 10:23:50 +0200 Message-Id: <20221019083256.307949361@linuxfoundation.org> X-Mailer: git-send-email 2.38.0 In-Reply-To: <20221019083249.951566199@linuxfoundation.org> References: <20221019083249.951566199@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747105356062246399?= X-GMAIL-MSGID: =?utf-8?q?1747105356062246399?= From: Jeff Layton commit a642c2c0827f5604a93f9fa1e5701eecdce4ae22 upstream. ext4 currently updates the i_version counter when the atime is updated during a read. This is less than ideal as it can cause unnecessary cache invalidations with NFSv4 and unnecessary remeasurements for IMA. The increment in ext4_mark_iloc_dirty is also problematic since it can corrupt the i_version counter for ea_inodes. We aren't bumping the file times in ext4_mark_iloc_dirty, so changing the i_version there seems wrong, and is the cause of both problems. Remove that callsite and add increments to the setattr, setxattr and ioctl codepaths, at the same times that we update the ctime. The i_version bump that already happens during timestamp updates should take care of the rest. In ext4_move_extents, increment the i_version on both inodes, and also add in missing ctime updates. [ Some minor updates since we've already enabled the i_version counter unconditionally already via another patch series. -- TYT ] Cc: stable@kernel.org Cc: Lukas Czerner Reviewed-by: Jan Kara Reviewed-by: Christian Brauner (Microsoft) Signed-off-by: Jeff Layton Link: https://lore.kernel.org/r/20220908172448.208585-3-jlayton@kernel.org Signed-off-by: Theodore Ts'o Signed-off-by: Greg Kroah-Hartman --- fs/ext4/inode.c | 14 +++++--------- fs/ext4/ioctl.c | 4 ++++ fs/ext4/xattr.c | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5349,6 +5349,7 @@ int ext4_setattr(struct user_namespace * int error, rc = 0; int orphan = 0; const unsigned int ia_valid = attr->ia_valid; + bool inc_ivers = true; if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; @@ -5432,8 +5433,8 @@ int ext4_setattr(struct user_namespace * return -EINVAL; } - if (attr->ia_size != inode->i_size) - inode_inc_iversion(inode); + if (attr->ia_size == inode->i_size) + inc_ivers = false; if (shrink) { if (ext4_should_order_data(inode)) { @@ -5535,6 +5536,8 @@ out_mmap_sem: } if (!error) { + if (inc_ivers) + inode_inc_iversion(inode); setattr_copy(mnt_userns, inode, attr); mark_inode_dirty(inode); } @@ -5738,13 +5741,6 @@ int ext4_mark_iloc_dirty(handle_t *handl } ext4_fc_track_inode(handle, inode); - /* - * ea_inodes are using i_version for storing reference count, don't - * mess with it - */ - if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) - inode_inc_iversion(inode); - /* the do_update_inode consumes one bh->b_count */ get_bh(iloc->bh); --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c @@ -452,6 +452,7 @@ static long swap_inode_boot_loader(struc swap_inode_data(inode, inode_bl); inode->i_ctime = inode_bl->i_ctime = current_time(inode); + inode_inc_iversion(inode); inode->i_generation = prandom_u32(); inode_bl->i_generation = prandom_u32(); @@ -665,6 +666,7 @@ static int ext4_ioctl_setflags(struct in ext4_set_inode_flags(inode, false); inode->i_ctime = current_time(inode); + inode_inc_iversion(inode); err = ext4_mark_iloc_dirty(handle, inode, &iloc); flags_err: @@ -775,6 +777,7 @@ static int ext4_ioctl_setproject(struct EXT4_I(inode)->i_projid = kprojid; inode->i_ctime = current_time(inode); + inode_inc_iversion(inode); out_dirty: rc = ext4_mark_iloc_dirty(handle, inode, &iloc); if (!err) @@ -1257,6 +1260,7 @@ static long __ext4_ioctl(struct file *fi err = ext4_reserve_inode_write(handle, inode, &iloc); if (err == 0) { inode->i_ctime = current_time(inode); + inode_inc_iversion(inode); inode->i_generation = generation; err = ext4_mark_iloc_dirty(handle, inode, &iloc); } --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -2412,6 +2412,7 @@ retry_inode: if (!error) { ext4_xattr_update_super_block(handle, inode->i_sb); inode->i_ctime = current_time(inode); + inode_inc_iversion(inode); if (!value) no_expand = 0; error = ext4_mark_iloc_dirty(handle, inode, &is.iloc);