nfsd: handle NFS4ERR_BADSLOT on CB_SEQUENCE better
authorJeff Layton <jlayton@kernel.org>
Sun, 9 Feb 2025 12:31:27 +0000 (07:31 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 10 Mar 2025 13:11:03 +0000 (09:11 -0400)
Currently it just restarts the call, without getting a new slot.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4callback.c

index a9e88df17f7a3c06fa505d5f7a75dea94c0e8db8..39c2f7c8c31901caaeb77a075c97e66679a13cf6 100644 (file)
@@ -1389,6 +1389,13 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback
                rpc_delay(task, 2 * HZ);
                return false;
        case -NFS4ERR_BADSLOT:
+               /*
+                * BADSLOT means that the client and server are out of sync
+                * as to the backchannel parameters. Mark the backchannel faulty
+                * and restart the RPC, but leak the slot so no one uses it.
+                */
+               nfsd4_mark_cb_fault(cb->cb_clp);
+               cb->cb_held_slot = -1;
                goto retry_nowait;
        case -NFS4ERR_SEQ_MISORDERED:
                if (session->se_cb_seq_nr[cb->cb_held_slot] != 1) {