mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
nfsd: fix replies from session cache for retried RPCs
Recent testing of network partitioning a FreeBSD NFSv4.1
server from a Linux NFSv4.1 client identified problems
with both the FreeBSD server and Linux client.
The FreeBSD server failec to reply using the cached
reply in the session slot when an RPC was retried on
the session slot, as indicated by same slot sequence#.
This patch fixes this. It should also fix a similar
failure for NFSv4.0 mounts, when the sequence# in
the open/lock_owner requires a reply be done from
an entry locked into the DRC.
This fix affects the fairly rare case where a NFSv4
client retries a non-idempotent RPC, such as a lock
operation. Note that retries only occur after the
client has needed to create a new TCP connection.
(cherry picked from commit 05a39c2c1c)
This commit is contained in:
parent
b8beded343
commit
0e0aa1eed8
2 changed files with 8 additions and 1 deletions
|
|
@ -410,8 +410,13 @@ nfs_proc(struct nfsrv_descript *nd, u_int32_t xid, SVCXPRT *xprt,
|
|||
m = NULL;
|
||||
if ((nd->nd_flag & ND_HASSEQUENCE) != 0)
|
||||
nfsrv_cache_session(nd, &m);
|
||||
if (nd->nd_repstat == NFSERR_REPLYFROMCACHE)
|
||||
if (nd->nd_repstat == NFSERR_REPLYFROMCACHE) {
|
||||
nd->nd_repstat = 0;
|
||||
if (m != NULL) {
|
||||
m_freem(nd->nd_mreq);
|
||||
nd->nd_mreq = m;
|
||||
}
|
||||
}
|
||||
cacherep = RC_REPLY;
|
||||
} else {
|
||||
if (nd->nd_repstat == NFSERR_DONTREPLY)
|
||||
|
|
|
|||
|
|
@ -1553,6 +1553,8 @@ nfsd_errmap(struct nfsrv_descript *nd)
|
|||
else if (nd->nd_repstat == NFSERR_MINORVERMISMATCH ||
|
||||
nd->nd_repstat == NFSERR_OPILLEGAL)
|
||||
return (txdr_unsigned(nd->nd_repstat));
|
||||
else if (nd->nd_repstat == NFSERR_REPLYFROMCACHE)
|
||||
return (txdr_unsigned(NFSERR_IO));
|
||||
else if ((nd->nd_flag & ND_NFSV41) != 0) {
|
||||
if (nd->nd_repstat == EOPNOTSUPP)
|
||||
nd->nd_repstat = NFSERR_NOTSUPP;
|
||||
|
|
|
|||
Loading…
Reference in a new issue