On 2/7/25 4:53 PM, Jeff Layton wrote: > For NFS4ERR_SEQ_MISORDERED, do one attempt with a seqid of 1, and then > fall back to treating it like a BADSLOT if that fails. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/nfsd/nfs4callback.c | 16 ++++++++++------ > 1 file changed, 10 insertions(+), 6 deletions(-) > > diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c > index 10067a34db3afff8d4e4383854ab9abd9767c2d6..d6e3e8bb2efabadda9f922318880e12e1cb2c23f 100644 > --- a/fs/nfsd/nfs4callback.c > +++ b/fs/nfsd/nfs4callback.c > @@ -1393,6 +1393,16 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback > goto requeue; > rpc_delay(task, 2 * HZ); > return false; > + case -NFS4ERR_SEQ_MISORDERED: > + /* > + * Reattempt once with seq_nr 1. If that fails, treat this > + * like BADSLOT. > + */ Nit: this comment says exactly what the code says. If it were me, I'd remove it. Is there a "why" statement that could be made here? Like, why retry with a seq_nr of 1 instead of just failing immediately? > + if (session->se_cb_seq_nr[cb->cb_held_slot] != 1) { > + session->se_cb_seq_nr[cb->cb_held_slot] = 1; > + goto retry_nowait; > + } > + fallthrough; > case -NFS4ERR_BADSLOT: > /* > * BADSLOT means that the client and server are out of sync > @@ -1403,12 +1413,6 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback > 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) { > - session->se_cb_seq_nr[cb->cb_held_slot] = 1; > - goto retry_nowait; > - } > - break; > default: > nfsd4_mark_cb_fault(cb->cb_clp); > } > -- Chuck Lever