From patchwork Fri Oct 21 13:05:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6687 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp687375wrr; Fri, 21 Oct 2022 06:07:41 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7GDkRoO27PDQrmah4ew0FVIcMaMxeRlldK/GDSgznU8Q3qF1WJmHwtoYSg7RVnobc9ahFp X-Received: by 2002:a17:906:5dce:b0:78d:e71a:6e0 with SMTP id p14-20020a1709065dce00b0078de71a06e0mr15401185ejv.360.1666357661078; Fri, 21 Oct 2022 06:07:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357661; cv=none; d=google.com; s=arc-20160816; b=vYF5ROkJRQ465MoJoU3IX/OptP5+xO6LzhZingcu23+oE5Bf+dMdEHo0sRZ2376JkG 9iF4GwD3Brp8EOs/gIFiZlSdO5EXSxWO1tGP0/cIYhYMvv7JP7tD83tTbv5I6DgvRYG8 fH8cKYCJ+X9kazOYqwpRviQag6QOUVVW4pWUFxmYyrFbedtFuFQFf6lCGVPKsVcEonoq PqnRN+iqwS3rWhr4QvHccIloB16BQlhydDsiOVcl+TdsWx0wrso1DZV9AkaqyoyE1V7O s886J7AJ9w284MsOjnVhODVPa0PcrfI2LUay4wJ9MKHsOoLWxQCiuI64weZp5CRYJQio 8hTg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=pUbUeT+XpUC+KLnTvlmVwDA9a7KhEVL+2GaV9kwCOR4=; b=z+/806PuuLWSSARuGnJ6HNCvZmctX3yRZmtrQAWNI/jihEDfv5cMRPm4aaa0pF07b0 JA0Dk7aT2Luq55NcnVpWfe2zsm0mh0cinaMfMeSqDbOhRqinJVk92YlX79ER5D7pOqgx elFPVaezfS7NJS2khrJ3MZfvq0YQJy37s/w6e+HSxGVugfnespyzYDBtKp2mPInQZmXR MB2x2EKznywiEA5SFHV4ldneG3ClOaqqS7pa7R7ChEOoLB3C7W0zuEXGthaRbS00NBNW p7N0uCw9fGdi+ODdgR2+2vMu2cdbBdwivevYjGlpA8xQVhPpDcQZsQsyAAiK69omLJ4Z 0TmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=eAhmr9yW; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l15-20020a170906644f00b00771d781fb88si16596463ejn.411.2022.10.21.06.07.07; Fri, 21 Oct 2022 06:07:41 -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=@kernel.org header.s=k20201202 header.b=eAhmr9yW; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230085AbiJUNGN (ORCPT + 99 others); Fri, 21 Oct 2022 09:06:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44870 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229854AbiJUNGK (ORCPT ); Fri, 21 Oct 2022 09:06:10 -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 0779E4E854; Fri, 21 Oct 2022 06:06:09 -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 99EB761D11; Fri, 21 Oct 2022 13:06:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 251D1C43470; Fri, 21 Oct 2022 13:06:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357568; bh=tc1RUm4guOoZTsO0VdPQH+XnxC1sMtsO6DtotD5Lcrw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eAhmr9yWeS0wVEiVIgOWu1jlRYjG0WT5NB1ecC/uQxCrIfhjwPSsIUbf/tXfO3unE e0r32nDpuAZBm2Lop8vuIwFPI1Vu4ZtCzZErW16ygMxndEcmdWUD7xcbH8+RSOuWHB vbjv+2g0BW9bN052u7XJGnXbsFjzt8s1pPgNSITv5ezyP38rqsZ6oXhh9bQNyhEWvq /8aPUz2dUVAIjZ+JRXPCcyyTRgRJXyH/34pvoqmRLDbFcyfY4rwRbPoXR7Di581w/6 9p67AFlGaMiVsx5GqUjXNpFTm/3/gRaX+eu2ibO8xgOw+GSqs6BrjwgqwBPpxd/4Bq kc+5i0Af2xq7A== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org Subject: [PATCH v8 1/8] fs: uninline inode_query_iversion Date: Fri, 21 Oct 2022 09:05:55 -0400 Message-Id: <20221021130602.99099-2-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302650565553800?= X-GMAIL-MSGID: =?utf-8?q?1747302650565553800?= Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/libfs.c | 36 ++++++++++++++++++++++++++++++++++++ include/linux/iversion.h | 38 ++------------------------------------ 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/fs/libfs.c b/fs/libfs.c index 682d56345a1c..5ae81466a422 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -1566,3 +1566,39 @@ bool inode_maybe_inc_iversion(struct inode *inode, bool force) return true; } EXPORT_SYMBOL(inode_maybe_inc_iversion); + +/** + * inode_query_iversion - read i_version for later use + * @inode: inode from which i_version should be read + * + * Read the inode i_version counter. This should be used by callers that wish + * to store the returned i_version for later comparison. This will guarantee + * that a later query of the i_version will result in a different value if + * anything has changed. + * + * In this implementation, we fetch the current value, set the QUERIED flag and + * then try to swap it into place with a cmpxchg, if it wasn't already set. If + * that fails, we try again with the newly fetched value from the cmpxchg. + */ +u64 inode_query_iversion(struct inode *inode) +{ + u64 cur, new; + + cur = inode_peek_iversion_raw(inode); + do { + /* If flag is already set, then no need to swap */ + if (cur & I_VERSION_QUERIED) { + /* + * This barrier (and the implicit barrier in the + * cmpxchg below) pairs with the barrier in + * inode_maybe_inc_iversion(). + */ + smp_mb(); + break; + } + + new = cur | I_VERSION_QUERIED; + } while (!atomic64_try_cmpxchg(&inode->i_version, &cur, new)); + return cur >> I_VERSION_QUERIED_SHIFT; +} +EXPORT_SYMBOL(inode_query_iversion); diff --git a/include/linux/iversion.h b/include/linux/iversion.h index e27bd4f55d84..6755d8b4f20b 100644 --- a/include/linux/iversion.h +++ b/include/linux/iversion.h @@ -234,42 +234,6 @@ inode_peek_iversion(const struct inode *inode) return inode_peek_iversion_raw(inode) >> I_VERSION_QUERIED_SHIFT; } -/** - * inode_query_iversion - read i_version for later use - * @inode: inode from which i_version should be read - * - * Read the inode i_version counter. This should be used by callers that wish - * to store the returned i_version for later comparison. This will guarantee - * that a later query of the i_version will result in a different value if - * anything has changed. - * - * In this implementation, we fetch the current value, set the QUERIED flag and - * then try to swap it into place with a cmpxchg, if it wasn't already set. If - * that fails, we try again with the newly fetched value from the cmpxchg. - */ -static inline u64 -inode_query_iversion(struct inode *inode) -{ - u64 cur, new; - - cur = inode_peek_iversion_raw(inode); - do { - /* If flag is already set, then no need to swap */ - if (cur & I_VERSION_QUERIED) { - /* - * This barrier (and the implicit barrier in the - * cmpxchg below) pairs with the barrier in - * inode_maybe_inc_iversion(). - */ - smp_mb(); - break; - } - - new = cur | I_VERSION_QUERIED; - } while (!atomic64_try_cmpxchg(&inode->i_version, &cur, new)); - return cur >> I_VERSION_QUERIED_SHIFT; -} - /* * For filesystems without any sort of change attribute, the best we can * do is fake one up from the ctime: @@ -283,6 +247,8 @@ static inline u64 time_to_chattr(struct timespec64 *t) return chattr; } +u64 inode_query_iversion(struct inode *inode); + /** * inode_eq_iversion_raw - check whether the raw i_version counter has changed * @inode: inode to check From patchwork Fri Oct 21 13:05:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6688 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp687428wrr; Fri, 21 Oct 2022 06:07:49 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7y45ajzrtOsUoOnOLLIR87SGQKOq/RvwxaoJCEJAkGglFgrT50aV9Klb/r4rrGaZYiP5ES X-Received: by 2002:a05:6402:f94:b0:459:42d7:ea9a with SMTP id eh20-20020a0564020f9400b0045942d7ea9amr16862449edb.392.1666357669068; Fri, 21 Oct 2022 06:07:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357669; cv=none; d=google.com; s=arc-20160816; b=N8P/LmPXXpVvx4uza8WaBv1gUpU8uVeENNf4RxOoUV5lyHe9hZstnLjeT0i61U8YZJ dfAFS/7HebEX9U29h+vdrd9REu5MhCCp6wV9kLV5CpKjRakrOoXp/x9O8H1ZL3ws19mH hZkaQkCekh1aSZIUWKN3gZjcrcagqzNsBgFP6xxk4Urqwq8u/cof4aJ55At4LxyaqpJV GFVFglA8Xrd7iFW0KrAE4gn1g0kXBZWcrrRvs2/UkPdEdi/HphFYY8EU+l+gW4YRyKYo X1cNDA5YE50k1Ldfxzsw1HoFJb/36Gr4UjH9rpFAERz+WGuWRJbAFLO3CpSNv8s38/En NKBA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=KMRPUnRgQYJmghUIzLTcJ7lL8V9O58P6UhfIuR3wWsA=; b=YKvY2yG6Tr2KjcLZTCrP/ol2POnbyF0h0SYtfE9+/pVyNis0HJBakjVMfbLenkdeP7 zme3ffxdZ3qEpCLLAM+jhEy3MThVyhpi7AYNAO0Fnxf23DdPprwC8mM7hdUWjVgWlOn0 8l818CwVoUmHG/+TgPo9UWAcQQS/vW1UcRYxyFKurwyii/J/HwPM3CFnCh6DDduO479c s5suKbLhNpFz5+TJ/iMmtiLmK/6NbbwNebDGRLyPB6owP7YdmCN2zGd01hjgqAwvzeqf VoWgyWul6oSJkQ2VMsydggd1Ll6j7efzH+v9EE9uR1ZBsC671qzReji5PnM0ck/IjFi7 AskA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Nb7Yh47R; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l1-20020a1709067d4100b00782c1d273cbsi18129051ejp.392.2022.10.21.06.07.10; Fri, 21 Oct 2022 06:07:49 -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=@kernel.org header.s=k20201202 header.b=Nb7Yh47R; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230107AbiJUNGc (ORCPT + 99 others); Fri, 21 Oct 2022 09:06:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44936 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229854AbiJUNGP (ORCPT ); Fri, 21 Oct 2022 09:06:15 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F22E44E854; Fri, 21 Oct 2022 06:06:12 -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 ams.source.kernel.org (Postfix) with ESMTPS id 991ACB82BFD; Fri, 21 Oct 2022 13:06:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4ECF9C433B5; Fri, 21 Oct 2022 13:06:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357570; bh=3UkiypkQG9xLfg+hS+eOV/U1/Tn/AJ7lMyTpKN5KYY4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Nb7Yh47R45XqPtLKFsPoNljbrgHogii3eyJeQw8kYHjoaipnHpNizFXrsizMdjF+r PHs6urb8gnEaX6lrsQW9gE0F2HD99LWIL8nSL1J4uJAXnFtycQJ/32stK0OrJpeRq0 B3mEuntmnKKVKzBO7dC2b6RvaN2SHnSq4CGRVkcuMRHj0nL6p/NSeOTo35Lfog2xra DCIaG2PVYQsS177hQeS57Z/8fw+VgslZwMLCR+MrcbqfRFZ6QzoXM6WJk2x1ulJG1W 0Xl/0GfnwBEsjS/fhLgjWLg4EtHypRr2ix40fu2N5gbUexGEr+A0LI0o/nF3U+UBgB nGToooWNgVthg== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org, Colin Walters Subject: [PATCH v8 2/8] fs: clarify when the i_version counter must be updated Date: Fri, 21 Oct 2022 09:05:56 -0400 Message-Id: <20221021130602.99099-3-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302659130642094?= X-GMAIL-MSGID: =?utf-8?q?1747302659130642094?= The i_version field in the kernel has had different semantics over the decades, but NFSv4 has certain expectations. Update the comments in iversion.h to describe when the i_version must change. Cc: Colin Walters Cc: NeilBrown Cc: Trond Myklebust Cc: Dave Chinner Signed-off-by: Jeff Layton --- include/linux/iversion.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/include/linux/iversion.h b/include/linux/iversion.h index 6755d8b4f20b..94f4dc620d01 100644 --- a/include/linux/iversion.h +++ b/include/linux/iversion.h @@ -9,8 +9,24 @@ * --------------------------- * The change attribute (i_version) is mandated by NFSv4 and is mostly for * knfsd, but is also used for other purposes (e.g. IMA). The i_version must - * appear different to observers if there was a change to the inode's data or - * metadata since it was last queried. + * appear larger to observers if there was an explicit change to the inode's + * data or metadata since it was last queried. + * + * An explicit change is one that would ordinarily result in a change to the + * inode status change time (aka ctime). i_version must appear to change, even + * if the ctime does not (since the whole point is to avoid missing updates due + * to timestamp granularity). If POSIX mandates that the ctime must change due + * to an operation, then the i_version counter must be incremented as well. + * + * Making the i_version update completely atomic with the operation itself would + * be prohibitively expensive. Traditionally the kernel has updated the times on + * directories after an operation that changes its contents. For regular files, + * the ctime is usually updated before the data is copied into the cache for a + * write. This means that there is a window of time when an observer can + * associate a new timestamp with old file contents. Since the purpose of the + * i_version is to allow for better cache coherency, the i_version must always + * be updated after the results of the operation are visible. Updating it before + * and after a change is also permitted. * * Observers see the i_version as a 64-bit number that never decreases. If it * remains the same since it was last checked, then nothing has changed in the From patchwork Fri Oct 21 13:05:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6689 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp687671wrr; Fri, 21 Oct 2022 06:08:13 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5NCAnFG9KzXOveeXcL8fAd9diyKAHBKZCVJwxmi5DLMOCWOOnNTBUe1EUx2Vlz442gsogf X-Received: by 2002:a17:907:6d23:b0:78d:8f0f:1266 with SMTP id sa35-20020a1709076d2300b0078d8f0f1266mr15692285ejc.762.1666357692742; Fri, 21 Oct 2022 06:08:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357692; cv=none; d=google.com; s=arc-20160816; b=ipacO5euViWmXOjoOO5WZ/sKlw3Sf/A/QEPJwZ88idhp3JVFF+9JEzDIeY03rXm43X Oli5fXYxFppNa6qNFs0tL0nDDBlnHSVaX1RHf1+TZXleNOjUj5+/XDx1Oe+qG8qm4aXl qLB1p2GQynANDBdUrqUq6x0RrCIQ+HT42SNK9ZAQcpMv7N7VfUyxknYLaceOCHMj4rES /JPPE2PVMU0LVyE26qbGxQy0mmDjeTZB50SlTyyRr7jNFQpN9ujRzEgBIgS6DtxMpgnq oBI3589Ut1hq1Nr1itpWwD22NXjmksoGsQKWWWfAg+2gKcpii7P/ENzOW5PvXvoBUv7N kKBw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=UvOblGpDrmLx0EfPNplJNpZ/1YRfiC36VUJ5Xo7htPY=; b=VpThvByaetawtPMDIFWVsWTXI8wAoWUAag0Ngdt+OltmD1jTjXLCcxRxvAiijAd4A6 Yxa9wz+47AqwLbdUT1v1PTd+OL1OPLSKsRROkaMwHqNWSRehvgkClV3zD2e4AEmpf49E tXjZhZ3HGRaNh+t7M2F2m9IDWOQp51HTEX8wso8RYq6fqJ1d3F87ON3vvHgZSHf+yyBR s/vwsvOXdNi1ApwTPkhVhYGcZoWOxZgS5yuqNiiokB8UzJQ8/cfQXL7yZ41uRIYLWuSA Pn3k4+3VRi46JWKVkwOoHBUNUthxmfMgXpAAhzwFDjDYm2PPNFUPk5m88/vThsm4G7L3 IqRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=h9mbxrDi; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dm3-20020a170907948300b007807e613e5bsi17754931ejc.933.2022.10.21.06.07.35; Fri, 21 Oct 2022 06:08:12 -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=@kernel.org header.s=k20201202 header.b=h9mbxrDi; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230187AbiJUNGi (ORCPT + 99 others); Fri, 21 Oct 2022 09:06:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44948 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230093AbiJUNGQ (ORCPT ); Fri, 21 Oct 2022 09:06:16 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37FCD26B4B6; Fri, 21 Oct 2022 06:06:15 -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 ams.source.kernel.org (Postfix) with ESMTPS id DD05BB80C98; Fri, 21 Oct 2022 13:06:13 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8CA75C433D6; Fri, 21 Oct 2022 13:06:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357572; bh=HgePQpANeCyNlHouoSiNjOumB4QLppVOqg1bfK18//Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h9mbxrDiIYcO5M594qgki/ibDkOhScW1YhL3UPYCtHT9f8bCwJB8HCFDKdVUKC6wZ 6R0yel5DiglAUUcuypMfskj4I2Dnsz1Qy8q6Q0at8S8blOCfyYKgNLgvI+7HXh3MFN H8+z2wt25heOIhj7XLCQ4eIWO0hi/F1Ou++t2wk3HuueTb4crdcgIuEqy1YiWr6wte yhRSRrpLky8tlchsXPF0Emje/Gq97Dd8G2TojEbb9qM+k0IIXqbo+ksGyHATZo0ySV woTfZv5gdVrUSVlcW5Y1dwhknZhgwxeu1QYwc5eOiJNfeg+KaYQrOZ9o7pQT02mBPn RWddg7Kx8PrLw== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org, Jeff Layton Subject: [PATCH v8 3/8] vfs: plumb i_version handling into struct kstat Date: Fri, 21 Oct 2022 09:05:57 -0400 Message-Id: <20221021130602.99099-4-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302683993186842?= X-GMAIL-MSGID: =?utf-8?q?1747302683993186842?= From: Jeff Layton The NFS server has a lot of special handling for different types of change attribute access, depending on the underlying filesystem. In most cases, it's doing a getattr anyway and then fetching that value after the fact. Rather that do that, add a new STATX_CHANGE_COOKIE flag that is a kernel-only symbol (for now). If requested and getattr can implement it, it can fill out this field. For IS_I_VERSION inodes, add a generic implementation in vfs_getattr_nosec. Take care to mask STATX_CHANGE_COOKIE off in requests from userland and in the result mask. Since not all filesystems can give the same guarantees of monotonicity, claim a STATX_ATTR_CHANGE_MONOTONIC flag that filesystems can set to indicate that they offer an i_version value that can never go backward. Eventually if we decide to make the i_version available to userland, we can just designate a field for it in struct statx, and move the STATX_CHANGE_COOKIE definition to the uapi header. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/stat.c | 17 +++++++++++++++-- include/linux/stat.h | 9 +++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/fs/stat.c b/fs/stat.c index ef50573c72a2..06fd3fc1ab84 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -119,6 +120,11 @@ int vfs_getattr_nosec(const struct path *path, struct kstat *stat, stat->attributes_mask |= (STATX_ATTR_AUTOMOUNT | STATX_ATTR_DAX); + if ((request_mask & STATX_CHANGE_COOKIE) && IS_I_VERSION(inode)) { + stat->result_mask |= STATX_CHANGE_COOKIE; + stat->change_cookie = inode_query_iversion(inode); + } + mnt_userns = mnt_user_ns(path->mnt); if (inode->i_op->getattr) return inode->i_op->getattr(mnt_userns, path, stat, @@ -599,9 +605,11 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer) memset(&tmp, 0, sizeof(tmp)); - tmp.stx_mask = stat->result_mask; + /* STATX_CHANGE_COOKIE is kernel-only for now */ + tmp.stx_mask = stat->result_mask & ~STATX_CHANGE_COOKIE; tmp.stx_blksize = stat->blksize; - tmp.stx_attributes = stat->attributes; + /* STATX_ATTR_CHANGE_MONOTONIC is kernel-only for now */ + tmp.stx_attributes = stat->attributes & ~STATX_ATTR_CHANGE_MONOTONIC; tmp.stx_nlink = stat->nlink; tmp.stx_uid = from_kuid_munged(current_user_ns(), stat->uid); tmp.stx_gid = from_kgid_munged(current_user_ns(), stat->gid); @@ -640,6 +648,11 @@ int do_statx(int dfd, struct filename *filename, unsigned int flags, if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE) return -EINVAL; + /* STATX_CHANGE_COOKIE is kernel-only for now. Ignore requests + * from userland. + */ + mask &= ~STATX_CHANGE_COOKIE; + error = vfs_statx(dfd, filename, flags, &stat, mask); if (error) return error; diff --git a/include/linux/stat.h b/include/linux/stat.h index ff277ced50e9..52150570d37a 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -52,6 +52,15 @@ struct kstat { u64 mnt_id; u32 dio_mem_align; u32 dio_offset_align; + u64 change_cookie; }; +/* These definitions are internal to the kernel for now. Mainly used by nfsd. */ + +/* mask values */ +#define STATX_CHANGE_COOKIE 0x40000000U /* Want/got stx_change_attr */ + +/* file attribute values */ +#define STATX_ATTR_CHANGE_MONOTONIC 0x8000000000000000ULL /* version monotonically increases */ + #endif From patchwork Fri Oct 21 13:05:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6690 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp687944wrr; Fri, 21 Oct 2022 06:08:42 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5wT7w6UHLEJyxFVFhK2WAIN8SSO2nmoT/gnj/ziRkQhMKlIAAwd43xihgQ9bKzHr56WaDR X-Received: by 2002:a17:906:58c7:b0:722:f4bf:cb75 with SMTP id e7-20020a17090658c700b00722f4bfcb75mr15323383ejs.450.1666357711828; Fri, 21 Oct 2022 06:08:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357711; cv=none; d=google.com; s=arc-20160816; b=Frg3qyjyCoF1EzhMrLVKYpTsN24CJYtsbm2vpitRXZw5cWssfSAXwGmG7DuIOX7moO 5cf5/T/288Y5JrqRqEeq2NeU1YAxIAGYDOGTzzsYY/91tvv4kha+hW0uslfIIDJKI+OH S4NlOS8KaWI1ZZnEi4YdM/i2iTmdlGrdnqEpl89955S7GvLFpVdvxrDz/mX3Kx3mgLvt tsqYUK+DZc7buu5cjDtb5tkWOd+O/7gFWjhatCtZEDt690tMpJtp/kqkG/SXZPvEiaug NSBrMSF8hmtsTOrUMiOEUL/JUMo8EmThf9OYB63MQuAMbinzX4FFWUrbQomua7CKZVFt 0/BA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=lXWjZoen5G7jH0ElhsuQu/2yrT/4625ofYIDG+lsxjQ=; b=zMZstfIuey8H9mRSmKtnONA+bSbu0n/xOsDD7+ZgpgmVbRRVLA4J4U/mqJddJjo2MG zkPLelhqCoFvzCpHlhAX6fkWowDY1Y7sCzN155oGLbNhqh5aZ9LrUj8DqlBBkydpBlkg P4KleDUAFTk6pP9RM59TJyOgz/8EIKen4cboGrKWkpzTHuXCM76I1xlR78EWblmZlfdM VD/SmeBpa7JvJH160f0ImJXESTXenuOtTi8tijfEtoErTkC9H4Jju2KBeJYlM9jMe3O3 NF9sb7VGXPQ/vyOYvUTFlXg12zBygrBSnM1jDDvWnl7rEy8Ve3hBESTIdySltTn8O1ez 9M+g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=hsLE0fMH; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gs41-20020a1709072d2900b0078e030224fdsi22867685ejc.768.2022.10.21.06.07.48; Fri, 21 Oct 2022 06:08:31 -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=@kernel.org header.s=k20201202 header.b=hsLE0fMH; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230132AbiJUNGu (ORCPT + 99 others); Fri, 21 Oct 2022 09:06:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230111AbiJUNGX (ORCPT ); Fri, 21 Oct 2022 09:06:23 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8481426CDC5; Fri, 21 Oct 2022 06:06:17 -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 ams.source.kernel.org (Postfix) with ESMTPS id E96DEB82BCD; Fri, 21 Oct 2022 13:06:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA703C433D7; Fri, 21 Oct 2022 13:06:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357574; bh=UIL2cdGHjlT4RFj+Zgh2BsP14ice/GgwMMKCqzmvxBw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hsLE0fMHuJHPV6jz4Jziq/1iKtp4QV0jMIKjsH2Fz39fKLYKNvUrT4tAb7kgIxVeL SABL1AjbgKF5nDj3REqecr/dsLjjHRo8gDEioYaGR/moQ7nfQDH/YjJWZMu0nj1+su waaqxNgnmTafxvGCW4llU47U1OyTG5dfzyVWMGiF5c6GQ56/3f4ijCuSJL25jq4mSa VQnhkUyk+66LRvO82fjULKBIpFMFh9hN4rnI9S5bksB3mrMj5ogLbV5WWUyvsCXmiR djAuad9OAO2t+J1WicuSzVZPCDaa6r/NiswX76H/tpHQvsQ4t/EmXBB+Mh+VtWjURt 3OsND8of17C1Q== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org Subject: [PATCH v8 4/8] nfs: report the inode version in getattr if requested Date: Fri, 21 Oct 2022 09:05:58 -0400 Message-Id: <20221021130602.99099-5-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302703619894800?= X-GMAIL-MSGID: =?utf-8?q?1747302703619894800?= Allow NFS to report the i_version in getattr requests. Since the cost to fetch it is relatively cheap, do it unconditionally and just set the flag if it looks like it's valid. Also, conditionally enable the MONOTONIC flag when the server reports its change attr type as such. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/nfs/inode.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 6b2cfa59a1a2..f70f11df1ee0 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -825,6 +825,8 @@ static u32 nfs_get_valid_attrmask(struct inode *inode) reply_mask |= STATX_UID | STATX_GID; if (!(cache_validity & NFS_INO_INVALID_BLOCKS)) reply_mask |= STATX_BLOCKS; + if (!(cache_validity & NFS_INO_INVALID_CHANGE)) + reply_mask |= STATX_CHANGE_COOKIE; return reply_mask; } @@ -843,7 +845,8 @@ int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path, request_mask &= STATX_TYPE | STATX_MODE | STATX_NLINK | STATX_UID | STATX_GID | STATX_ATIME | STATX_MTIME | STATX_CTIME | - STATX_INO | STATX_SIZE | STATX_BLOCKS; + STATX_INO | STATX_SIZE | STATX_BLOCKS | STATX_BTIME | + STATX_CHANGE_COOKIE; if ((query_flags & AT_STATX_DONT_SYNC) && !force_sync) { if (readdirplus_enabled) @@ -851,8 +854,8 @@ int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path, goto out_no_revalidate; } - /* Flush out writes to the server in order to update c/mtime. */ - if ((request_mask & (STATX_CTIME | STATX_MTIME)) && + /* Flush out writes to the server in order to update c/mtime/version. */ + if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_CHANGE_COOKIE)) && S_ISREG(inode->i_mode)) filemap_write_and_wait(inode->i_mapping); @@ -872,7 +875,8 @@ int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path, /* Is the user requesting attributes that might need revalidation? */ if (!(request_mask & (STATX_MODE|STATX_NLINK|STATX_ATIME|STATX_CTIME| STATX_MTIME|STATX_UID|STATX_GID| - STATX_SIZE|STATX_BLOCKS))) + STATX_SIZE|STATX_BLOCKS| + STATX_CHANGE_COOKIE))) goto out_no_revalidate; /* Check whether the cached attributes are stale */ @@ -910,6 +914,10 @@ int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path, generic_fillattr(&init_user_ns, inode, stat); stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode)); + stat->change_cookie = inode_peek_iversion_raw(inode); + stat->attributes_mask |= STATX_ATTR_CHANGE_MONOTONIC; + if (server->change_attr_type != NFS4_CHANGE_TYPE_IS_UNDEFINED) + stat->attributes |= STATX_ATTR_CHANGE_MONOTONIC; if (S_ISDIR(inode->i_mode)) stat->blksize = NFS_SERVER(inode)->dtsize; out: From patchwork Fri Oct 21 13:05:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6691 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp688193wrr; Fri, 21 Oct 2022 06:09:07 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4EYisCE1V0UWDNmONWlDl1+MuHnoyQ7k2O+XVhs8CIRUrlCKDOjhVXmTTBBY6PxOuqidrS X-Received: by 2002:a17:907:728a:b0:78d:2b4b:e7f7 with SMTP id dt10-20020a170907728a00b0078d2b4be7f7mr15278669ejc.269.1666357746854; Fri, 21 Oct 2022 06:09:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357746; cv=none; d=google.com; s=arc-20160816; b=tQIs7I24FBxMPVsAi9LztmRvjX5V6cFaSW/qFfGJRt7KCtMUujnke2EcWvcdLkZyoE ZLkPA5g9Vk9G+ijBbEDgLRY9r/rEcVpqbfOo25isdPF61v5+9YRYQOupWofBy755cGjh nIbHeRktyMvg1aYd0jrvFAeWkQi6KSnVqH7B/KuFLVZmOBxGBj/JlqLFJtr/2mpanzgj C+60pXTnny9CzZCfDOC6aWTCWroMbdDpm0hsaHvUGmpiYNKBWU8+squcyIFmMCuBstii f4dSreJBg0p6SsC4pbZCHKV+3uV37T5iCv3lT3znwLs/z58o5s/3gA1SGTIIed2z6Cmv 4fmw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=aH7cbdypMwfgwjlgLga5hssa6XRGgN/W4LC6PxsxaYE=; b=lvuzKcJbE5hiPOmk0Z8v4DbsIdXu78ZwgWblNMslFQzMHTdKibIeMWkwXgrbllvORM KfdJQcjky0twJ9P53vVoGuc9+k8DJHGZu5s1+cYdlmuXYynuT5/6dx+k5oDL7CGpGYel 3oQLDKlhklcoT6gWloWRKyiNUkg1/R3E82Uyb7Qru+N4YEg3GqOUWq9H2hBdKAUTdFfO ljanPHtsa8CmHQxx8u0qztp30fF/SuuAUpcGv5zv0z5Zp2C/NPH3zLsMjQqkVE2SqJNl P3lq4k4WVxtbPW5Hi2NfRMumtuiDUh2cdXcPs6MCphZshoxRh9N5x+wEKA+o9+ddc9QT oSsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=sOHJ0lyD; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id sc11-20020a1709078a0b00b0078d8db64fffsi19449973ejc.20.2022.10.21.06.08.42; Fri, 21 Oct 2022 06:09:06 -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=@kernel.org header.s=k20201202 header.b=sOHJ0lyD; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230142AbiJUNHE (ORCPT + 99 others); Fri, 21 Oct 2022 09:07:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45152 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230124AbiJUNGX (ORCPT ); Fri, 21 Oct 2022 09:06:23 -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 5784F26B4BE; Fri, 21 Oct 2022 06:06:18 -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 7DE8D61E9D; Fri, 21 Oct 2022 13:06:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 044E4C433D6; Fri, 21 Oct 2022 13:06:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357576; bh=XTCQklTYch506fsKvxW5ImA5FCnKyk22+LeCOXARq2w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sOHJ0lyDnodI/pMdW/riO8Mlc7c3TXOUu3cVbHVd0S3sDMkrwQL3useK0XlgQZlSz O0wVWgujInzFgk7f2U+CS93aXxC9Ut4leanCI4L9eyimSUvz/BOrPpxbJ34njq1PJq +jjzkL/YehSxS2O/hgAG0+e+x0uPY/EPCwAme6V1t8tG/L6LtoREMaRXtw59nOYDnz xB6wzbZ62nsMC04zkIlU2EnGtMUQWguL7aBZt8sxvD+L4IfT93F8RkTd8OrpXEEZcY o2e4qO1gm2ecMPUFdp7NQVspCgHEl+eypbf9GaKDBTr6G7zmrTR73aLKp7mTazsJ7R XQH/Jr8JywX0A== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org Subject: [PATCH v8 5/8] ceph: report the inode version in getattr if requested Date: Fri, 21 Oct 2022 09:05:59 -0400 Message-Id: <20221021130602.99099-6-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302740743174557?= X-GMAIL-MSGID: =?utf-8?q?1747302740743174557?= When getattr requests the STX_CHANGE_COOKIE, request the full gamut of caps (similarly to how ctime is handled). When the change attribute seems to be valid, return it in the change_cookie field and set the flag in the reply mask. Also, unconditionally enable STATX_ATTR_CHANGE_MONOTONIC. Reviewed-by: Xiubo Li Signed-off-by: Jeff Layton --- fs/ceph/inode.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 4af5e55abc15..0e2e6ca399a9 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -2417,10 +2417,10 @@ static int statx_to_caps(u32 want, umode_t mode) { int mask = 0; - if (want & (STATX_MODE|STATX_UID|STATX_GID|STATX_CTIME|STATX_BTIME)) + if (want & (STATX_MODE|STATX_UID|STATX_GID|STATX_CTIME|STATX_BTIME|STATX_CHANGE_COOKIE)) mask |= CEPH_CAP_AUTH_SHARED; - if (want & (STATX_NLINK|STATX_CTIME)) { + if (want & (STATX_NLINK|STATX_CTIME|STATX_CHANGE_COOKIE)) { /* * The link count for directories depends on inode->i_subdirs, * and that is only updated when Fs caps are held. @@ -2431,11 +2431,10 @@ static int statx_to_caps(u32 want, umode_t mode) mask |= CEPH_CAP_LINK_SHARED; } - if (want & (STATX_ATIME|STATX_MTIME|STATX_CTIME|STATX_SIZE| - STATX_BLOCKS)) + if (want & (STATX_ATIME|STATX_MTIME|STATX_CTIME|STATX_SIZE|STATX_BLOCKS|STATX_CHANGE_COOKIE)) mask |= CEPH_CAP_FILE_SHARED; - if (want & (STATX_CTIME)) + if (want & (STATX_CTIME|STATX_CHANGE_COOKIE)) mask |= CEPH_CAP_XATTR_SHARED; return mask; @@ -2478,6 +2477,11 @@ int ceph_getattr(struct user_namespace *mnt_userns, const struct path *path, valid_mask |= STATX_BTIME; } + if (request_mask & STATX_CHANGE_COOKIE) { + stat->change_cookie = inode_peek_iversion_raw(inode); + valid_mask |= STATX_CHANGE_COOKIE; + } + if (ceph_snap(inode) == CEPH_NOSNAP) stat->dev = sb->s_dev; else @@ -2519,6 +2523,8 @@ int ceph_getattr(struct user_namespace *mnt_userns, const struct path *path, stat->nlink = 1 + 1 + ci->i_subdirs; } + stat->attributes_mask |= STATX_ATTR_CHANGE_MONOTONIC; + stat->attributes |= STATX_ATTR_CHANGE_MONOTONIC; stat->result_mask = request_mask & valid_mask; return err; } From patchwork Fri Oct 21 13:06:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6693 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp688613wrr; Fri, 21 Oct 2022 06:09:53 -0700 (PDT) X-Google-Smtp-Source: AMsMyM54cemSiE0xxSdpCooYJTFbSpCMlwD1plS3eloWeR+UTq2PD1srGQlzelOnd/5TKtIL4wen X-Received: by 2002:a17:907:c25:b0:78e:1a4:132 with SMTP id ga37-20020a1709070c2500b0078e01a40132mr15583645ejc.521.1666357793471; Fri, 21 Oct 2022 06:09:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357793; cv=none; d=google.com; s=arc-20160816; b=X6obAlr6p2WbTrctaiqP91drElzpD/LaJ6qHuYFoPLsGEXTl7vUyVm+g31pM2iykUw c69VALD/QWxM26atylwL/oo0Q39hiJhOaozkT8mweSrUaB+PlSN8Ls9wGxZap56gyIxh w/ZQV7UwdjGePt00UtBTQb0kJXweq9u1V6iLD/9fLFC4/JV53IvLI8xon1Ygr1Uro1JI 4Oveyq54QsbOiwTEH4DoFls1O2ZsjholrG9ogPs/hY9mdP2kAXD3Sa/Dke0sBJYPvqvX PNDl/IAWoLiBDGPjkLk/zlV3A3/pfwL9eo1ktNWRdioMT3Nzl+Sl3pz+5T4vaN2Mxg/m a3Uw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZsL6rLEb0UF2ncO40TIN5Bu/cFZuE7FVkpR01PQr7Dk=; b=MeHlTYhT58xi5Ls1JAJA1MHRXsbj5HPh0mtktETLypE8Yz5fF74zBOwob/5JJZveAP Kb4CFzVFez74k6y28Q37+jzCycFAezjHP7kBKkPo15q1ei4Btf9ykFPaynwhmEsY5B6w fMC2NwaOLwGAT5AJiTCgPFWYJcQx2oqi3pOteGl3GsydzX3vF2CnnMYFhEmwlHRt4yKC kv/dhPTWW1asGGuM750Jp3LLuYrmWGeldWeUlhYhPBz8RU9d0I1l2rR6N9JbSJGK4pdP /X9LydYaLFvxFRCA/k+1sBA35+aljgOEiY43+aXlJE/covavOD3As6yX3AVachwLELH+ 1xvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=pAkgaXyi; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y19-20020a056402271300b0045d9a3adf19si14781992edd.564.2022.10.21.06.09.27; Fri, 21 Oct 2022 06:09:53 -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=@kernel.org header.s=k20201202 header.b=pAkgaXyi; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230293AbiJUNHL (ORCPT + 99 others); Fri, 21 Oct 2022 09:07:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230144AbiJUNGZ (ORCPT ); Fri, 21 Oct 2022 09:06:25 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 224C826CDE6; Fri, 21 Oct 2022 06:06:20 -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 A93F161EA3; Fri, 21 Oct 2022 13:06:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2ED38C43470; Fri, 21 Oct 2022 13:06:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357579; bh=LBaEFSh5DOeyzDGsOyxhMwQpssm5JK6u2HESg5ybNII=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pAkgaXyiv8pAQmQv5zw0PS1FBjghpTjn/+TC5F1qoVrIhLFKWhVZhkykR9YVZDftb 0gvUciPyF8NPSjTQoDmZzrpREJvKzc3SEH0D94VojrUhWRJAPYDt7BkZ92qmUm2YV1 HNU03eZI2/8YPtlqegsQcDdM/eWg1nealcAZHLzfm4oPfXqs0Nw0mZ++2Jmm6QmYBb NUMWmb3sJLfEKoBlTN/vsVY/71rC4StDmuft8LwpOWTMO7YIfORfEW3Q4yGBnMEpj6 u/+aMApkoVUwyk6JCZ1dq1yaexLhZP0AOc0Shj9z1encZN2QKLppMJt/+IrfH2fslP y15IEoy/SuYLw== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org Subject: [PATCH v8 6/8] nfsd: move nfsd4_change_attribute to nfsfh.c Date: Fri, 21 Oct 2022 09:06:00 -0400 Message-Id: <20221021130602.99099-7-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302789847293387?= X-GMAIL-MSGID: =?utf-8?q?1747302789847293387?= This is a pretty big function for inlining. Move it to being non-inlined. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/nfsd/nfsfh.c | 27 +++++++++++++++++++++++++++ fs/nfsd/nfsfh.h | 29 +---------------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index d73434200df9..7030d9209903 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -748,3 +748,30 @@ enum fsid_source fsid_source(const struct svc_fh *fhp) return FSIDSOURCE_UUID; return FSIDSOURCE_DEV; } + +/* + * We could use i_version alone as the change attribute. However, + * i_version can go backwards after a reboot. On its own that doesn't + * necessarily cause a problem, but if i_version goes backwards and then + * is incremented again it could reuse a value that was previously used + * before boot, and a client who queried the two values might + * incorrectly assume nothing changed. + * + * By using both ctime and the i_version counter we guarantee that as + * long as time doesn't go backwards we never reuse an old value. + */ +u64 nfsd4_change_attribute(struct kstat *stat, struct inode *inode) +{ + if (inode->i_sb->s_export_op->fetch_iversion) + return inode->i_sb->s_export_op->fetch_iversion(inode); + else if (IS_I_VERSION(inode)) { + u64 chattr; + + chattr = stat->ctime.tv_sec; + chattr <<= 30; + chattr += stat->ctime.tv_nsec; + chattr += inode_query_iversion(inode); + return chattr; + } else + return time_to_chattr(&stat->ctime); +} diff --git a/fs/nfsd/nfsfh.h b/fs/nfsd/nfsfh.h index c3ae6414fc5c..4c223a7a91d4 100644 --- a/fs/nfsd/nfsfh.h +++ b/fs/nfsd/nfsfh.h @@ -291,34 +291,7 @@ static inline void fh_clear_pre_post_attrs(struct svc_fh *fhp) fhp->fh_pre_saved = false; } -/* - * We could use i_version alone as the change attribute. However, - * i_version can go backwards after a reboot. On its own that doesn't - * necessarily cause a problem, but if i_version goes backwards and then - * is incremented again it could reuse a value that was previously used - * before boot, and a client who queried the two values might - * incorrectly assume nothing changed. - * - * By using both ctime and the i_version counter we guarantee that as - * long as time doesn't go backwards we never reuse an old value. - */ -static inline u64 nfsd4_change_attribute(struct kstat *stat, - struct inode *inode) -{ - if (inode->i_sb->s_export_op->fetch_iversion) - return inode->i_sb->s_export_op->fetch_iversion(inode); - else if (IS_I_VERSION(inode)) { - u64 chattr; - - chattr = stat->ctime.tv_sec; - chattr <<= 30; - chattr += stat->ctime.tv_nsec; - chattr += inode_query_iversion(inode); - return chattr; - } else - return time_to_chattr(&stat->ctime); -} - +u64 nfsd4_change_attribute(struct kstat *stat, struct inode *inode); extern void fh_fill_pre_attrs(struct svc_fh *fhp); extern void fh_fill_post_attrs(struct svc_fh *fhp); extern void fh_fill_both_attrs(struct svc_fh *fhp); From patchwork Fri Oct 21 13:06:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6692 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp688237wrr; Fri, 21 Oct 2022 06:09:12 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4Y71jwb5/4KmjowaUQjIuiPMDSbPwHbVfXK0rznQFMnpiff72AUooZ8B9V3xeY7kQlXudc X-Received: by 2002:a50:ff09:0:b0:456:fd61:83b3 with SMTP id a9-20020a50ff09000000b00456fd6183b3mr16844401edu.166.1666357751929; Fri, 21 Oct 2022 06:09:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357751; cv=none; d=google.com; s=arc-20160816; b=VjtNi1fCpsLYIrac3WrBAxii4vit0A2IGZWtViu/WCqSmnEzwO/Rz1TunxVxOJAUEn 8dDEwZnysYId9vm6pI0EmZijwT8Me6Q9SzBTYIbzH87ubyjU4Vnejo4p/b3rNd04kcxF rCZw24Og05k7bKMvvVezB8fglr/Q2nDt+BjBO4u9OkWynCY1xVTOfjklTnuKrWDjp0vD AO48S/8WsZ9GQ4A5n/MhgOFmEJhGY+JB4ykLNvr8NgHz3wWM6oGnaHQ5C82uRMdPG9mz Iu8k5UgQunr/8qmKXASJP4GQftsJ09VPF+opxK34RmgAXchfUykX1gF9OnF+yNuz4FjH Ocog== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=zumIDz2xEC6DxndDfywJkEW6HgIOFRO0gHfd0FkzFbQ=; b=W6z42j5fyFj1dl4Pqi0Ig6uhYJ/MD9/SVHaRrg9qDP7SOP/kzsDYNaqp7Rm3QVh4a7 638kY7Tn4fiF+HMiLhkc79nzLOWgaym0pp1Otz+65uK5V9TH7+i4iVotlMFG0xKpqPUl BCyRqDvUdjNyuEPfxvBrQ1tzOzELbxy4iFBwjJ/F9H5RK9al/KsZffWutxxVEihmsePu UGUqxskZGZQQ3P+mRIdu58XGpjDLkvI+YgOxKXeaeppWTlCAnNtojtwsC1TApGHMvAzK Ts/ck4vE2iO9e0q1qS5Nmd+LbwJuA5dueqB9QiVWEGmLJdep036KjqTzBtvW+XOwkdhf uTLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="O/xdn7ai"; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id di20-20020a170906731400b007918ad4cb70si16524843ejc.366.2022.10.21.06.08.46; Fri, 21 Oct 2022 06:09:11 -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=@kernel.org header.s=k20201202 header.b="O/xdn7ai"; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230274AbiJUNHH (ORCPT + 99 others); Fri, 21 Oct 2022 09:07:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230161AbiJUNG1 (ORCPT ); Fri, 21 Oct 2022 09:06:27 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F1E026B4BC; Fri, 21 Oct 2022 06:06:23 -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 DBEB961D11; Fri, 21 Oct 2022 13:06:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5AA3AC433C1; Fri, 21 Oct 2022 13:06:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357581; bh=o/W2G2/aFsV8kJG6gd0NpL/EXPewZKlzXLb+OuWvXdY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O/xdn7ai761Bq8YKbEtusR1eNhStdXiq4DeNtVyjL27dDvHnjkTfa/NuLCbwbdAMv zQNuZmSAAzKg2FYhKZnEfk5qNwBii0mwAfeXdchQ0Q+f83XSaGCclNd0/zAhIbmlwX gDL9lBAKlfAMLqJQ3ls/m0Onl0oodOEz9MW+ev1MR54wsIJBOuAqJkQswNfe+HzWOW 8TnJIn8ll/n3PK4WuURjGs/9L2NRayMB7g3RI0wBLwaT9oEhl1yjgKtmmuMTNYhors 3Gxek3h73fYx1bl+sfamccL3WnHB0JVtITLXeCiltyKVqvjwN2Bv7NNMsj0Ym6yRzq k0/ljrt+L8opw== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org Subject: [PATCH v8 7/8] nfsd: use the getattr operation to fetch i_version Date: Fri, 21 Oct 2022 09:06:01 -0400 Message-Id: <20221021130602.99099-8-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302746135139641?= X-GMAIL-MSGID: =?utf-8?q?1747302746135139641?= Now that we can call into vfs_getattr to get the i_version field, use that facility to fetch it instead of doing it in nfsd4_change_attribute. Neil also pointed out recently that IS_I_VERSION directory operations are always logged, and so we only need to mitigate the rollback problem on regular files. Also, we don't need to factor in the ctime when reexporting NFS or Ceph. Set the STATX_CHANGE_COOKIE (and BTIME) bits in the request when we're dealing with a v4 request. Then, instead of looking at IS_I_VERSION when generating the change attr, look at the result mask and only use it if STATX_CHANGE_COOKIE is set. Change nfsd4_change_attribute to only factor in the ctime if it's a regular file and the fs doesn't advertise STATX_ATTR_CHANGE_MONOTONIC. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/nfsd/nfs4xdr.c | 4 +++- fs/nfsd/nfsfh.c | 54 +++++++++++++++++++++++++++++++---------------- fs/nfsd/vfs.h | 7 +++++- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index bcfeb1a922c0..06eb1aa7846b 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2906,7 +2906,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, goto out; } - err = vfs_getattr(&path, &stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); + err = vfs_getattr(&path, &stat, + STATX_BASIC_STATS | STATX_BTIME | STATX_CHANGE_COOKIE, + AT_STATX_SYNC_AS_STAT); if (err) goto out_nfserr; if (!(stat.result_mask & STATX_BTIME)) diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 7030d9209903..3e09129db340 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -628,6 +628,10 @@ void fh_fill_pre_attrs(struct svc_fh *fhp) stat.mtime = inode->i_mtime; stat.ctime = inode->i_ctime; stat.size = inode->i_size; + if (v4 && IS_I_VERSION(inode)) { + stat.change_cookie = inode_query_iversion(inode); + stat.result_mask |= STATX_CHANGE_COOKIE; + } } if (v4) fhp->fh_pre_change = nfsd4_change_attribute(&stat, inode); @@ -659,6 +663,10 @@ void fh_fill_post_attrs(struct svc_fh *fhp) if (err) { fhp->fh_post_saved = false; fhp->fh_post_attr.ctime = inode->i_ctime; + if (v4 && IS_I_VERSION(inode)) { + fhp->fh_post_attr.change_cookie = inode_query_iversion(inode); + fhp->fh_post_attr.result_mask |= STATX_CHANGE_COOKIE; + } } else fhp->fh_post_saved = true; if (v4) @@ -750,28 +758,38 @@ enum fsid_source fsid_source(const struct svc_fh *fhp) } /* - * We could use i_version alone as the change attribute. However, - * i_version can go backwards after a reboot. On its own that doesn't - * necessarily cause a problem, but if i_version goes backwards and then - * is incremented again it could reuse a value that was previously used - * before boot, and a client who queried the two values might - * incorrectly assume nothing changed. + * We could use i_version alone as the change attribute. However, i_version + * can go backwards on a regular file after an unclean shutdown. On its own + * that doesn't necessarily cause a problem, but if i_version goes backwards + * and then is incremented again it could reuse a value that was previously + * used before boot, and a client who queried the two values might incorrectly + * assume nothing changed. + * + * By using both ctime and the i_version counter we guarantee that as long as + * time doesn't go backwards we never reuse an old value. If the filesystem + * advertises STATX_ATTR_CHANGE_MONOTONIC, then this mitigation is not + * needed. * - * By using both ctime and the i_version counter we guarantee that as - * long as time doesn't go backwards we never reuse an old value. + * We only need to do this for regular files as well. For directories, we + * assume that the new change attr is always logged to stable storage in some + * fashion before the results can be seen. */ u64 nfsd4_change_attribute(struct kstat *stat, struct inode *inode) { + u64 chattr; + if (inode->i_sb->s_export_op->fetch_iversion) return inode->i_sb->s_export_op->fetch_iversion(inode); - else if (IS_I_VERSION(inode)) { - u64 chattr; - - chattr = stat->ctime.tv_sec; - chattr <<= 30; - chattr += stat->ctime.tv_nsec; - chattr += inode_query_iversion(inode); - return chattr; - } else - return time_to_chattr(&stat->ctime); + if (stat->result_mask & STATX_CHANGE_COOKIE) { + chattr = stat->change_cookie; + + if (S_ISREG(inode->i_mode) && + !(stat->attributes & STATX_ATTR_CHANGE_MONOTONIC)) { + chattr += (u64)stat->ctime.tv_sec << 30; + chattr += stat->ctime.tv_nsec; + } + } else { + chattr = time_to_chattr(&stat->ctime); + } + return chattr; } diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index 120521bc7b24..1b205a27f961 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -168,9 +168,14 @@ static inline void fh_drop_write(struct svc_fh *fh) static inline __be32 fh_getattr(const struct svc_fh *fh, struct kstat *stat) { + u32 request_mask = STATX_BASIC_STATS; struct path p = {.mnt = fh->fh_export->ex_path.mnt, .dentry = fh->fh_dentry}; - return nfserrno(vfs_getattr(&p, stat, STATX_BASIC_STATS, + + if (fh->fh_maxsize == NFS4_FHSIZE) + request_mask |= (STATX_BTIME | STATX_CHANGE_COOKIE); + + return nfserrno(vfs_getattr(&p, stat, request_mask, AT_STATX_SYNC_AS_STAT)); } From patchwork Fri Oct 21 13:06:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6694 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp688936wrr; Fri, 21 Oct 2022 06:10:36 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4L/PJQJmGVBNq91vlILxzs0aNhifQzV5gaerA5V1vi/lrAhZFsTimrBTUxPy6hnuTxn0hy X-Received: by 2002:a05:6402:28cd:b0:459:19c3:43d0 with SMTP id ef13-20020a05640228cd00b0045919c343d0mr17142312edb.197.1666357836381; Fri, 21 Oct 2022 06:10:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666357836; cv=none; d=google.com; s=arc-20160816; b=SaIX/B5O/qicxuEO5jkh36Gmfv/BvzYGSzuF6kEeX+loqjgCnxDc9NfzH1KL+/4p/G 7IpsRY1wHLmMnO4QFCckEQV8CI93YTAxXEIfqePqlyOseUMDVwlA1bfZ5j8OGpJys/aO IOKmcR48Jy4ss2TxwHXGUOQkxP9VHoKoHpAZ0Uk+ssNTbD+jVe2YhrCvU4SQMJyfUBbg va2c5JVxZXm80jRsxFFEg5hxmMkNYKD8ZDDBY9wK0W3c9AMoBBoZHZclZ5oxipdLpLlq 2Y23OJVCpWhGhQIEYS5QTZXUwVmfCWx2+LJYZBscgTaC+Mdgs+VqtrAJUOmpZ5eU0Vuu sMyA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=iySOYQtPpDmiW9nMOd2Q22tGdtBbI/RpLibVKP8A2Qo=; b=gmMGkxv0Gaeo1I98dgLpX+EvizzJxivWuat6S78wioKt6cyZvDQIZT0EOmEw8KS9il t6pGL93ajSE8Jh949TNV5w8DBEdZrBv2wucuGXKl0NCN7wdo/cRBqzIWEDSx/r9YnLaD SQlhFJRumFzh7EZc1QpQaNKb06Fv2AhCxxKCHNVMOvbUZ2XPx6FGQqXJFvK2j7gcGwYm FzKaoQB4i5gHD2VRnr2mKguZ9YvDdxp9IDFEgN6NJA8FFeqknoo/aMhFnps7Ds5g2vJy dJH9z8fk9CwPHf2e9aAimPT26krrHGhA1GydSSGW9Ph/RBwwdeBtKIH4PbaF4DKYYVtG XUog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=QFs7aCqF; 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=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l8-20020a056402254800b0045cb5be76bfsi11283539edb.361.2022.10.21.06.10.10; Fri, 21 Oct 2022 06:10:36 -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=@kernel.org header.s=k20201202 header.b=QFs7aCqF; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230351AbiJUNHs (ORCPT + 99 others); Fri, 21 Oct 2022 09:07:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46304 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230242AbiJUNHA (ORCPT ); Fri, 21 Oct 2022 09:07: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 45E7826C440; Fri, 21 Oct 2022 06:06:25 -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 12D8E61E9D; Fri, 21 Oct 2022 13:06:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8B9A9C43470; Fri, 21 Oct 2022 13:06:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666357583; bh=A8k10DQZe5/j0onCVE9QxI6roj/l9wmzJGTvPKqqG6M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QFs7aCqFVXAySekdGZ4p3ryfOiNkMaOpcCi7/4qlgmjk3VblAe3HSrtPXkwuMDtrl 7P37FbVpYNeUO9d28qUit+vYGLEv2jI60BUCYdM2yL4fjYNPTTg+DNSfw0fGli+TOx kDj69s1BfwU0UQGg7fQUXOed31wbkFKSTqP5aYXeUm274epkCIIr7AsTuJ2DcvF4RK PHjdGEjjp3+y2DEIQgbcG5pdAtKbSXXsmObb4RPSMc865STbUJCy0cdgR94fcpxc5F 4Ehsb7+6NSOIJVsADEmPsHvLXr9LBTjzX8EfxiGY+hJ4xXXp43WVyIGG04imNsNT8k 28IwdbMkB7k8w== From: Jeff Layton To: tytso@mit.edu, adilger.kernel@dilger.ca, djwong@kernel.org, david@fromorbit.com, trondmy@hammerspace.com, neilb@suse.de, viro@zeniv.linux.org.uk, zohar@linux.ibm.com, xiubli@redhat.com, chuck.lever@oracle.com, lczerner@redhat.com, jack@suse.cz, bfields@fieldses.org, brauner@kernel.org, fweimer@redhat.com Cc: linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org Subject: [PATCH v8 8/8] nfsd: remove fetch_iversion export operation Date: Fri, 21 Oct 2022 09:06:02 -0400 Message-Id: <20221021130602.99099-9-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221021130602.99099-1-jlayton@kernel.org> References: <20221021130602.99099-1-jlayton@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 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?1747302835003316774?= X-GMAIL-MSGID: =?utf-8?q?1747302835003316774?= Now that the i_version counter is reported in struct kstat, there is no need for this export operation. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/nfs/export.c | 7 ------- fs/nfsd/nfsfh.c | 3 --- include/linux/exportfs.h | 1 - 3 files changed, 11 deletions(-) diff --git a/fs/nfs/export.c b/fs/nfs/export.c index 01596f2d0a1e..1a9d5aa51dfb 100644 --- a/fs/nfs/export.c +++ b/fs/nfs/export.c @@ -145,17 +145,10 @@ nfs_get_parent(struct dentry *dentry) return parent; } -static u64 nfs_fetch_iversion(struct inode *inode) -{ - nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE); - return inode_peek_iversion_raw(inode); -} - const struct export_operations nfs_export_ops = { .encode_fh = nfs_encode_fh, .fh_to_dentry = nfs_fh_to_dentry, .get_parent = nfs_get_parent, - .fetch_iversion = nfs_fetch_iversion, .flags = EXPORT_OP_NOWCC|EXPORT_OP_NOSUBTREECHK| EXPORT_OP_CLOSE_BEFORE_UNLINK|EXPORT_OP_REMOTE_FS| EXPORT_OP_NOATOMIC_ATTR, diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 3e09129db340..bd450b141ca4 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -778,11 +778,8 @@ u64 nfsd4_change_attribute(struct kstat *stat, struct inode *inode) { u64 chattr; - if (inode->i_sb->s_export_op->fetch_iversion) - return inode->i_sb->s_export_op->fetch_iversion(inode); if (stat->result_mask & STATX_CHANGE_COOKIE) { chattr = stat->change_cookie; - if (S_ISREG(inode->i_mode) && !(stat->attributes & STATX_ATTR_CHANGE_MONOTONIC)) { chattr += (u64)stat->ctime.tv_sec << 30; diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index fe848901fcc3..9f4d4bcbf251 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -213,7 +213,6 @@ struct export_operations { bool write, u32 *device_generation); int (*commit_blocks)(struct inode *inode, struct iomap *iomaps, int nr_iomaps, struct iattr *iattr); - u64 (*fetch_iversion)(struct inode *); #define EXPORT_OP_NOWCC (0x1) /* don't collect v3 wcc data */ #define EXPORT_OP_NOSUBTREECHK (0x2) /* no subtree checking */ #define EXPORT_OP_CLOSE_BEFORE_UNLINK (0x4) /* close files before unlink */