A rename can only rename with 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 of 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 <jlay...@kernel.org>
Signed-off-by: NeilBrown <n...@brown.name>
---
 fs/cachefiles/namei.c    |  3 +--
 fs/ecryptfs/inode.c      |  3 +--
 fs/namei.c               | 21 ++++++++++-----------
 fs/nfsd/vfs.c            |  3 +--
 fs/overlayfs/overlayfs.h |  3 +--
 fs/smb/server/vfs.c      |  3 +--
 include/linux/fs.h       |  6 ++----
 7 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index 91dfd0231877..d1edb2ac3837 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c
@@ -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,
                };
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 72fbe1316ab8..abd954c6a14e 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -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);
diff --git a/fs/namei.c b/fs/namei.c
index cead810d53c6..3f930811e952 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3702,13 +3702,13 @@ int rename_lookup(struct renamedata *rd, int 
lookup_flags)
        int err;
 
        if (!rd->old_dentry) {
-               err = lookup_one_common(rd->old_mnt_idmap, &rd->old_last,
+               err = lookup_one_common(rd->mnt_idmap, &rd->old_last,
                                        rd->old_parent);
                if (err)
                        return err;
        }
        if (!rd->new_dentry) {
-               err = lookup_one_common(rd->new_mnt_idmap, &rd->new_last,
+               err = lookup_one_common(rd->mnt_idmap, &rd->new_last,
                                        rd->new_parent);
                if (err)
                        return err;
@@ -5418,20 +5418,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)
@@ -5446,13 +5446,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;
@@ -5520,7 +5520,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;
@@ -5607,10 +5607,9 @@ int do_renameat2(int olddfd, struct filename *from, int 
newdfd,
 
 retry_deleg:
        rd.old_parent      = old_path.dentry;
-       rd.old_mnt_idmap   = mnt_idmap(old_path.mnt);
+       rd.mnt_idmap       = mnt_idmap(old_path.mnt);
        rd.old_dentry      = NULL;
        rd.new_parent      = new_path.dentry;
-       rd.new_mnt_idmap   = mnt_idmap(new_path.mnt);
        rd.new_dentry      = NULL;
        rd.delegated_inode = &delegated_inode;
        rd.flags           = flags;
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 98ab55ba3ced..5f3e99f956ca 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -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,
                };
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index bb0d7ded8e76..4f84abaa0d68 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -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,
diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
index 04539037108c..07739055ac9f 100644
--- a/fs/smb/server/vfs.c
+++ b/fs/smb/server/vfs.c
@@ -770,10 +770,9 @@ int ksmbd_vfs_rename(struct ksmbd_work *work, const struct 
path *old_path,
                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,
diff --git a/include/linux/fs.h b/include/linux/fs.h
index b12203afa0da..172c3d703c43 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2008,11 +2008,10 @@ 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
  * @old_last:          name for old_dentry in old_dir, if old_dentry not given
- * @new_mnt_idmap:     idmap of the new mount the inode was found from
  * @new_parent:        parent of destination
  * @new_dentry:                destination
  * @new_last:          name for new_dentry in new_dir, if new_dentry not given
@@ -2020,11 +2019,10 @@ int vfs_unlink(struct mnt_idmap *, struct inode *, 
struct dentry *,
  * @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 qstr old_last;
-       struct mnt_idmap *new_mnt_idmap;
        struct dentry *new_parent;
        struct dentry *new_dentry;
        struct qstr new_last;
-- 
2.50.0.107.gf914562f5916.dirty


Reply via email to