From nobody Tue Nov 21 23:59:47 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SZhFJ1Wcgz51Lj8; Tue, 21 Nov 2023 23:59:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SZhFJ127wz4XT2; Tue, 21 Nov 2023 23:59:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1700611188; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jPBorzLVip8mfrL719V9um0KUh6nmeZ57AjW3ks03HI=; b=ZA96T/exFraknM0QZY01W+vodchkAUYkU3is3UKTrRYw5aI53BtzOBYgVTmXCAe6qc93w/ Xxqwah/ccccmEzSJEsqXnBQ+1BlDUrhdYDsDMAdxlSpOaVTTx15Ya7ZTM2Zh12OqA1pc43 E0Wk1iDsFRVj08Q2uN0zHgDjxx4LcTalGRaxMe5KjrqP1cqP9n/CeiM00/9CEbkMCZwXs+ P5cIb++ag6Tpf0h471FEt6nvZNs2/PgKCPl0nCOt32JSK9zdOQfWZ9vitnsKOaqJxmDzbj ZTvle0JU9ghuhEiuZfssqBkyYVVR1256Fs3xjbXQCSZfOR+Nk2/9/V6d1cXhfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1700611188; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jPBorzLVip8mfrL719V9um0KUh6nmeZ57AjW3ks03HI=; b=Vyoh2h/zB1UFRkLfI5GYFPfddyaS5OpcPFxTbSiO+xny4z8yFdvHorwAe7AbQnvhZiFOci xyQemjoO20D3dxw7Mg1Uxi98lnKSXgHVqYX6mCQH/00euJ9CtnrinmvbbgHu/kNN8nvVt1 keDWYhTLwLyaz2hYYFcNAt8qqoDBTTlcmqdM+C6L2Miqxl3WZVaQlrx9mcWUkLOBd55yz4 8igVoPK87QSG8iRgNPaXg5F8QsIFSY5RnLNd6TBl5n9dXEGRsfJcwgvw45D9dKJv7HPc0r oT1OuJBFrTK4t7T5fXLV29hkF17cR33ZwyjlpuPSseTJP3tK7kVEfku/CSl0pA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1700611188; a=rsa-sha256; cv=none; b=tdfXcqiFZhcHGYXgJQddamvOYFOFgaZv4zCuUu8jTvX0rShZNBGrNwbjmjmsjOOtyB6yQn 6yjjDK4E3z51ijc+E5xQgqLbk4IlcGMnkVVVbL1UOnoTscXX3g+kP7ETTg0IDfC32jWZGn Sr5C23UG+SdFpaSi1YZh0Aem+35N+UWBffJxK2aZ6JNvtyndd0Afs3yGDF0ELk/rgM8GvZ DEhY9HJZvD9ETun/VU+3mJhxy8aByEy1aluIE3Kr1h1icXCfizjXMn3IztcdsF6CZp3WuO GgBKC/QYiTpHSm8Im2/RcLd06sxMBeh0m30EW9XjeQS/ISFGI1WfvE/V3tIkLg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4SZhFJ044BzwWC; Tue, 21 Nov 2023 23:59:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3ALNxlGw081235; Tue, 21 Nov 2023 23:59:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3ALNxlQ8081232; Tue, 21 Nov 2023 23:59:47 GMT (envelope-from git) Date: Tue, 21 Nov 2023 23:59:47 GMT Message-Id: <202311212359.3ALNxlQ8081232@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Rick Macklem Subject: git: 55671098064f - stable/14 - nfscl: Handle a Getattr failure with NFSERR_DELAY following Open List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rmacklem X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 55671098064f715ae106225513a7241bd6aa46b0 Auto-Submitted: auto-generated The branch stable/14 has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=55671098064f715ae106225513a7241bd6aa46b0 commit 55671098064f715ae106225513a7241bd6aa46b0 Author: Rick Macklem AuthorDate: 2023-10-22 01:33:33 +0000 Commit: Rick Macklem CommitDate: 2023-11-21 23:57:43 +0000 nfscl: Handle a Getattr failure with NFSERR_DELAY following Open During testing at a recent IETF NFSv4 Bakeathon, a non-FreeBSD server was rebooted. After the reboot, the FreeBSD client sent an Open/Claim_previous with a Getattr after the Open in the same compound. The Open/Claim_previous was done to recover the Open and a Delegation for for a file. The Open succeeded, but the Getattr after the Open failed with NFSERR_DELAY. This resulted in the FreeBSD client retrying the entire RPC over and over again, until the server's recovery grace period ended. Since the Open succeeded, there was no need to retry the entire RPC. This patch modifies the NFSv4 client side recovery Open/Claim_previous RPC reply handling to deal with this case. With this patch, the Getattr reply of NFSERR_DELAY is ignored and the successful Open reply is processed. This bug will not normally affect users, since this non-FreeBSD server is not widely used (it may not even have shipped to any customers). (cherry picked from commit 14bbf4fe5abb20f1126168e66b03127ae920f78e) --- sys/fs/nfsclient/nfs_clrpcops.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c index 5a16a28bd83e..207a51c4aece 100644 --- a/sys/fs/nfsclient/nfs_clrpcops.c +++ b/sys/fs/nfsclient/nfs_clrpcops.c @@ -609,7 +609,8 @@ nfsrpc_openrpc(struct nfsmount *nmp, vnode_t vp, u_int8_t *nfhp, int fhlen, if (error) return (error); NFSCL_INCRSEQID(op->nfso_own->nfsow_seqid, nd); - if (!nd->nd_repstat) { + if (nd->nd_repstat == 0 || (nd->nd_repstat == NFSERR_DELAY && + reclaim != 0 && (nd->nd_flag & ND_NOMOREDATA) == 0)) { NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED); op->nfso_stateid.seqid = *tl++; @@ -681,16 +682,29 @@ nfsrpc_openrpc(struct nfsmount *nmp, vnode_t vp, u_int8_t *nfhp, int fhlen, goto nfsmout; } NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED); - error = nfsv4_loadattr(nd, NULL, &nfsva, NULL, - NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, - NULL, NULL, NULL, p, cred); - if (error) - goto nfsmout; + /* If the 2nd element == NFS_OK, the Getattr succeeded. */ + if (*++tl == 0) { + KASSERT(nd->nd_repstat == 0, + ("nfsrpc_openrpc: Getattr repstat")); + error = nfsv4_loadattr(nd, NULL, &nfsva, NULL, + NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, + NULL, NULL, NULL, p, cred); + if (error) + goto nfsmout; + } if (ndp != NULL) { - ndp->nfsdl_change = nfsva.na_filerev; - ndp->nfsdl_modtime = nfsva.na_mtime; - ndp->nfsdl_flags |= NFSCLDL_MODTIMESET; + if (reclaim != 0 && dp != NULL) { + ndp->nfsdl_change = dp->nfsdl_change; + ndp->nfsdl_modtime = dp->nfsdl_modtime; + ndp->nfsdl_flags |= NFSCLDL_MODTIMESET; + } else if (nd->nd_repstat == 0) { + ndp->nfsdl_change = nfsva.na_filerev; + ndp->nfsdl_modtime = nfsva.na_mtime; + ndp->nfsdl_flags |= NFSCLDL_MODTIMESET; + } else + ndp->nfsdl_flags |= NFSCLDL_RECALL; } + nd->nd_repstat = 0; if (!reclaim && (rflags & NFSV4OPEN_RESULTCONFIRM)) { do { ret = nfsrpc_openconfirm(vp, newfhp, newfhlen, op,