On Sun, 2023-10-15 at 18:29 +0100, Al Viro wrote: > ... checking that after lock_rename() is too late. Incidentally, > NFSv2 had no nfserr_xdev... > > Fixes: aa387d6ce153 "nfsd: fix EXDEV checking in rename" > Cc: stable@xxxxxxxxxxxxxxx # v3.9+ > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > --- > > [in git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #nfsd-fix; > it's an immutable branch, please either pull from it or put that thing > into an immutable branch in your tree - there's a lock_rename-related > series in the making and I'd rather avoid mixing unrelated nfsd stuff > into it ;-/] > > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 48260cf68fde..02f5fcaad03f 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -1788,6 +1788,12 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, > if (!flen || isdotent(fname, flen) || !tlen || isdotent(tname, tlen)) > goto out; > > + err = (rqstp->rq_vers == 2) ? nfserr_acces : nfserr_xdev; > + if (ffhp->fh_export->ex_path.mnt != tfhp->fh_export->ex_path.mnt) > + goto out; > + if (ffhp->fh_export->ex_path.dentry != tfhp->fh_export->ex_path.dentry) > + goto out; > + > retry: > host_err = fh_want_write(ffhp); > if (host_err) { > @@ -1823,12 +1829,6 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, > if (ndentry == trap) > goto out_dput_new; > > - host_err = -EXDEV; > - if (ffhp->fh_export->ex_path.mnt != tfhp->fh_export->ex_path.mnt) > - goto out_dput_new; > - if (ffhp->fh_export->ex_path.dentry != tfhp->fh_export->ex_path.dentry) > - goto out_dput_new; > - > if ((ndentry->d_sb->s_export_op->flags & EXPORT_OP_CLOSE_BEFORE_UNLINK) && > nfsd_has_cached_files(ndentry)) { > close_cached = true; I ran this through pynfs and fstests (via kdevops) and it seemed to do fine. You can also add: Tested-by: Jeff Layton <jlayton@xxxxxxxxxx>