diff options
| author | Rick Macklem <rmacklem@FreeBSD.org> | 2026-07-27 14:16:29 +0000 |
|---|---|---|
| committer | Rick Macklem <rmacklem@FreeBSD.org> | 2026-07-27 14:16:29 +0000 |
| commit | 6901cbbd5a2c00d378a7f87426b36d6ee6ce0aa2 (patch) | |
| tree | 4e26ba64dddef6980e26df0c1c1bcb71101b846a | |
| parent | cf3eeeb75ceb7428c351218e6bd755e11613a633 (diff) | |
nfs_commonkrpc.c: Handle NFSERR_DELAY for Sequence correctly
Unlike RFC5661 (the original NFSv4.1 RFC), RFC8881 specifies
that a NFS4ERR_DELAY reply to the SEQUENCE operation requires
a reply using the same slot/sequence#.
This patch fixes handling of this case, so it conforms to
RFC8881.
Reported by: J. David (j.david.lists@gmail.com)
Tested by: J. David (j.david.lists@gmail.com)
MFC after: 1 week
| -rw-r--r-- | sys/fs/nfs/nfs_commonkrpc.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c index f30ae7cbffa2..dd189a4aa909 100644 --- a/sys/fs/nfs/nfs_commonkrpc.c +++ b/sys/fs/nfs/nfs_commonkrpc.c @@ -1145,7 +1145,20 @@ tryagain: if ((nmp != NULL && i == NFSV4OP_SEQUENCE && j != 0) || (clp != NULL && i == NFSV4OP_CBSEQUENCE && j != 0)) { NFSCL_DEBUG(1, "failed seq=%d\n", j); - if (sep != NULL && i == NFSV4OP_SEQUENCE && + KASSERT(slot == -1, ("newnfs_request: slot not" + " -1")); + /* + * RFC8881 (unlike RFC5661) specifies that a + * NFSERR_DELAY reply to SEQUENCE is handled + * by a retry with same slot/sequence#. + * (Although not explicit, I will assume this + * applies to CB_SEQUENCE as well.) + */ + if (j == NFSERR_DELAY) { + nd->nd_repstat = + NFSERR_RETRYUNCACHEDREP; + } else if (sep != NULL && + i == NFSV4OP_SEQUENCE && j == NFSERR_SEQMISORDERED) { mtx_lock(&sep->nfsess_mtx); sep->nfsess_badslots |= |
