Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp49239pxb; Wed, 14 Apr 2021 09:09:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJygOS2B/wUc2ApPQY/sCDEKxYYXe7foLsa7mMHr0odC9fdOM2TGUO5SWZ77ov3O50gh9q7r X-Received: by 2002:a17:902:b908:b029:e9:4010:7fd3 with SMTP id bf8-20020a170902b908b02900e940107fd3mr38725431plb.55.1618416571643; Wed, 14 Apr 2021 09:09:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618416571; cv=none; d=google.com; s=arc-20160816; b=ZRZriHCnO2QyuS95gIQA8CDg67lQdcEBownOrUNpQnViIJWoxY/YWRZ3CLOTbdKAoC hepW7JmY/+sRGJj4NqboRNR8V8uenntkC67vzNONo0KobPwfhAUTzRTtGW42VfmvGx90 ZgW0Q4KhpUoOxjRXFH4Am8cE9De1ZWnf0ZulJSFEzaM34x0ef1ZOgyXIX6cCOuia1PWf 9y47PRAB0JNtA5WROg/D23MwS+hYEM/t7Zkvc1v/8NZtmb4URQPemBkyrYGpbMNjCquX kWi1YM4EIIXs/PskhcjFobX5jES1qAZdPDLMKabGXf5+8EhuhUS0gR54oZ22xmVkaf+3 elyA== 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:to:from :dkim-signature; bh=9HnSjXV7acSsJqjpGagHsPcesekIvm15jGFkCmZKG4Y=; b=sWUY0atfDDxDfQ4XDskxlclMBZr2idyqPSTktTqXQ2o4BbIzF9g6kaSnpufcguxRe1 uSgAV0MID2xxZwC3olOnYgo3YlV6mpP3HVJMV3KBQAJv9HF7E7AIaN7PJD4/QI3fXmWl P+Y6rb2jT9coiqO5pGp6rS/PsAKWTdpjhYGEVMhJT20/fzYNyVzr+6atisA1GS75OPBg +8OUhFPW+VY03GUxlbWq5F4ehGvXa49hPPwEw3qF5IO51WMxpksLl1wDr5IMTFBEsoYN DSwm1UwBwx2KK6vpsUkHprPy4NE6xMgkK1Kk7GIC71YUbupz+/vV9rvyVfQ72dkiP6Gc mNeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=dzm54Sdn; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a11si601511pgt.592.2021.04.14.09.09.17; Wed, 14 Apr 2021 09:09:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=dzm54Sdn; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-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 S1351580AbhDNNok (ORCPT + 99 others); Wed, 14 Apr 2021 09:44:40 -0400 Received: from mail.kernel.org ([198.145.29.99]:52172 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1351616AbhDNNo0 (ORCPT ); Wed, 14 Apr 2021 09:44:26 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id AFA7F61220 for ; Wed, 14 Apr 2021 13:44:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1618407844; bh=5ilTz7jzkLZ0bTvhaqWAlN/JNQVQkww1lFJcy5vfh90=; h=From:To:Subject:Date:In-Reply-To:References:From; b=dzm54Sdn/UcdER+kKkjSqLjqJv89lXia+G4+HNlsArqHpRMsFUg6Vxz5+hCnEGJ7s ERqJCBFiZnF3UXqgN7u/gDOWALkGVN0zqCua4nR8ipbrqdUAIoNtExhl1BSz4QwE/O GCpDRqEvKRHcc4oyvk9zzi/TV7KTfHJqk8KO2DKVESQjwPcdncgTplbfckPixI87Nx QWPjbOWS2ojP5FD/WjXiZ2fTW3pEAAdcbyU5wzQoBx69syH8XNwJXhwJMbsXf6UtVo pkzIgyPLVcscixGMykU9h3XQyZIlD4rODd+SJFjcgy0IjNDqVSHHxsTsgxcx5j7rAq NI6/keoHZ3IPw== From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v2 22/26] NFS: Another inode revalidation improvement Date: Wed, 14 Apr 2021 09:43:49 -0400 Message-Id: <20210414134353.11860-23-trondmy@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210414134353.11860-22-trondmy@kernel.org> References: <20210414134353.11860-1-trondmy@kernel.org> <20210414134353.11860-2-trondmy@kernel.org> <20210414134353.11860-3-trondmy@kernel.org> <20210414134353.11860-4-trondmy@kernel.org> <20210414134353.11860-5-trondmy@kernel.org> <20210414134353.11860-6-trondmy@kernel.org> <20210414134353.11860-7-trondmy@kernel.org> <20210414134353.11860-8-trondmy@kernel.org> <20210414134353.11860-9-trondmy@kernel.org> <20210414134353.11860-10-trondmy@kernel.org> <20210414134353.11860-11-trondmy@kernel.org> <20210414134353.11860-12-trondmy@kernel.org> <20210414134353.11860-13-trondmy@kernel.org> <20210414134353.11860-14-trondmy@kernel.org> <20210414134353.11860-15-trondmy@kernel.org> <20210414134353.11860-16-trondmy@kernel.org> <20210414134353.11860-17-trondmy@kernel.org> <20210414134353.11860-18-trondmy@kernel.org> <20210414134353.11860-19-trondmy@kernel.org> <20210414134353.11860-20-trondmy@kernel.org> <20210414134353.11860-21-trondmy@kernel.org> <20210414134353.11860-22-trondmy@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust If we're trying to update the inode because a previous update left the cache in a partially unrevalidated state, then allow the update if the change attrs match. Signed-off-by: Trond Myklebust --- fs/nfs/inode.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index d218d164414f..b88e9dc72eec 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -1754,6 +1754,34 @@ static int nfs_inode_attrs_cmp(const struct nfs_fattr *fattr, return 0; } +/** + * nfs_inode_finish_partial_attr_update - complete a previous inode update + * @fattr: attributes + * @inode: pointer to inode + * + * Returns '1' if the last attribute update left the inode cached + * attributes in a partially unrevalidated state, and @fattr + * matches the change attribute of that partial update. + * Otherwise returns '0'. + */ +static int nfs_inode_finish_partial_attr_update(const struct nfs_fattr *fattr, + const struct inode *inode) +{ + const unsigned long check_valid = + NFS_INO_INVALID_ATIME | NFS_INO_INVALID_CTIME | + NFS_INO_INVALID_MTIME | NFS_INO_INVALID_SIZE | + NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_OTHER | + NFS_INO_INVALID_NLINK; + unsigned long cache_validity = NFS_I(inode)->cache_validity; + + if (!(cache_validity & NFS_INO_INVALID_CHANGE) && + (cache_validity & check_valid) != 0 && + (fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 && + nfs_inode_attrs_cmp_monotonic(fattr, inode) == 0) + return 1; + return 0; +} + static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr) { @@ -1762,7 +1790,7 @@ static int nfs_refresh_inode_locked(struct inode *inode, trace_nfs_refresh_inode_enter(inode); - if (attr_cmp > 0) + if (attr_cmp > 0 || nfs_inode_finish_partial_attr_update(fattr, inode)) ret = nfs_update_inode(inode, fattr); else if (attr_cmp == 0) ret = nfs_check_inode_attributes(inode, fattr); -- 2.30.2