git: d37e54c771d3 - stable/13 - nfscl: Modify Close RPC so that it does not use "owner" for NFSv4.1/4.2

From: Rick Macklem <rmacklem_at_FreeBSD.org>
Date: Mon, 01 Nov 2021 02:04:32 UTC
The branch stable/13 has been updated by rmacklem:

URL: https://cgit.FreeBSD.org/src/commit/?id=d37e54c771d300665383e0a19d8ce8bec35e42e4

commit d37e54c771d300665383e0a19d8ce8bec35e42e4
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2021-10-18 00:50:56 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2021-11-01 02:01:03 +0000

    nfscl: Modify Close RPC so that it does not use "owner" for NFSv4.1/4.2
    
    This patch modifies the function that does the Close RPC (nfsrpc_closerpc)
    so that it does not use the open_owner (nfso_own) for NFSv4.1/4.2.
    Use of the seqid in the open_owner structure is only needed for NFSv4.0.
    Same applies to a NFSERR_STALESTATEID reply, which should only happen
    for NFSv4.0.  This allows nfsrpc_closerpc() to be called when nfso_own
    is no longer valid.  This, in turn, allows nfsrpc_closerpc() to be called
    after the shared lock on the clientID is released, for NFSv4.1/4.2.
    
    This is being done to prepare the code for a future patch that fixes
    the case where an NFSv4.1/4.2 server replies NFSERR_DELAY to a Close
    operation.
    
    (cherry picked from commit d95c0a12a2dd58b4b13cbc2d1a9fccd848f8ac5e)
---
 sys/fs/nfsclient/nfs_clrpcops.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index fc7d8687be77..ab25306a9c29 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -866,11 +866,13 @@ nfsrpc_closerpc(struct nfsrv_descript *nd, struct nfsmount *nmp,
 	nfscl_reqstart(nd, NFSPROC_CLOSE, nmp, op->nfso_fh,
 	    op->nfso_fhlen, NULL, NULL, 0, 0);
 	NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_STATEID);
-	*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
-	if (NFSHASNFSV4N(nmp))
+	if (NFSHASNFSV4N(nmp)) {
 		*tl++ = 0;
-	else
+		*tl++ = 0;
+	} else {
+		*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
 		*tl++ = op->nfso_stateid.seqid;
+	}
 	*tl++ = op->nfso_stateid.other[0];
 	*tl++ = op->nfso_stateid.other[1];
 	*tl = op->nfso_stateid.other[2];
@@ -880,11 +882,12 @@ nfsrpc_closerpc(struct nfsrv_descript *nd, struct nfsmount *nmp,
 	    NFS_PROG, NFS_VER4, NULL, 1, NULL, NULL);
 	if (error)
 		return (error);
-	NFSCL_INCRSEQID(op->nfso_own->nfsow_seqid, nd);
+	if (!NFSHASNFSV4N(nmp))
+		NFSCL_INCRSEQID(op->nfso_own->nfsow_seqid, nd);
 	if (nd->nd_repstat == 0)
 		NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
 	error = nd->nd_repstat;
-	if (error == NFSERR_STALESTATEID)
+	if (!NFSHASNFSV4N(nmp) && error == NFSERR_STALESTATEID)
 		nfscl_initiate_recovery(op->nfso_own->nfsow_clp);
 nfsmout:
 	m_freem(nd->nd_mrep);