On Thu, 2024-01-25 at 11:28 -0500, Chuck Lever wrote: > From: Chuck Lever <chuck.lever@xxxxxxxxxx> > > NFSv4.1 clients assume that if they disconnect, that will force the > server to resend pending callback operations once a fresh connection > has been established. > > Turns out NFSD has not been resending after reconnect. > > Fixes: 7ba6cad6c88f ("nfsd: New helper nfsd4_cb_sequence_done() for processing more cb errors") > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > --- > fs/nfsd/nfs4callback.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c > index b2844abcb51f..1ff64efe1f5c 100644 > --- a/fs/nfsd/nfs4callback.c > +++ b/fs/nfsd/nfs4callback.c > @@ -1171,12 +1171,21 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback > break; > case -ESERVERFAULT: > ++session->se_cb_seq_nr; > - fallthrough; > + nfsd4_mark_cb_fault(cb->cb_clp, cb->cb_seq_status); > + ret = false; > + break; > case 1: > + /* > + * cb_seq_status remains 1 if an RPC Reply was never > + * received. NFSD can't know if the client processed > + * the CB_SEQUENCE operation. Ask the client to send a > + * DESTROY_SESSION to recover. > + */ > + fallthrough; > case -NFS4ERR_BADSESSION: > nfsd4_mark_cb_fault(cb->cb_clp, cb->cb_seq_status); > ret = false; > - break; > + goto need_restart; > case -NFS4ERR_DELAY: > cb->cb_seq_status = 1; > if (!rpc_restart_call(task)) > > > Nice work tracking that down. Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>