]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
VFS: unify old_mnt_idmap and new_mnt_idmap in renamedata
authorNeilBrown <neil@brown.name>
Mon, 22 Sep 2025 04:29:50 +0000 (14:29 +1000)
committerChristian Brauner <brauner@kernel.org>
Tue, 23 Sep 2025 10:37:35 +0000 (12:37 +0200)
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>
fs/cachefiles/namei.c
fs/ecryptfs/inode.c
fs/namei.c
fs/nfsd/vfs.c
fs/overlayfs/overlayfs.h
fs/smb/server/vfs.c
include/linux/fs.h

index 91dfd02318772fa63050ecf40fa5625ab48ad589..d1edb2ac38376c4f9d2a18026450bb3c774f7824 100644 (file)
@@ -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,
                };
index 72fbe1316ab8831bb4228d573278f32fe52b6b25..abd954c6a14e9542faa80997f49bb2d329644d76 100644 (file)
@@ -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);
index e2c2ab286bc032660d4a78301b7435d5835d5ef0..180037b96956a2f3374fbf5483ad740b9e6f8b52 100644 (file)
@@ -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);
index 98ab55ba3ced76635985be8193e6c1eef313d030..5f3e99f956cab698103f82d02602b7597a38a395 100644 (file)
@@ -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,
                };
index bb0d7ded8e763a4a7a6fc506d966ed2f3bdb4f06..4f84abaa0d6805188e0eba7c6ffba8361e6be37b 100644 (file)
@@ -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,
index 04539037108c93e285f4e9d6aa61f93a507ae5da..07739055ac9f33af36a6e7228fb15490b951556a 100644 (file)
@@ -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,
index d7ab4f96d7051f23246c1a16a2d09b1ffcd2d5de..73b39e5bb9e45a6a3c155d367c8fd8c721c789b2 100644 (file)
@@ -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;