This is a note to let you know that I've just added the patch titled NFSD: Make nfsd4_remove() wait before returning NFS4ERR_DELAY to the 5.10-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: nfsd-make-nfsd4_remove-wait-before-returning-nfs4err.patch and it can be found in the queue-5.10 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. commit b3a3ac3401589ea50dc03bdf2df0e450a1dd6b1b Author: Chuck Lever <chuck.lever@xxxxxxxxxx> Date: Thu Sep 8 18:14:25 2022 -0400 NFSD: Make nfsd4_remove() wait before returning NFS4ERR_DELAY [ Upstream commit 5f5f8b6d655fd947e899b1771c2f7cb581a06764 ] nfsd_unlink() can kick off a CB_RECALL (via vfs_unlink() -> leases_conflict()) if a delegation is present. Before returning NFS4ERR_DELAY, give the client holding that delegation a chance to return it and then retry the nfsd_unlink() again, once. Link: https://bugzilla.linux-nfs.org/show_bug.cgi?id=354 Tested-by: Igor Mammedov <imammedo@xxxxxxxxxx> Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> [ cel: backported to 5.10.y, prior to idmapped mounts ] Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 5684845d95119..e29034b1e6128 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1803,9 +1803,18 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, fh_fill_pre_attrs(fhp); if (type != S_IFDIR) { + int retries; + if (rdentry->d_sb->s_export_op->flags & EXPORT_OP_CLOSE_BEFORE_UNLINK) nfsd_close_cached_files(rdentry); - host_err = vfs_unlink(dirp, rdentry, NULL); + + for (retries = 1;;) { + host_err = vfs_unlink(dirp, rdentry, NULL); + if (host_err != -EAGAIN || !retries--) + break; + if (!nfsd_wait_for_delegreturn(rqstp, rinode)) + break; + } } else { host_err = vfs_rmdir(dirp, rdentry); }