aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2021-10-18 00:50:56 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2021-11-19 05:24:29 +0000
commit6df0510839d03991520f711b01d8d18b3fcfea95 (patch)
treef3e4d4876ce8bbd0cfc00792a166ab6ad42cf82d
parentd1230690019a36c3d545135721b955e2b62dcf51 (diff)
downloadsrc-6df0510839d03991520f711b01d8d18b3fcfea95.tar.gz
src-6df0510839d03991520f711b01d8d18b3fcfea95.zip
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)
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index 78594cffc3ec..615b48abe6bb 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -835,11 +835,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];
@@ -849,11 +851,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:
mbuf_freem(nd->nd_mrep);