mirror of
https://github.com/torvalds/linux.git
synced 2025-11-30 23:16:01 +07:00
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: Jeff Layton <jlayton@kernel.org> Signed-off-by: NeilBrown <neil@brown.name> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
e66ccd30dc
commit
d7fb2c4102
@@ -387,10 +387,9 @@ try_again:
|
||||
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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
17
fs/namei.c
17
fs/namei.c
@@ -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 @@ retry_deleg:
|
||||
|
||||
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);
|
||||
|
||||
@@ -1943,10 +1943,9 @@ retry:
|
||||
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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -770,10 +770,9 @@ retry:
|
||||
goto out4;
|
||||
}
|
||||
|
||||
rd.old_mnt_idmap = mnt_idmap(old_path->mnt),
|
||||
rd.mnt_idmap = mnt_idmap(old_path->mnt),
|
||||
rd.old_parent = old_parent,
|
||||
rd.old_dentry = old_child,
|
||||
rd.new_mnt_idmap = mnt_idmap(new_path.mnt),
|
||||
rd.new_parent = new_path.dentry,
|
||||
rd.new_dentry = new_dentry,
|
||||
rd.flags = flags,
|
||||
|
||||
@@ -2008,20 +2008,18 @@ int vfs_unlink(struct mnt_idmap *, struct inode *, struct dentry *,
|
||||
|
||||
/**
|
||||
* struct renamedata - contains all information required for renaming
|
||||
* @old_mnt_idmap: idmap of the old mount the inode was found from
|
||||
* @mnt_idmap: idmap of the mount in which the rename is happening.
|
||||
* @old_parent: parent of source
|
||||
* @old_dentry: source
|
||||
* @new_mnt_idmap: idmap of the new mount the inode was found from
|
||||
* @new_parent: parent of destination
|
||||
* @new_dentry: destination
|
||||
* @delegated_inode: returns an inode needing a delegation break
|
||||
* @flags: rename flags
|
||||
*/
|
||||
struct renamedata {
|
||||
struct mnt_idmap *old_mnt_idmap;
|
||||
struct mnt_idmap *mnt_idmap;
|
||||
struct dentry *old_parent;
|
||||
struct dentry *old_dentry;
|
||||
struct mnt_idmap *new_mnt_idmap;
|
||||
struct dentry *new_parent;
|
||||
struct dentry *new_dentry;
|
||||
struct inode **delegated_inode;
|
||||
|
||||
Reference in New Issue
Block a user