fs: port ->tmpfile() to pass mnt_idmap
authorChristian Brauner <brauner@kernel.org>
Fri, 13 Jan 2023 11:49:18 +0000 (12:49 +0100)
committerChristian Brauner (Microsoft) <brauner@kernel.org>
Thu, 19 Jan 2023 08:24:27 +0000 (09:24 +0100)
Convert to struct mnt_idmap.

Last cycle we merged the necessary infrastructure in
256c8aed2b42 ("fs: introduce dedicated idmap type for mounts").
This is just the conversion to struct mnt_idmap.

Currently we still pass around the plain namespace that was attached to a
mount. This is in general pretty convenient but it makes it easy to
conflate namespaces that are relevant on the filesystem with namespaces
that are relevent on the mount level. Especially for non-vfs developers
without detailed knowledge in this area this can be a potential source for
bugs.

Once the conversion to struct mnt_idmap is done all helpers down to the
really low-level helpers will take a struct mnt_idmap argument instead of
two namespace arguments. This way it becomes impossible to conflate the two
eliminating the possibility of any bugs. All of the vfs and all filesystems
only operate on struct mnt_idmap.

Acked-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
17 files changed:
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
fs/bad_inode.c
fs/btrfs/inode.c
fs/ext2/namei.c
fs/ext4/namei.c
fs/f2fs/namei.c
fs/fuse/dir.c
fs/hugetlbfs/inode.c
fs/minix/namei.c
fs/namei.c
fs/ramfs/inode.c
fs/ubifs/dir.c
fs/udf/namei.c
fs/xfs/xfs_iops.c
include/linux/fs.h
mm/shmem.c

index c63890845d95664361dcd6881df36552a4d6f3fe..429b8e4a6284adc43c5f3c9070a285b6c7c9651a 100644 (file)
@@ -79,7 +79,7 @@ prototypes::
        int (*atomic_open)(struct inode *, struct dentry *,
                                struct file *, unsigned open_flag,
                                umode_t create_mode);
-       int (*tmpfile) (struct user_namespace *, struct inode *,
+       int (*tmpfile) (struct mnt_idmap *, struct inode *,
                        struct file *, umode_t);
        int (*fileattr_set)(struct user_namespace *mnt_userns,
                            struct dentry *dentry, struct fileattr *fa);
index 263fcc57b71f293499429aecae08bbe215e8eadf..3fcadfcf4e3ae55b7659e8040e5a0749a984a23c 100644 (file)
@@ -442,7 +442,7 @@ As of kernel 2.6.22, the following members are defined:
                void (*update_time)(struct inode *, struct timespec *, int);
                int (*atomic_open)(struct inode *, struct dentry *, struct file *,
                                   unsigned open_flag, umode_t create_mode);
-               int (*tmpfile) (struct user_namespace *, struct inode *, struct file *, umode_t);
+               int (*tmpfile) (struct mnt_idmap *, struct inode *, struct file *, umode_t);
                struct posix_acl * (*get_acl)(struct user_namespace *, struct dentry *, int);
                int (*set_acl)(struct user_namespace *, struct dentry *, struct posix_acl *, int);
                int (*fileattr_set)(struct user_namespace *mnt_userns,
index 1e24ce889a15a278ad40e3e22572b9177d72143b..4bdf40b187ff258b98730d3ad38e991220263298 100644 (file)
@@ -146,7 +146,7 @@ static int bad_inode_atomic_open(struct inode *inode, struct dentry *dentry,
        return -EIO;
 }
 
-static int bad_inode_tmpfile(struct user_namespace *mnt_userns,
+static int bad_inode_tmpfile(struct mnt_idmap *idmap,
                             struct inode *inode, struct file *file,
                             umode_t mode)
 {
index dbb6790d0268c697b3aa696da1014e9cb7a543cc..c10157a5a6f80ab4be3eae55bd0348f4a1de5467 100644 (file)
@@ -10095,9 +10095,10 @@ static int btrfs_permission(struct user_namespace *mnt_userns,
        return generic_permission(mnt_userns, inode, mask);
 }
 
-static int btrfs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int btrfs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                         struct file *file, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct btrfs_fs_info *fs_info = btrfs_sb(dir->i_sb);
        struct btrfs_trans_handle *trans;
        struct btrfs_root *root = BTRFS_I(dir)->root;
index 8b5dfa46bcc87fc42726ac7f82aad144723215ba..81808e3d11c1c9b3a4efa18f521482cd08d4605b 100644 (file)
@@ -119,7 +119,7 @@ static int ext2_create (struct mnt_idmap * idmap,
        return ext2_add_nondir(dentry, inode);
 }
 
-static int ext2_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int ext2_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                        struct file *file, umode_t mode)
 {
        struct inode *inode = ext2_new_inode(dir, mode, NULL);
index feb58508978e0d278b717733acc6b11b8348a9ea..74a2c3eae066de39d743186453abb976f0097daa 100644 (file)
@@ -2863,9 +2863,10 @@ retry:
        return err;
 }
 
-static int ext4_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int ext4_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                        struct file *file, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        handle_t *handle;
        struct inode *inode;
        int err, retries = 0;
index a87b9fcaf923f25294982346cc1735ab28abf4c6..938032cbc1a84ed5aec1b147f37c213f3973e9c8 100644 (file)
@@ -911,9 +911,10 @@ out:
        return err;
 }
 
-static int f2fs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                        struct file *file, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        int err;
 
index c95d610fa63fd17def6ce18fb4c990c7819077f5..ca07660a76a884140fe75b0aca14db4e144308a3 100644 (file)
@@ -802,7 +802,7 @@ static int fuse_create(struct mnt_idmap *idmap, struct inode *dir,
        return fuse_mknod(&nop_mnt_idmap, dir, entry, mode, 0);
 }
 
-static int fuse_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int fuse_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                        struct file *file, umode_t mode)
 {
        struct fuse_conn *fc = get_fuse_conn(dir);
index b37e29dc125d537712eef1677816f8e09e3bdebd..e1acab15e70dc26e741b5185695fd70117533b35 100644 (file)
@@ -1050,7 +1050,7 @@ static int hugetlbfs_create(struct mnt_idmap *idmap,
        return hugetlbfs_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFREG, 0);
 }
 
-static int hugetlbfs_tmpfile(struct user_namespace *mnt_userns,
+static int hugetlbfs_tmpfile(struct mnt_idmap *idmap,
                             struct inode *dir, struct file *file,
                             umode_t mode)
 {
index aa308b12f40d3f9bcc00cb08f2ee29f4b7f86a04..39ebe10d6a8bd1d2d40203ee033c92fa2dcaa94e 100644 (file)
@@ -52,7 +52,7 @@ static int minix_mknod(struct mnt_idmap *idmap, struct inode *dir,
        return error;
 }
 
-static int minix_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int minix_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                         struct file *file, umode_t mode)
 {
        int error;
index 3be66e8b418fea8fda7e5f8ff85ee889ab1b5dd0..34f020ae67ae8725acb577d3bcb1317c2c8733ed 100644 (file)
@@ -3613,7 +3613,7 @@ static int vfs_tmpfile(struct mnt_idmap *idmap,
        file->f_path.mnt = parentpath->mnt;
        file->f_path.dentry = child;
        mode = vfs_prepare_mode(mnt_userns, dir, mode, mode, mode);
-       error = dir->i_op->tmpfile(mnt_userns, dir, file, mode);
+       error = dir->i_op->tmpfile(idmap, dir, file, mode);
        dput(child);
        if (error)
                return error;
index 2ca68aa81895f787420ff3aae70a24231e6807f9..ba14f18bd1e513ae2e30f14fe9fef86457ff1de7 100644 (file)
@@ -145,7 +145,7 @@ static int ramfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
        return error;
 }
 
-static int ramfs_tmpfile(struct user_namespace *mnt_userns,
+static int ramfs_tmpfile(struct mnt_idmap *idmap,
                         struct inode *dir, struct file *file, umode_t mode)
 {
        struct inode *inode;
index e11a2d76fb0e55df1614e9eb6fe6dcdf07eea2d5..832e6adf9a928aac7686af23375d12c6864cf2c5 100644 (file)
@@ -426,7 +426,7 @@ static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
        mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
 }
 
-static int ubifs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int ubifs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                         struct file *file, umode_t mode)
 {
        struct dentry *dentry = file->f_path.dentry;
index c93b10513babe511d544baaca3d0653b255ba1c6..bdba2206a678db66600ea45e86df40c4475be3cb 100644 (file)
@@ -625,7 +625,7 @@ static int udf_create(struct mnt_idmap *idmap, struct inode *dir,
        return udf_add_nondir(dentry, inode);
 }
 
-static int udf_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+static int udf_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                       struct file *file, umode_t mode)
 {
        struct inode *inode = udf_new_inode(dir, mode);
index fd0c62e0ddd264c3696dd695dda7ad6448852c36..43e746167d616a3b2cb1258f994bca036988bc95 100644 (file)
@@ -1098,11 +1098,13 @@ xfs_vn_fiemap(
 
 STATIC int
 xfs_vn_tmpfile(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct inode            *dir,
        struct file             *file,
        umode_t                 mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
+
        int err = xfs_generic_create(mnt_userns, dir, file->f_path.dentry, mode, 0, file);
 
        return finish_open_simple(file, err);
index 8d287bd2bf9be949be048f79785782c0a07cefe4..4855fd071bf81416e4002b1efdfcbe513f25298c 100644 (file)
@@ -2162,7 +2162,7 @@ struct inode_operations {
        int (*atomic_open)(struct inode *, struct dentry *,
                           struct file *, unsigned open_flag,
                           umode_t create_mode);
-       int (*tmpfile) (struct user_namespace *, struct inode *,
+       int (*tmpfile) (struct mnt_idmap *, struct inode *,
                        struct file *, umode_t);
        struct posix_acl *(*get_acl)(struct user_namespace *, struct dentry *,
                                     int);
index c9998c2220d35ad213151202b0b8d92e33478a91..ab289abe58270235bd145563ffe1d741172f5411 100644 (file)
@@ -2946,7 +2946,7 @@ out_iput:
 }
 
 static int
-shmem_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+shmem_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
              struct file *file, umode_t mode)
 {
        struct inode *inode;