On 2/7/25 4:53 PM, Jeff Layton wrote: > nfsd4_cb_sequence_done() currently checks RPC_SIGNALLED() when > processing the compound and releasing the slot. If RPC_SIGNALLED() > returns true, then that means that the client is going to be torn down. > > Don't check RPC_SIGNALLED() after processing a successful reply. > Instead, only check that before restarting the rpc_task. If that returns > true, then requeue the callback. This might seem like a nit, but this paragraph didn't make sense to me at all until I changed s/only check that before/check that only before/. > Also, handle rpc_restart_call() and rpc_restart_call_prepare() failures > correctly, by requeueing the callback. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/nfsd/nfs4callback.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) > > diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c > index bb5356e8713a8840bb714859618ff88130825efd..1e601075fac02bd5f01ff89d9252ab23d08c4fd9 100644 > --- a/fs/nfsd/nfs4callback.c > +++ b/fs/nfsd/nfs4callback.c > @@ -1385,8 +1385,8 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback > goto requeue; > case -NFS4ERR_DELAY: > cb->cb_seq_status = 1; > - if (!rpc_restart_call(task)) > - goto out; > + if (RPC_SIGNALLED(task) || !rpc_restart_call(task)) > + goto requeue; > rpc_delay(task, 2 * HZ); > return false; > case -NFS4ERR_BADSLOT: > @@ -1402,14 +1402,16 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback > } > trace_nfsd_cb_free_slot(task, cb); > nfsd41_cb_release_slot(cb); > - > - if (RPC_SIGNALLED(task)) > - goto requeue; > -out: > return ret; > retry_nowait: > - rpc_restart_call_prepare(task); > - goto out; > + /* > + * RPC_SIGNALLED() means that the rpc_client is being torn down and > + * (possibly) recreated. Requeue the call in that case. > + */ > + if (!RPC_SIGNALLED(task)) { > + if (rpc_restart_call_prepare(task)) > + return false; > + } > requeue: > nfsd41_cb_release_slot(cb); > if (!test_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags)) { > -- Chuck Lever