On Mon, 2025-01-20 at 18:20 +0100, Amir Goldstein wrote: > v4 client maps NFS4ERR_FILE_OPEN => EBUSY for all operations. > > v4 server only maps EBUSY => NFS4ERR_FILE_OPEN for rmdir()/unlink() > although it is also possible to get EBUSY from rename() for the same > reason (victim is a local mount point). > > Filesystems could return EBUSY for other operations, so just map it > in server for all operations. > > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > > Chuck, > > I ran into this error with a FUSE filesystem and returns -EBUSY on > open, > but I noticed that vfs can also return EBUSY at least for rename(). > > Thanks, > Amir. > > fs/nfsd/vfs.c | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 29cb7b812d713..a61f99c081894 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -100,6 +100,7 @@ nfserrno (int errno) > { nfserr_perm, -ENOKEY }, > { nfserr_no_grace, -ENOGRACE}, > { nfserr_io, -EBADMSG }, > + { nfserr_file_open, -EBUSY}, > }; > int i; > > @@ -2006,14 +2007,7 @@ nfsd_unlink(struct svc_rqst *rqstp, struct > svc_fh *fhp, int type, > out_drop_write: > fh_drop_write(fhp); > out_nfserr: > - if (host_err == -EBUSY) { > - /* name is mounted-on. There is no perfect > - * error status. > - */ > - err = nfserr_file_open; > - } else { > - err = nfserrno(host_err); > - } > + err = nfserrno(host_err); > out: > return err; > out_unlock: If this is a transient error, then it would seem that NFS4ERR_DELAY would be more appropriate. NFS4ERR_FILE_OPEN is not supposed to apply to directories, and so clients would be very confused about how to recover if you were to return it in this situation. -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx