From patchwork Mon Oct 17 10:57: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: 3391 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1380728wrs; Mon, 17 Oct 2022 03:59:02 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6Q40Agaihb/1NlKrjlxQjHy737j23gkRSs0GtpuaoVpHv95M9PB0f+5eBPucpKGhY96WfG X-Received: by 2002:a17:903:246:b0:179:b6d0:f8fd with SMTP id j6-20020a170903024600b00179b6d0f8fdmr11270482plh.124.1666004342006; Mon, 17 Oct 2022 03:59:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004341; cv=none; d=google.com; s=arc-20160816; b=05QWvV7HJ+7Fe2EROugFaB8N6cOwhOss6NrnJS8zU5m+aSNpqwjsGVWo6LNmm5iEJ1 fgX6a9dbUxtcj35l3WSpgKI98Tf8U/p2ceu/wzUpyvNioOdTLCjVe1zD9T8T89/XXouL 91g2NvD1L//N6Nts7lI7VUXT/eIdRLZtJ8c7NdGwUWoWHAdtooqvXhwRYmGJWUWhpq9P Ggjc6V+sHFYUme0QGNtUumDobAa1v/wi0HCUNrMkjUt7rKyLFvgRxyhGsb84+lYjrJgO oAFTQjwaUnbwwKcLJThkJJZoLYuXy53Sx7vUBhWQ4uSVt9FQkz/Zm5q0W9/0mO6buzmB selg== 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=MKKWONBibkDK6aZiCNlf5CZ/nxS1nsGgV3IElN4UC24JYs5XhAklnwIME1/ejrw5Tj ExR9icLMoZWAubc432L3/x4IwFYebC2MHGEgkhmeF6GzBlBVMb0TI4yAfYNOILNnpJUd egAd7QDK1fNy+kp8ckel3gLhj2/v1khhW35GQvMClwvzmHuKZsixUT7uubdZSUs019hj P3RTVqu6y+q3Xq2dRVfKlgh0eU3n05hTs6ZA2s4KiiUONAfoutwFT05o9106lCQek3KX +AHI6Hp1eOez8/BY7gp35CZ7oqCAM49HsQq0B8DaNI6knTM8q6gLA1o+qLI0U2yfbvoQ AMEQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=gj66TCQZ; 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 s16-20020a63e810000000b0046248881576si11919405pgh.157.2022.10.17.03.58.49; Mon, 17 Oct 2022 03:59:01 -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=gj66TCQZ; 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 S230467AbiJQK5a (ORCPT + 99 others); Mon, 17 Oct 2022 06:57:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230294AbiJQK5T (ORCPT ); Mon, 17 Oct 2022 06:57:19 -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 63F115C9D7; Mon, 17 Oct 2022 03:57: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 ams.source.kernel.org (Postfix) with ESMTPS id EBE35B81334; Mon, 17 Oct 2022 10:57:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7D88C433D7; Mon, 17 Oct 2022 10:57:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004235; bh=tc1RUm4guOoZTsO0VdPQH+XnxC1sMtsO6DtotD5Lcrw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gj66TCQZlj4T/7xQvycsgXgldB2+C5GmsetaE08O+PZ5gAUkzWUHVOK98ouxsHzjZ Xwn3L4ObaHc+uyEh38PjZ1hsqAQkfRWUm38K+ZVzH/fGc1crQtwwEsJ/LUHHWWuCfC Xox25k4xYLMRSkUoLX817xk9RTmzLpGtojcr5CVTtzXPIS2neyPt/XBZk2Lo39TJbf FXRhQ+XgeIlDn8J4I1zYcs2Z1D5vab4se0VXFyc0G5J3QvbJIl+hyGJxsgoGLw60sh AGwSr4YdxFpiJLh44isPsZXOwH6Jz24lHMLAREbQxaoqFo0M0tri4NVdNnl4Rfu0QX GacQr/afZRz7A== 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 v7 1/9] fs: uninline inode_query_iversion Date: Mon, 17 Oct 2022 06:57:01 -0400 Message-Id: <20221017105709.10830-2-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932169098954196?= X-GMAIL-MSGID: =?utf-8?q?1746932169098954196?= 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 Mon Oct 17 10:57: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: 3393 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1380996wrs; Mon, 17 Oct 2022 04:00:06 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7tMExoIfilyLUNfkNQqr558E2p/xYAb4tXCBgE/6g7O7XCyoouCv1CxlO16J+kZvnDu2b6 X-Received: by 2002:a17:90a:d518:b0:20d:516d:67ee with SMTP id t24-20020a17090ad51800b0020d516d67eemr13214127pju.9.1666004405722; Mon, 17 Oct 2022 04:00:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004405; cv=none; d=google.com; s=arc-20160816; b=V524Ig5bxlSAg0dA7J7VyItW7bnNiMqblj4KoUbU8wIIBbKftTTc879YrMrFmNcmFz u06E4mQ91VHQRLayAhOvMqBE5lG6L4id6X/G2grvC5rAtHJPUXBa1P27hMpENKCQ936t IKg8ekJNRpSGw/LdKSq+r/CvCiLflGvlZu+4EKNResVgCGo/BC6ZIKkqOLBgTxYnwvrI mDqVt8zz68CMdWIAAnvy6cMWEgdA3GoA83ODW8cZhiGdsG4W48TTAP7MDeGlZC9saa56 Bup6KwuZFmiMT4DH3jdYYR/A8n6cazw0Tt4a3izQpbMuA0nDQw7UGOO6f8A35qSUyERN Ic0A== 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=BOHAxSlDVG/nHgNmpDle5kK0uyCiV6dyimXuqd+wT9aA/gEhmQFdsbaC4HUefFX3HI rYQuBu3ypocTjh+qT3hotDaT/7bsD+lrmSMa8Rb8V0X5PuupgcH4mjF/ZC5Hj11LPYT3 XsteBc5ChWSA4duW/ENOlBaAbVapdCyhmvqoIcpyUSKTWSWyeuaJbU8XdWbDm6Xp9vs4 BMdM12wWBVZN4LhhoYjQZsKVcC6CwDM5wBXmQBQUXMkkT/QmkpW+Uzhen8jvpLG9aQjS DHL1p5Owt8nKD394K2iBT/AquPihXUUBHkJNXAAUy4+vxklnARoX2pA6hhSGZAosNE3s q/+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=MwUTTIfz; 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 ja21-20020a170902efd500b001751a9de12esi10333858plb.288.2022.10.17.03.59.51; Mon, 17 Oct 2022 04:00:05 -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=MwUTTIfz; 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 S229779AbiJQK5c (ORCPT + 99 others); Mon, 17 Oct 2022 06:57:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230224AbiJQK5U (ORCPT ); Mon, 17 Oct 2022 06:57:20 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DFC155C95A; Mon, 17 Oct 2022 03:57: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 83E3D6104E; Mon, 17 Oct 2022 10:57:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DDF16C43150; Mon, 17 Oct 2022 10:57:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004237; bh=3UkiypkQG9xLfg+hS+eOV/U1/Tn/AJ7lMyTpKN5KYY4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MwUTTIfzRGKwnFgR9CHvcDGvrugB2kBLT3/HZViQOmOp7i4frDTUrsArcqbmeeT2M sTqJu3GIYqpuq4flLKcAZOZFnPFa7zPj7A3w5PltdPpt4g1ZzSk2WPonaGztX+OYfl s2ipV6sWJ6VMpoWn3SEs/Dv6B190JWr14RE6elpX9WGw03rwUK8saBdvkHEBdaLrCE Ay07oOffO0gqSfvow5iHwu6fqhlxBDabrcNW+ajL/uq9yLeRHETcYAgRGLAc+77frz jH8jsPYTVyyTxXoSYe3j6MKWOwEybrQ85JBygblbRW09TQLEz9WB87blZu3Ne2dAqa ylsTh8PecGdCw== 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 v7 2/9] fs: clarify when the i_version counter must be updated Date: Mon, 17 Oct 2022 06:57:02 -0400 Message-Id: <20221017105709.10830-3-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932235570592538?= X-GMAIL-MSGID: =?utf-8?q?1746932235570592538?= 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 Mon Oct 17 10:57:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3394 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1381087wrs; Mon, 17 Oct 2022 04:00:17 -0700 (PDT) X-Google-Smtp-Source: AMsMyM73bky0YPhmqlUUgVXuMNv3Aeezy1NIPxBoCDfH7omyh6+b89T5TOVq4Y5VpVeBDdV0gbEl X-Received: by 2002:a17:90b:2651:b0:20a:daaf:75f0 with SMTP id pa17-20020a17090b265100b0020adaaf75f0mr12628244pjb.142.1666004416746; Mon, 17 Oct 2022 04:00:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004416; cv=none; d=google.com; s=arc-20160816; b=u2KAwdiUBe0+cLSkBJihg26VU9fENFr3+a6hmfGSz+BW0FZgnuXYXx+AeHjQA7Lzr+ kcWkINZFZ6LsD/iZzmNuGQ5uXcthn5NZr07u+nQEm1NZqQUQpxZZTkR3FDq+ZKYtz5CS 1EUU9g6vJEluAB0xZMoAY8E7IpQnJ+/UbyH8nrwijM+WiZFV8xceaGkQ3DvpZ7y4CkOp rFDb6fJmKlYPeehhw6KMWgWJo/JehMZ20P5vBu/rtUVEQPBx+Ufa6cdukYHd8vLcLDkI tWUmCjobYm3TcDf0foqJURDmwvwkxlhRFwVCKP//g+vTbfUDUpv5tfDRwYxuAUJb5MuI pYZg== 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=FfqF+j9lQ1zGKpkwUTKfvPK4sQ/S3HpQUAeOACvNupM=; b=EprwlzU8dKtQ82ZAszPK+J7qCf5Ap9v8/NwG4y/PdLuzp4qy07hnMlhRdnUzasALVX bJrjy4vnZQi5UFypgWw30VR5HUlZ2kGvqsCZT6YrY+hho4ZwRDV72JKEJVtA0H+JQgLt OpTOvAvEMZxassi6+Xp39zhW38SJjfC6lWGFkFhSG6OHnC4cBE8RK9Pl5SWVSRHWBhgV iTM8PEbF92RLNQfNgBn3ym7SeGZr3yZzGIIuUosiIrw8rhlFe+Gl2tyPmsXMJOyfWIMf vs+IORq910owQrIdwbocS8eQKS37AwKl01OeMhrIaEGfGO1ryuY26ldlpnzO6V3ez+Ho tRMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=g0AtauxQ; 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 j19-20020a17090ae61300b0020ab058211bsi16434111pjy.65.2022.10.17.04.00.02; Mon, 17 Oct 2022 04:00:16 -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=g0AtauxQ; 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 S230514AbiJQK6N (ORCPT + 99 others); Mon, 17 Oct 2022 06:58:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230434AbiJQK51 (ORCPT ); Mon, 17 Oct 2022 06:57:27 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52FBD6173B; Mon, 17 Oct 2022 03:57: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 ams.source.kernel.org (Postfix) with ESMTPS id 72ABFB81334; Mon, 17 Oct 2022 10:57:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3047BC43470; Mon, 17 Oct 2022 10:57:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004240; bh=8TWv5cnyxlkJnO3rzKxS18paTx4A0ODreD10US43z/E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=g0AtauxQEC+zWtDfBEeehuzIvC524NwIGl56NtZcSFJFyz2LPfoRugKIVLTkjOpCA mq1oZfuJyUL/JeybhMvf/pw0e8CyhwTVH+NaaQqewYqXgCfvcLmb6lARRimSqUOTh+ UIoFhvM/OenF85DGhvDWmzUhBTnW7/pgIxwGsuyM45IjgDxNExc9rBgPnQ2uW8qLnY 4+ISOJurDZtAT0aWPOQzLpiFzQz9ALQUNQnM+Kq1lFvD8pDDUHDa+DFgncHFxkWvt8 6OlNzeFnlT4mSS76FWZA8rvr+br72M+3mNQUUyHxGIPshQZwkGjRaXFuMrjxllWSFM hTAME/ekB05Uw== 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 v7 3/9] vfs: plumb i_version handling into struct kstat Date: Mon, 17 Oct 2022 06:57:03 -0400 Message-Id: <20221017105709.10830-4-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932247236941919?= X-GMAIL-MSGID: =?utf-8?q?1746932247236941919?= 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_VERSION 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_VERSION 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_VERSION_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_VERSION 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 a7930d744483..e7f8cd4b24e1 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -118,6 +119,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_VERSION) && IS_I_VERSION(inode)) { + stat->result_mask |= STATX_VERSION; + stat->version = 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, @@ -587,9 +593,11 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer) memset(&tmp, 0, sizeof(tmp)); - tmp.stx_mask = stat->result_mask; + /* STATX_VERSION is kernel-only for now */ + tmp.stx_mask = stat->result_mask & ~STATX_VERSION; tmp.stx_blksize = stat->blksize; - tmp.stx_attributes = stat->attributes; + /* STATX_ATTR_VERSION_MONOTONIC is kernel-only for now */ + tmp.stx_attributes = stat->attributes & ~STATX_ATTR_VERSION_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); @@ -628,6 +636,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_VERSION is kernel-only for now. Ignore requests + * from userland. + */ + mask &= ~STATX_VERSION; + 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..4e9428d86a3a 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 version; }; +/* These definitions are internal to the kernel for now. Mainly used by nfsd. */ + +/* mask values */ +#define STATX_VERSION 0x40000000U /* Want/got stx_change_attr */ + +/* file attribute values */ +#define STATX_ATTR_VERSION_MONOTONIC 0x8000000000000000ULL /* version monotonically increases */ + #endif From patchwork Mon Oct 17 10:57:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3396 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1381365wrs; Mon, 17 Oct 2022 04:00:51 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4OT5sRgXo9MNLPkKNnmiiFY3FCH1rHL2ThQtavcQfHAgqQUNeV629aSxQt7sAjamHB6U+w X-Received: by 2002:a05:6a00:1487:b0:563:6367:8a17 with SMTP id v7-20020a056a00148700b0056363678a17mr11974456pfu.85.1666004451047; Mon, 17 Oct 2022 04:00:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004451; cv=none; d=google.com; s=arc-20160816; b=dEQ3zq3icPdTE+hyq7ezS+TgnZ0IIFmBbQVHd+GPs9UtOuiUp42Dj7yanqeZWZt+ax V7Z/YtBJmVLDCt7YSQMct6Wr1psxUDFa/K8EaaDQPsqjXkBXMncUxij+cuRIUw6DRpWh Tz1FuaoElQShpMXdn2ev2kvzRj9aX7ywnQMFUMCJltchbw4EI1T4e1/qR9qj1RGH2WF4 q/TBMYO/ZNkadNenmbX+zvcjGwHcgz65YQn5hp0pIXDxFU9sv8IRN4WLb8EWNBB8tjY6 ms9IDppcJwCwAzkTsJsKeO4rK/N1ZZVzJcQlE+QVHCci5/EqMvCP5NUqrcvw9Zd/ZUp8 hIfA== 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=133beu4wu83tF5WNBZyzSPfHHNLL61rZDlKr2f88BPQ=; b=CZhp0USc4GJv4eYEuGTsNj0MPkWQI7CRbLjWkiu0wPtH99VLTrMYPq23qXHav0P9RL DMAH0hEIMy2y/eo5biMmB/o82PFlkuSQfa4vUbOZ4y0FWwftQdpVDL0drndTumFdwWzq 8cO18deFpn4tZGq3ZxmVF1nIhrak1zU2V6ZoFpqMybUz7wKrMfdEhxvMjY25ejnGkP4M FV+Z23V1vAbnpRWTnVgX/I035uROv4uv78Y47jUXlLiSPEbohM/GXwHPRVxcW5lIp/yD 8f9KsvYLmkwB/rmBfHjTHC1sEdAo95trYohf/WFvofLgSg46oU1vg9W2bShebuWRefyg KywQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=T3Ky4C9q; 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 z11-20020a056a001d8b00b0053e3cf68da1si11185979pfw.74.2022.10.17.04.00.36; Mon, 17 Oct 2022 04:00:51 -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=T3Ky4C9q; 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 S231344AbiJQK67 (ORCPT + 99 others); Mon, 17 Oct 2022 06:58:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230349AbiJQK52 (ORCPT ); Mon, 17 Oct 2022 06:57:28 -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 1CB0061B0E; Mon, 17 Oct 2022 03:57:24 -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 A3FCEB812AC; Mon, 17 Oct 2022 10:57:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7664FC433C1; Mon, 17 Oct 2022 10:57:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004242; bh=pekK2QX2KgEQVYMZRaffG2V7y/r770DCCIDCn7vh39M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T3Ky4C9q3L69subjakIcY7GefggWpp4am8aahclTk9o5/rR2lV9HA6L8t1/sxry5+ ZJ0se7Xs9NyKsNFZdGHo+8LrlfexywLrAEeOiRCTHHngmUUmRF/C4MR3ldr/WslKGc vO72WVCpmN1rI4m6TTd8nCdu6UF7R+/nmoDnhSBMcNwGGOTwgZVwa2Xx45WJoHuP08 j0aCxtYUFeg4TIFVHmzBxwwCzwe8q5M6sIbD4+2lWzYdKXwESDj/UsxKMxrd2AZrcS F9KuS57VqwxPG0acFwpX4R9uC1YwgBlkg5Eu0+Qdzjm5s18tz2x0+AsK3SJ5PtGkpA mXF0mCfXaMaAQ== 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 v7 4/9] nfs: report the inode version in getattr if requested Date: Mon, 17 Oct 2022 06:57:04 -0400 Message-Id: <20221017105709.10830-5-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932283411898154?= X-GMAIL-MSGID: =?utf-8?q?1746932283411898154?= 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 | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index bea7c005119c..7ed1b4c9260a 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -830,6 +830,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_VERSION; return reply_mask; } @@ -848,7 +850,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_VERSION; if ((query_flags & AT_STATX_DONT_SYNC) && !force_sync) { if (readdirplus_enabled) @@ -856,8 +859,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_VERSION)) && S_ISREG(inode->i_mode)) filemap_write_and_wait(inode->i_mapping); @@ -877,7 +880,7 @@ 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_VERSION))) goto out_no_revalidate; /* Check whether the cached attributes are stale */ @@ -915,6 +918,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->version = inode_peek_iversion_raw(inode); + stat->attributes_mask |= STATX_ATTR_VERSION_MONOTONIC; + if (server->change_attr_type != NFS4_CHANGE_TYPE_IS_UNDEFINED) + stat->attributes |= STATX_ATTR_VERSION_MONOTONIC; if (S_ISDIR(inode->i_mode)) stat->blksize = NFS_SERVER(inode)->dtsize; out: From patchwork Mon Oct 17 10:57:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3392 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1380851wrs; Mon, 17 Oct 2022 03:59:30 -0700 (PDT) X-Google-Smtp-Source: AMsMyM42aRnyj0wVMFzPXrDzLLW/uDr3K4usBA0VW7Y5ggz7bXRvQ4zQHpienxjR8oYE1WDJC5G9 X-Received: by 2002:a63:ea4a:0:b0:439:4695:c0f8 with SMTP id l10-20020a63ea4a000000b004394695c0f8mr9978956pgk.440.1666004369849; Mon, 17 Oct 2022 03:59:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004369; cv=none; d=google.com; s=arc-20160816; b=gXGQlqrSfRhnvgj/OByGGIbabQaBn8WB7Jds+pxOlAepMUomU+esgdlOqKpM51xTOx i64QcC9NeynDQf7KZcmpuODCK5Ls92BjeWzUf5T14Q6DUFcjMaKydB8+suwEfichpMrQ md6F4vlpbKgqZKaFMrFdl2UpvQPiCB0us+/UifYoFbzUrKzorU3hKx6xOFr/Pb/qWwin Tcm4UsI4gnXGd8igty3nLU28TNIkujYZyN4hRfLb8uOrZeaXSJWKR41Fp0ISi4++nVg4 KXYntg7q4kfxFwHLi044AFeNxTlaVqa9C8aCJagdFClEvwZY/dMT5iU8gEcPrnKQBOn6 YeWg== 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=mO+EWE9vFr8NsCwM2LXTtSR2PucxsVl8S6KFi+y7TE8=; b=JVdGmFe7iFjkEQ1YmIvtqbnpO61qO4Y+iF17l0YfmvzUzrjMmbFROdgspyYakfVt0w MGcabuuqOuMGKXjZOjTzjUrEsqIMx/JcEmEH5XgqSHkC97iCkKqFdBURJSuVkb4NalTF tA0SLOQq4k5+r9IKHQZCoReCXRAnTZda2Gxd923n3jslszQnnUIju86fm4sLaG/YTI2B siGbesq5ng3cCGUrtf4cJno3ul08C+qnUbFlLIfOA7toXRfcRM16cPM/ALUGJQdHVgOw ++Q9LwRfC2g4xy6JoCqcuVuvbX1gkHOOnwbJuQhZQ3AjBiMyeTFRNHh55z+kBJGWNrQ0 ITjA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=bh5nTooK; 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 t2-20020a17090a510200b00200a22064afsi16253613pjh.41.2022.10.17.03.59.17; Mon, 17 Oct 2022 03:59:29 -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=bh5nTooK; 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 S231159AbiJQK6Y (ORCPT + 99 others); Mon, 17 Oct 2022 06:58:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230469AbiJQK5a (ORCPT ); Mon, 17 Oct 2022 06:57:30 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BE0BB61B2D; Mon, 17 Oct 2022 03:57:28 -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 sin.source.kernel.org (Postfix) with ESMTPS id 945B0CE12AE; Mon, 17 Oct 2022 10:57:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A8BA6C433D7; Mon, 17 Oct 2022 10:57:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004244; bh=xnrewwvldKIjoeh5ebiZu+onJb8qn6gj1nIuV6NIss8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bh5nTooKpjTJrP2pLkH49auOau9LSXv/ChZHfvENHLq5PdUL9u5sbQlNrDoOn6YMZ WieShPVHZCnZcKf+VDyEgIvtuU6KAlxhaWVpT76Z9ZzS9/oxmULozBKfr6FO16xefe SaJQTNLrEXX7EVZKB+K81f0SFCkXq+N/XuctzrgSZuvqymSzlXk+I63YEe8Nhdka/j PqtAo0CWb2fIZbyv/ddnTp8GvYNSUXZGssJNU7bn9yBifArha9ZucJCQ6Nkpeyoh4C OkU27OjjcdtmBAAuKhaAopo/ZzG0deuEkPTGjhEgM+SWTLNCXxr3trSWtODFA7bBXN qDAkOQ/0TBbbw== 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 v7 5/9] ceph: report the inode version in getattr if requested Date: Mon, 17 Oct 2022 06:57:05 -0400 Message-Id: <20221017105709.10830-6-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932197714680439?= X-GMAIL-MSGID: =?utf-8?q?1746932197714680439?= When getattr requests the STX_VERSION, request the full gamut of caps (similarly to how ctime is handled). When the change attribute seems to be valid, return it in the ino_version field and set the flag in the reply mask. Also, unconditionally enable STATX_ATTR_VERSION_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 42351d7a0dd6..bcab855bf1ae 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -2415,10 +2415,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_VERSION)) mask |= CEPH_CAP_AUTH_SHARED; - if (want & (STATX_NLINK|STATX_CTIME)) { + if (want & (STATX_NLINK|STATX_CTIME|STATX_VERSION)) { /* * The link count for directories depends on inode->i_subdirs, * and that is only updated when Fs caps are held. @@ -2429,11 +2429,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_VERSION)) mask |= CEPH_CAP_FILE_SHARED; - if (want & (STATX_CTIME)) + if (want & (STATX_CTIME|STATX_VERSION)) mask |= CEPH_CAP_XATTR_SHARED; return mask; @@ -2475,6 +2474,11 @@ int ceph_getattr(struct user_namespace *mnt_userns, const struct path *path, valid_mask |= STATX_BTIME; } + if (request_mask & STATX_VERSION) { + stat->version = inode_peek_iversion_raw(inode); + valid_mask |= STATX_VERSION; + } + if (ceph_snap(inode) == CEPH_NOSNAP) stat->dev = inode->i_sb->s_dev; else @@ -2498,6 +2502,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_VERSION_MONOTONIC; + stat->attributes |= STATX_ATTR_VERSION_MONOTONIC; stat->result_mask = request_mask & valid_mask; return err; } From patchwork Mon Oct 17 10:57:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3398 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1381813wrs; Mon, 17 Oct 2022 04:01:44 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4Bk1M4ldSzd5Hlh+fCTeTGjMGhimfy2ypdsgAb3YMrUVtznadvh4JS15HPi+LGfI33foBl X-Received: by 2002:a05:6a00:1a4d:b0:563:a7c4:f521 with SMTP id h13-20020a056a001a4d00b00563a7c4f521mr11981730pfv.61.1666004504156; Mon, 17 Oct 2022 04:01:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004504; cv=none; d=google.com; s=arc-20160816; b=QAo3QDfMJ2WBJ4psuMqY/G+OoGrxUJSp71dJdGPtPfe/ZCtog49aHIftAyHnpC8Eaa RTOSyiWvH27XbYjuVPYRzPYtqWgr14DwRaZhygWNryISaDbxQxyFOaJXtedN2vHuIirS /0D8H90qPwggs00o/aEwkcQsWznVfB6BICLUHqvGryexu1J0TwWBHYaE0dgXMaB2Wdtz vxbhzmyR5j3SxxTFh9kIQcQaewHnIEJetI6s0wPgq28mJ5GIDYj82jN8cHyHFMPQ79zy DDvKpot99F9ozDCB9eCQ3ECDSEepTZpQx7W9/U+kObEDew2/LwrVlZchgO4sCMIFdUxP EYIQ== 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=adXEqxPc7KQ6PJmepG+09rqGaubQcixlEScnOYf0jmnoBvCfb82C09vSuefPxn/qCA V1bdozm/mgFr4jqcVySrtq0AEyLnulhg5a5GVrhxUFsDMuf1QI9zNxq9wFOKwEe8gx1t pWIORf1pJO87pOo5F/u5owbiWoP5Mtzl5yRCdGWAl7qGNDq8/4DniTwkWw1JzRceQBSI 0vU9SpkmoerGjg1scmcFe/6bzpGSwZIE7yryPGkOSmkuUvaEaCAG8ATTwvMpPd47SIed gmdgi6T5YFRop1cINGmltjsuYqrvo0mXjYX0Dbd8W9JH+jvO2VV/f8/MYp9xnRif4EA6 9kmQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=GcdT6b7m; 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 u18-20020a170902e5d200b0018388edd187si13466941plf.56.2022.10.17.04.01.19; Mon, 17 Oct 2022 04:01:44 -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=GcdT6b7m; 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 S230500AbiJQK7G (ORCPT + 99 others); Mon, 17 Oct 2022 06:59:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44638 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230464AbiJQK5a (ORCPT ); Mon, 17 Oct 2022 06:57:30 -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 A770D61708; Mon, 17 Oct 2022 03:57:28 -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 6E0D86105A; Mon, 17 Oct 2022 10:57:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DB448C433D6; Mon, 17 Oct 2022 10:57:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004246; bh=LBaEFSh5DOeyzDGsOyxhMwQpssm5JK6u2HESg5ybNII=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GcdT6b7mb+oJp742oGeuVIMOfw8oEZ0enQ18wg8Ay/lNdbFfxNrtDJeG5LwPho5dD mjrEEtQNE5tTDsZ3XJBuv/1zzQ2QeaSuOG/cCyWcsUY7eJIEeSErX+E+vAIFJQsC55 N0s4+1Hq8cIO6nsNFLSxEB+742ItXHY3Kedw1srG/T4sW8IkT4hPE77/++e78jtlwu /K5Vs5K3g2tUySh+SylFTQGTzwZWsWsW8g3y1rdekQXDShurEUkxEr/O+y+NwuXVZ7 V0SmxQbcJ+ulid2bOfa6XXx920Zn48b/9WwRFyMGnJFHPxLoEn+tBpw6zmF+eqKvTC tpSNnThfThorQ== 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 v7 6/9] nfsd: move nfsd4_change_attribute to nfsfh.c Date: Mon, 17 Oct 2022 06:57:06 -0400 Message-Id: <20221017105709.10830-7-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932339088135751?= X-GMAIL-MSGID: =?utf-8?q?1746932339088135751?= This is a pretty big function for inlining. Move it to being non-inlined. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton Acked-by: Chuck Lever --- 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 Mon Oct 17 10:57:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3395 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1381145wrs; Mon, 17 Oct 2022 04:00:24 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5MP9xNx59lJcNFdkiycp/c3VqGv4qzuCcqAZLw5oMxoXjlGWIV+5Ec3i4mD9OvCJhs7yAS X-Received: by 2002:a17:902:7b91:b0:185:4548:3a96 with SMTP id w17-20020a1709027b9100b0018545483a96mr11300142pll.130.1666004423967; Mon, 17 Oct 2022 04:00:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004423; cv=none; d=google.com; s=arc-20160816; b=lsDvq8pd5H+UqFUSUTf3FwiGge/wp5gQaZfCtq70vS+kR7zQCdo2ugUeJJ5VDUxh/P gtxAYfU4IYfkA+Q5tDNH7ZFog2CjHJNRy6s7zy419f87xabTjzzioYLFXTEbgGFwuYTJ z/TlxBgcT7RJjFatmBZWNXXiHHvspNrkaTjW5QSXNh2qIfSTYazS/ovh3JAPV8MRRZZd Spw/Ptu0o3aJsXnmVvykSWcr/wK9pfOeQ5kUk51ZQBWq1GPZ5Md7nXsVs9APRLD5LtfN QCpyMlQTKCQDRJfT0ZMppFmywS3K7BE+sUGTbUp6vwb2dsUedc4lb5OoRO+j0XAoD5p0 DipQ== 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=EFhSOFFYxPtzoEM6rbtzmNLE4D6x2vOoyUofz2wNxM0=; b=ZFnPXcclyCbOMY8gV26sOUmXDTt7annumguYKBXIKzehNaz9sRCsKlFpAnJcGYNvQC d1rjaNEeTLjy8ou7bSsFOUiv/xDKvXcALyfbkABrxAxAy4Z4U9xGp4oX0v2u5pRqT73E ocgRvARkaGJfjHg25X3HMS0Jl1NVSgXAYubMIQpWARAWn3pGNP/75CwYDLMZEa23fBov v9j2sI2LT35Z4TybhxeOUcKROb0m1r75O7QS5otUHMTJ0xUiscMj4juxtaY8ryvVeBiz 81bR1BQqGusasgNYzrYrO7Izgx962tGpAYydRS3DJ+lX6kjBlmG7UnlaZa0ITAXz82X7 z6VA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=sIvU0EyC; 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 t64-20020a638143000000b0044afe5afa76si11035086pgd.380.2022.10.17.04.00.05; Mon, 17 Oct 2022 04:00:23 -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=sIvU0EyC; 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 S230520AbiJQK6R (ORCPT + 99 others); Mon, 17 Oct 2022 06:58:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230339AbiJQK5z (ORCPT ); Mon, 17 Oct 2022 06:57:55 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 218B361D4C; Mon, 17 Oct 2022 03:57:31 -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 3ABDFB812AC; Mon, 17 Oct 2022 10:57:30 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 18FBEC433D7; Mon, 17 Oct 2022 10:57:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004249; bh=ETm0SfdogARXRGGJXl+FyttQWaCVWogaX3LXDgrfYj0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sIvU0EyCOy6DbQPAmG4LnwHl9cRWX/adB+EWpr5MTgOi6HJ6qeYLhbROlgZqOxc9y yG2lImQEsERZI0jAlukm5WsIHCI0j4uJEpO2tOSo6yezl/SAKUR4AYSXn/IXT6zEe1 4Pijv+YSfHHocsBOHKBTsauMGovbSGYWZFpovSPQUztsR+qekfuuoO/hvW3II1kXOo +qehy8Al5tmwnNIoBVkeZ+kh2G82Zw7BZKSQqxsvZWhmDvxOdtnU2yJRHVKmv5175/ q+4ECQ+cUNfHzulE+Ge79dPHx9QJHQAqAjItxI10GzfWOh1HSz5W75OopaxbyYY4N7 UewcH/P4Dhubg== 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 v7 7/9] nfsd: use the getattr operation to fetch i_version Date: Mon, 17 Oct 2022 06:57:07 -0400 Message-Id: <20221017105709.10830-8-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932254628235187?= X-GMAIL-MSGID: =?utf-8?q?1746932254628235187?= 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_VERSION (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_VERSION 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_VERSION_MONOTONIC. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton Acked-by: Chuck Lever --- fs/nfsd/nfs4xdr.c | 4 +++- fs/nfsd/nfsfh.c | 53 +++++++++++++++++++++++++++++++---------------- fs/nfsd/vfs.h | 7 ++++++- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index bcfeb1a922c0..c19b6b00b620 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_VERSION, + 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..21b64ac97a06 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.version = inode_query_iversion(inode); + stat.result_mask |= STATX_VERSION; + } } 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.version = inode_query_iversion(inode); + fhp->fh_post_attr.result_mask |= STATX_VERSION; + } } else fhp->fh_post_saved = true; if (v4) @@ -750,28 +758,37 @@ 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_VERSION_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_VERSION) { + chattr = stat->version; + + if (S_ISREG(inode->i_mode) && + !(stat->attributes & STATX_ATTR_VERSION_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..c98e13ec37b2 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_VERSION); + + return nfserrno(vfs_getattr(&p, stat, request_mask, AT_STATX_SYNC_AS_STAT)); } From patchwork Mon Oct 17 10:57:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3397 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1381744wrs; Mon, 17 Oct 2022 04:01:37 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5qel5lSPsOnoa6EWNCodfQ7krLtjkhGlwiit3zCWlWVOP04VJ/UiIob3JYWvJJtLu87DxG X-Received: by 2002:a63:8bc9:0:b0:45f:afa8:e686 with SMTP id j192-20020a638bc9000000b0045fafa8e686mr10185498pge.219.1666004497128; Mon, 17 Oct 2022 04:01:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004497; cv=none; d=google.com; s=arc-20160816; b=qlCac6FHhliQdigLc2+H+euLKu4eDeAD7lUrrFrAmIm3HuEgBRQAyBo2LI8KArE9qx 738C10XjuRBt56DR4GGpOXI8js9WOC8OAU3R7Ra7raP0XzEaUm1HFQBw20heTZEdbVMS CWQ9CZDGCCJ39vWFD2yBa7+o69dwSqJFpzNKmnr2tHLwjuGoNpNCvo4U/jfvq6PaA+cG aHoDvMz8vemgAl5bbPzhKFtkRT/g+xqBnA4Blsp9TeB8ZWANbmvIMGPuWQ+wIzLMXldA Ecqq7sCuxZbOw6Q0X464Uf6yJL6I+Px7X4KYJ9E9mp+tE2etZSPwmHYNFY3QHaFVLARP yzkQ== 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=XJNLzkrdPzN5YD/WjXESpdZNMCDLxQ0yibb7uBIW5w4=; b=W4kvYZPegR2jtmPE7AY994OEHXepXDth6E+Z8y1td6+v5a7LKM+D6/E/nEXtUeok/N LSSsHh5yefjsjWUvLzkEq+JLuIWnbyMqU61qpAKQpbwcSDvmKl5B8LKD2r+ldfvV95fO rUsv2F1Nq5f9IzIQZdxgYxu4dVAe/mBAfLUYZhvHKPKZNVwOxEtDDawijUP/ELN4EoD9 FyRL/nMjwKDfx1nRG/JkaoKf7s4XiyRl5GoKvTuxE6qLh3AXZ0bYwaMtaX/jdaPk2qob ExoqAjUvMrLMDqvVVJLxVF9fEyXL186AzewK51XMWXgdQQ0GM+r4PAT27F5Miw8Ybozg oEXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=TTvGFNOC; 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 p4-20020a637f44000000b0046b3ba2c806si2967649pgn.145.2022.10.17.04.01.11; Mon, 17 Oct 2022 04:01:37 -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=TTvGFNOC; 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 S230463AbiJQK7C (ORCPT + 99 others); Mon, 17 Oct 2022 06:59:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44638 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230433AbiJQK6J (ORCPT ); Mon, 17 Oct 2022 06:58:09 -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 9C9E761135; Mon, 17 Oct 2022 03:57:34 -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 87ED8B81338; Mon, 17 Oct 2022 10:57:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4C0C6C43142; Mon, 17 Oct 2022 10:57:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004251; bh=IFSEjIJ9849haCXwjIMjlrBQFkMr+ez73GPRlwR8RA8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TTvGFNOCk9adYVcWoJdmaLqoLOr9mZe4vfjD2CR+bk5kFt3mQr3TRyZ9VeVqw3vWc 75uB9/qN74O3l06iOrAPwNi90tSGXI7QwycTpEVgKJE2n6fAk97o44zi+Y//SeCXgr F2SAomQaWPaJgfikV8Apjj9q+0URmKaViRA95YLqHzvGFiQgado/Mih8OM9wnOjY4X MUs8KDvXsb9qML6ZaHAFwfy4GW5sDqLZsvK8J+3b0gOBfZSGjEWolSsNVbuWbKcIm5 9mdCKS4IEoiCpphQqhMigKXqGaXwOLLFn9K6H/3hpF2G680esQ+7AyKwnn9kzXxLYS XPQhxSOBNuVUw== 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 v7 8/9] nfsd: remove fetch_iversion export operation Date: Mon, 17 Oct 2022 06:57:08 -0400 Message-Id: <20221017105709.10830-9-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932331523289071?= X-GMAIL-MSGID: =?utf-8?q?1746932331523289071?= 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 Acked-by: Chuck Lever --- fs/nfs/export.c | 7 ------- fs/nfsd/nfsfh.c | 2 -- include/linux/exportfs.h | 1 - 3 files changed, 10 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 21b64ac97a06..9c1f697ffc72 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -777,8 +777,6 @@ 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_VERSION) { chattr = stat->version; 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 */ From patchwork Mon Oct 17 10:57:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 3399 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp1382460wrs; Mon, 17 Oct 2022 04:03:04 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5Pyy6ugo0g3voMZpFzWWNvBHOKmKcQVYR9zU/Fum0yubrQfnPXHf5NzTv3zElWUDjwjVno X-Received: by 2002:a63:91ca:0:b0:460:c57f:9d8a with SMTP id l193-20020a6391ca000000b00460c57f9d8amr10171783pge.400.1666004583860; Mon, 17 Oct 2022 04:03:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666004583; cv=none; d=google.com; s=arc-20160816; b=rhrinVukIGC6WwtV95T2jj3KR49vN9FJEjSwlTXH9+2qfWlCqQ5R7hbSy33Kubk0Te DH2aefEk6w8f7/IwgZ6rDx8PCizGrA0vTg5NwcUNZOxZAKSmLOBp/VxxzHe6kgqI/GZY mio21QNyyFKwdJESPp3eapoiqG8unLSdJiWICJcf0197sZviVTDI/US5lLLiO0C1I6KE 7Cl86FpqbM5Z4jcPk0SQr9WdepVPIbvHQHdueCfJTjSKwS54Cz6Nf/F/BI4rY/Mr9RIX S7iEjTMShFjp7w/ydll2R6ULUftIpsin9agOS6khjU+4pVWit472FIaecCElTEdK9D2l I9Nw== 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=XEAf4aFVsSUmtGNAJlPt9cN7yrYBW0QD8SiqPptOHas=; b=gbitCg7hj4MZEemgYDvyCgTX/gTs4LYlPCSd2vltAc9TfjkFsDADZu5Yh3rynfa/z5 NDqtYWCQ0AGNomH3i4P/FcJgzGoJ8/NAtwpouJR1TCn43lXPOY3rTG1OPJ1D9wAnZKtl YiOfo1YurshsbQ3i8FCN0ecq6YEF8Wn4ajQa/3VLgkTlF5Z77iwmAvgv8IMQHjEKl7Cv aitQsXW+5ptv2HtpM7GjErecBUp7rxtzb5nttPXvpw+9qFJcl2SAm3BG7jxDFJyrTxfu HaVyD4xkaM3DReig77tMlecF1vpUGErblmWBGWD4yrBT7ZVp7I+eJRtbewYEFrCHeoDz Jc8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZLtIENBT; 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 l22-20020a63da56000000b0043941763eadsi11718123pgj.835.2022.10.17.04.02.49; Mon, 17 Oct 2022 04:03:03 -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=ZLtIENBT; 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 S230510AbiJQK7J (ORCPT + 99 others); Mon, 17 Oct 2022 06:59:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45928 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230496AbiJQK6M (ORCPT ); Mon, 17 Oct 2022 06:58:12 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDFF561D90; Mon, 17 Oct 2022 03:57:36 -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 BEABFB80CAD; Mon, 17 Oct 2022 10:57:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 81DDCC43144; Mon, 17 Oct 2022 10:57:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666004253; bh=1oukB3rP9Xx+gRVJOYRNIFNTZFkHQH6wKGEOtYxV1lA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZLtIENBTLEh//XZqkkXjggNWvOQ0CZ0QaZWzgsuYdEyU3UP/cx9/TlAQlifA9F36r 4nLQqITN8SK330HszRafccpu3ehpNbV9qYYEwfR0oSGtX+1QjyfU/LxMjIFqVNNyeR iYRtAg/ue7BmO835kRO/mISgk/TR+rYT0pw18WRhbtZNMvmjj9ebAKM5Xw2NAReneU +uj6wUVpXiE2Xhxx21KWQDtTpIVnVHG73v8IPF2oB96fMm181Freq+CJQ5lWFNQQnF 8dCUSDhAvPPs5ESyFIxgKcxny9G4226aZPHn36wqrCZgZJhG6wiHKUhAk2VCDzmyq6 W+NlN4cyC7YdQ== 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: [RFC PATCH v7 9/9] vfs: expose STATX_VERSION to userland Date: Mon, 17 Oct 2022 06:57:09 -0400 Message-Id: <20221017105709.10830-10-jlayton@kernel.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221017105709.10830-1-jlayton@kernel.org> References: <20221017105709.10830-1-jlayton@kernel.org> 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?1746932422455917516?= X-GMAIL-MSGID: =?utf-8?q?1746932422455917516?= From: Jeff Layton Claim one of the spare fields in struct statx to hold a 64-bit inode version attribute. When userland requests STATX_VERSION, copy the value from the kstat struct there, and stop masking off STATX_ATTR_VERSION_MONOTONIC. Update the test-statx sample program to output the change attr and MountId. Reviewed-by: NeilBrown Signed-off-by: Jeff Layton --- fs/stat.c | 12 +++--------- include/linux/stat.h | 9 --------- include/uapi/linux/stat.h | 6 ++++-- samples/vfs/test-statx.c | 8 ++++++-- 4 files changed, 13 insertions(+), 22 deletions(-) Posting this as an RFC as we're still trying to sort out what semantics we want to present to userland. In particular, this patch leaves the problem of crash resilience in to userland applications on filesystems that don't report as MONOTONIC. Trond is of the opinion that monotonicity is a hard requirement, and that we should not allow filesystems that can't provide that quality to report STATX_VERSION at all. His rationale is that one of the main uses for this is for backup applications, and for those a counter that could go backward is worse than useless. I don't have strong feelings either way, but if we want that then we will not be able to offload the crash counter handling to userland. Thoughts? diff --git a/fs/stat.c b/fs/stat.c index e7f8cd4b24e1..8396c372022f 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -593,11 +593,9 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer) memset(&tmp, 0, sizeof(tmp)); - /* STATX_VERSION is kernel-only for now */ - tmp.stx_mask = stat->result_mask & ~STATX_VERSION; + tmp.stx_mask = stat->result_mask; tmp.stx_blksize = stat->blksize; - /* STATX_ATTR_VERSION_MONOTONIC is kernel-only for now */ - tmp.stx_attributes = stat->attributes & ~STATX_ATTR_VERSION_MONOTONIC; + tmp.stx_attributes = stat->attributes; 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); @@ -621,6 +619,7 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer) tmp.stx_mnt_id = stat->mnt_id; tmp.stx_dio_mem_align = stat->dio_mem_align; tmp.stx_dio_offset_align = stat->dio_offset_align; + tmp.stx_version = stat->version; return copy_to_user(buffer, &tmp, sizeof(tmp)) ? -EFAULT : 0; } @@ -636,11 +635,6 @@ int do_statx(int dfd, struct filename *filename, unsigned int flags, if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE) return -EINVAL; - /* STATX_VERSION is kernel-only for now. Ignore requests - * from userland. - */ - mask &= ~STATX_VERSION; - 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 4e9428d86a3a..69c79e4fd1b1 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -54,13 +54,4 @@ struct kstat { u32 dio_offset_align; u64 version; }; - -/* These definitions are internal to the kernel for now. Mainly used by nfsd. */ - -/* mask values */ -#define STATX_VERSION 0x40000000U /* Want/got stx_change_attr */ - -/* file attribute values */ -#define STATX_ATTR_VERSION_MONOTONIC 0x8000000000000000ULL /* version monotonically increases */ - #endif diff --git a/include/uapi/linux/stat.h b/include/uapi/linux/stat.h index 7cab2c65d3d7..4a0a1f27c059 100644 --- a/include/uapi/linux/stat.h +++ b/include/uapi/linux/stat.h @@ -127,7 +127,8 @@ struct statx { __u32 stx_dio_mem_align; /* Memory buffer alignment for direct I/O */ __u32 stx_dio_offset_align; /* File offset alignment for direct I/O */ /* 0xa0 */ - __u64 __spare3[12]; /* Spare space for future expansion */ + __u64 stx_version; /* Inode change attribute */ + __u64 __spare3[11]; /* Spare space for future expansion */ /* 0x100 */ }; @@ -154,6 +155,7 @@ struct statx { #define STATX_BTIME 0x00000800U /* Want/got stx_btime */ #define STATX_MNT_ID 0x00001000U /* Got stx_mnt_id */ #define STATX_DIOALIGN 0x00002000U /* Want/got direct I/O alignment info */ +#define STATX_VERSION 0x00004000U /* Want/got stx_version */ #define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */ @@ -189,6 +191,6 @@ struct statx { #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */ #define STATX_ATTR_VERITY 0x00100000 /* [I] Verity protected file */ #define STATX_ATTR_DAX 0x00200000 /* File is currently in DAX state */ - +#define STATX_ATTR_VERSION_MONOTONIC 0x00400000 /* stx_version increases w/ every change */ #endif /* _UAPI_LINUX_STAT_H */ diff --git a/samples/vfs/test-statx.c b/samples/vfs/test-statx.c index 49c7a46cee07..868c9394e038 100644 --- a/samples/vfs/test-statx.c +++ b/samples/vfs/test-statx.c @@ -107,6 +107,8 @@ static void dump_statx(struct statx *stx) printf("Device: %-15s", buffer); if (stx->stx_mask & STATX_INO) printf(" Inode: %-11llu", (unsigned long long) stx->stx_ino); + if (stx->stx_mask & STATX_MNT_ID) + printf(" MountId: %llx", stx->stx_mnt_id); if (stx->stx_mask & STATX_NLINK) printf(" Links: %-5u", stx->stx_nlink); if (stx->stx_mask & STATX_TYPE) { @@ -145,7 +147,9 @@ static void dump_statx(struct statx *stx) if (stx->stx_mask & STATX_CTIME) print_time("Change: ", &stx->stx_ctime); if (stx->stx_mask & STATX_BTIME) - print_time(" Birth: ", &stx->stx_btime); + print_time("Birth: ", &stx->stx_btime); + if (stx->stx_mask & STATX_VERSION) + printf("Inode Version: %llu\n", stx->stx_version); if (stx->stx_attributes_mask) { unsigned char bits, mbits; @@ -218,7 +222,7 @@ int main(int argc, char **argv) struct statx stx; int ret, raw = 0, atflag = AT_SYMLINK_NOFOLLOW; - unsigned int mask = STATX_BASIC_STATS | STATX_BTIME; + unsigned int mask = STATX_BASIC_STATS | STATX_BTIME | STATX_MNT_ID | STATX_VERSION; for (argv++; *argv; argv++) { if (strcmp(*argv, "-F") == 0) {