mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 21:33:00 +00:00
NFSD: Make nfsd4_rename() wait before returning NFS4ERR_DELAY
nfsd_rename() can kick off a CB_RECALL (via vfs_rename() -> 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_rename() again, once. This version of the patch handles renaming an existing file, but does not deal with renaming onto an existing file. That case will still always trigger an NFS4ERR_DELAY. Link: https://bugzilla.linux-nfs.org/show_bug.cgi?id=354 Tested-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Jeff Layton <jlayton@kernel.org>
This commit is contained in:
parent
34b91dda71
commit
68c522afd0
@ -1696,7 +1696,15 @@ retry:
|
||||
.new_dir = tdir,
|
||||
.new_dentry = ndentry,
|
||||
};
|
||||
host_err = vfs_rename(&rd);
|
||||
int retries;
|
||||
|
||||
for (retries = 1;;) {
|
||||
host_err = vfs_rename(&rd);
|
||||
if (host_err != -EAGAIN || !retries--)
|
||||
break;
|
||||
if (!nfsd_wait_for_delegreturn(rqstp, d_inode(odentry)))
|
||||
break;
|
||||
}
|
||||
if (!host_err) {
|
||||
host_err = commit_metadata(tfhp);
|
||||
if (!host_err)
|
||||
|
Loading…
Reference in New Issue
Block a user