Unverified Commit d7fb2c41 authored by NeilBrown's avatar NeilBrown Committed by Christian Brauner
Browse files

VFS: unify old_mnt_idmap and new_mnt_idmap in renamedata



A rename operation can only rename within a single mount.  Callers of
vfs_rename() must and do ensure this is the case.

So there is no point in having two mnt_idmaps in renamedata as they are
always the same.  Only one of them is passed to ->rename in any case.

This patch replaces both with a single "mnt_idmap" and changes all
callers.

Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarNeilBrown <neil@brown.name>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent e66ccd30
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -387,10 +387,9 @@ int cachefiles_bury_object(struct cachefiles_cache *cache,
		cachefiles_io_error(cache, "Rename security error %d", ret);
	} else {
		struct renamedata rd = {
			.old_mnt_idmap	= &nop_mnt_idmap,
			.mnt_idmap	= &nop_mnt_idmap,
			.old_parent	= dir,
			.old_dentry	= rep,
			.new_mnt_idmap	= &nop_mnt_idmap,
			.new_parent	= cache->graveyard,
			.new_dentry	= grave,
		};
+1 −2
Original line number Diff line number Diff line
@@ -634,10 +634,9 @@ ecryptfs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
		goto out_lock;
	}

	rd.old_mnt_idmap	= &nop_mnt_idmap;
	rd.mnt_idmap		= &nop_mnt_idmap;
	rd.old_parent		= lower_old_dir_dentry;
	rd.old_dentry		= lower_old_dentry;
	rd.new_mnt_idmap	= &nop_mnt_idmap;
	rd.new_parent		= lower_new_dir_dentry;
	rd.new_dentry		= lower_new_dentry;
	rc = vfs_rename(&rd);
+8 −9
Original line number Diff line number Diff line
@@ -5077,20 +5077,20 @@ int vfs_rename(struct renamedata *rd)
	if (source == target)
		return 0;

	error = may_delete(rd->old_mnt_idmap, old_dir, old_dentry, is_dir);
	error = may_delete(rd->mnt_idmap, old_dir, old_dentry, is_dir);
	if (error)
		return error;

	if (!target) {
		error = may_create(rd->new_mnt_idmap, new_dir, new_dentry);
		error = may_create(rd->mnt_idmap, new_dir, new_dentry);
	} else {
		new_is_dir = d_is_dir(new_dentry);

		if (!(flags & RENAME_EXCHANGE))
			error = may_delete(rd->new_mnt_idmap, new_dir,
			error = may_delete(rd->mnt_idmap, new_dir,
					   new_dentry, is_dir);
		else
			error = may_delete(rd->new_mnt_idmap, new_dir,
			error = may_delete(rd->mnt_idmap, new_dir,
					   new_dentry, new_is_dir);
	}
	if (error)
@@ -5105,13 +5105,13 @@ int vfs_rename(struct renamedata *rd)
	 */
	if (new_dir != old_dir) {
		if (is_dir) {
			error = inode_permission(rd->old_mnt_idmap, source,
			error = inode_permission(rd->mnt_idmap, source,
						 MAY_WRITE);
			if (error)
				return error;
		}
		if ((flags & RENAME_EXCHANGE) && new_is_dir) {
			error = inode_permission(rd->new_mnt_idmap, target,
			error = inode_permission(rd->mnt_idmap, target,
						 MAY_WRITE);
			if (error)
				return error;
@@ -5179,7 +5179,7 @@ int vfs_rename(struct renamedata *rd)
		if (error)
			goto out;
	}
	error = old_dir->i_op->rename(rd->new_mnt_idmap, old_dir, old_dentry,
	error = old_dir->i_op->rename(rd->mnt_idmap, old_dir, old_dentry,
				      new_dir, new_dentry, flags);
	if (error)
		goto out;
@@ -5322,10 +5322,9 @@ int do_renameat2(int olddfd, struct filename *from, int newdfd,

	rd.old_parent	   = old_path.dentry;
	rd.old_dentry	   = old_dentry;
	rd.old_mnt_idmap   = mnt_idmap(old_path.mnt);
	rd.mnt_idmap	   = mnt_idmap(old_path.mnt);
	rd.new_parent	   = new_path.dentry;
	rd.new_dentry	   = new_dentry;
	rd.new_mnt_idmap   = mnt_idmap(new_path.mnt);
	rd.delegated_inode = &delegated_inode;
	rd.flags	   = flags;
	error = vfs_rename(&rd);
+1 −2
Original line number Diff line number Diff line
@@ -1943,10 +1943,9 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
		goto out_dput_old;
	} else {
		struct renamedata rd = {
			.old_mnt_idmap	= &nop_mnt_idmap,
			.mnt_idmap	= &nop_mnt_idmap,
			.old_parent	= fdentry,
			.old_dentry	= odentry,
			.new_mnt_idmap	= &nop_mnt_idmap,
			.new_parent	= tdentry,
			.new_dentry	= ndentry,
		};
+1 −2
Original line number Diff line number Diff line
@@ -361,10 +361,9 @@ static inline int ovl_do_rename(struct ovl_fs *ofs, struct dentry *olddir,
{
	int err;
	struct renamedata rd = {
		.old_mnt_idmap	= ovl_upper_mnt_idmap(ofs),
		.mnt_idmap	= ovl_upper_mnt_idmap(ofs),
		.old_parent	= olddir,
		.old_dentry	= olddentry,
		.new_mnt_idmap	= ovl_upper_mnt_idmap(ofs),
		.new_parent	= newdir,
		.new_dentry	= newdentry,
		.flags		= flags,
Loading