git: 3393002307ad - stable/14 - nfs_commonkrpc.c: Handle NFSERR_DELAY for Sequence correctly

Rick Macklem <[email protected]> Mon, 03 Aug 2026 01:10:43 +0000
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a6fea93.2199d.50c41481__7387.49474273703$1785719476$gmane$org@gitrepo.freebsd.org>
The branch stable/14 has been updated by rmacklem:

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

commit 3393002307adefac3ad21482853c32a53d4a424c
Author:     Rick Macklem <[email protected]>
AuthorDate: 2026-07-27 14:16:29 +0000
Commit:     Rick Macklem <[email protected]>
CommitDate: 2026-08-03 01:09:08 +0000

    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.
    
    (cherry picked from commit 6901cbbd5a2c00d378a7f87426b36d6ee6ce0aa2)
---
 sys/fs/nfs/nfs_commonkrpc.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c
index 7a256366de2e..28f83f460245 100644
--- a/sys/fs/nfs/nfs_commonkrpc.c
+++ b/sys/fs/nfs/nfs_commonkrpc.c
@@ -1127,7 +1127,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 |=