On Mon, 2025-08-11 at 14:18 -0400, Olga Kornievskaia wrote: > When v3 NLM request finds a conflicting delegation, it triggers > a delegation recall and nfsd_open fails with EAGAIN. nfsd_open > then translates EAGAIN into nfserr_jukebox. In nlm_fopen, instead > of returning nlm_failed for when there is a conflicting delegation, > drop this NLM request so that the client retries. Once delegation > is recalled and if a local lock is claimed, a retry would lead to > nfsd returning a nlm_lck_blocked error or a successful nlm lock. > > Signed-off-by: Olga Kornievskaia <okorniev@xxxxxxxxxx> > --- > fs/nfsd/lockd.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/nfsd/lockd.c b/fs/nfsd/lockd.c > index edc9f75dc75c..ad3e461f30c0 100644 > --- a/fs/nfsd/lockd.c > +++ b/fs/nfsd/lockd.c > @@ -57,6 +57,7 @@ nlm_fopen(struct svc_rqst *rqstp, struct nfs_fh *f, struct file **filp, > switch (nfserr) { > case nfs_ok: > return 0; > + case nfserr_jukebox: > case nfserr_dropit: > return nlm_drop_reply; > case nfserr_stale: This works by triggering a RPC retransmission. That could time out on soft mounts if it takes a while to return a delegation. Looking at the NLM spec here: https://pubs.opengroup.org/onlinepubs/9629799/chap14.htm What about returning NLM4_DENIED instead? The description there is: NLM4_DENIED The call failed. For attempts to set a lock, this status implies that if the client retries the call later, it may succeed. Presumably the client should redrive this effectively indefinitely that way? -- Jeff Layton <jlayton@xxxxxxxxxx>