[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
					
				| @ -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 New Issue
	
	Block a user