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. MFC after: 2 week
This commit is contained in:
parent
52e125c2bd
commit
d95c0a12a2
@ -868,11 +868,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];
|
||||
@ -882,11 +884,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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user