mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
[PATCH] r/o bind mounts: get write access for vfs_rename() callers
This also uses the little helper in the NFS code to make an if() a little bit less ugly. We introduced the helper at the beginning of the series. Acked-by: Al Viro <viro@ZenIV.linux.org.uk> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Hansen <haveblue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
75c3f29de7
commit
9079b1eb17
2 changed files with 17 additions and 4 deletions
|
@ -2718,8 +2718,12 @@ static int do_rename(int olddfd, const char *oldname,
|
|||
if (new_dentry == trap)
|
||||
goto exit5;
|
||||
|
||||
error = mnt_want_write(oldnd.path.mnt);
|
||||
if (error)
|
||||
goto exit5;
|
||||
error = vfs_rename(old_dir->d_inode, old_dentry,
|
||||
new_dir->d_inode, new_dentry);
|
||||
mnt_drop_write(oldnd.path.mnt);
|
||||
exit5:
|
||||
dput(new_dentry);
|
||||
exit4:
|
||||
|
|
|
@ -1710,13 +1710,20 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
|
|||
if (ndentry == trap)
|
||||
goto out_dput_new;
|
||||
|
||||
#ifdef MSNFS
|
||||
if ((ffhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
|
||||
if (svc_msnfs(ffhp) &&
|
||||
((atomic_read(&odentry->d_count) > 1)
|
||||
|| (atomic_read(&ndentry->d_count) > 1))) {
|
||||
host_err = -EPERM;
|
||||
} else
|
||||
#endif
|
||||
goto out_dput_new;
|
||||
}
|
||||
|
||||
host_err = -EXDEV;
|
||||
if (ffhp->fh_export->ex_path.mnt != tfhp->fh_export->ex_path.mnt)
|
||||
goto out_dput_new;
|
||||
host_err = mnt_want_write(ffhp->fh_export->ex_path.mnt);
|
||||
if (host_err)
|
||||
goto out_dput_new;
|
||||
|
||||
host_err = vfs_rename(fdir, odentry, tdir, ndentry);
|
||||
if (!host_err && EX_ISSYNC(tfhp->fh_export)) {
|
||||
host_err = nfsd_sync_dir(tdentry);
|
||||
|
@ -1724,6 +1731,8 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
|
|||
host_err = nfsd_sync_dir(fdentry);
|
||||
}
|
||||
|
||||
mnt_drop_write(ffhp->fh_export->ex_path.mnt);
|
||||
|
||||
out_dput_new:
|
||||
dput(ndentry);
|
||||
out_dput_old:
|
||||
|
|
Loading…
Reference in a new issue