fs: port ->mknod() to pass mnt_idmap
authorChristian Brauner <brauner@kernel.org>
Fri, 13 Jan 2023 11:49:16 +0000 (12:49 +0100)
committerChristian Brauner (Microsoft) <brauner@kernel.org>
Thu, 19 Jan 2023 08:24:26 +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>
38 files changed:
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
fs/9p/vfs_inode.c
fs/9p/vfs_inode_dotl.c
fs/bad_inode.c
fs/btrfs/inode.c
fs/ceph/dir.c
fs/cifs/cifsfs.h
fs/cifs/dir.c
fs/ecryptfs/inode.c
fs/ext2/namei.c
fs/ext4/namei.c
fs/f2fs/namei.c
fs/fuse/dir.c
fs/gfs2/inode.c
fs/hfsplus/dir.c
fs/hostfs/hostfs_kern.c
fs/hpfs/namei.c
fs/hugetlbfs/inode.c
fs/jffs2/dir.c
fs/jfs/namei.c
fs/minix/namei.c
fs/namei.c
fs/nfs/dir.c
fs/nfs/internal.h
fs/nilfs2/namei.c
fs/ntfs3/namei.c
fs/ocfs2/namei.c
fs/overlayfs/dir.c
fs/ramfs/inode.c
fs/reiserfs/namei.c
fs/sysv/namei.c
fs/ubifs/dir.c
fs/udf/namei.c
fs/ufs/namei.c
fs/xfs/xfs_iops.c
include/linux/fs.h
mm/shmem.c

index ac7871ff1e3cc4158c860862f8034c3b38aa31df..9605928c11b5c1fd16f3a2215e0389ac9c0557dd 100644 (file)
@@ -63,7 +63,7 @@ prototypes::
        int (*symlink) (struct mnt_idmap *, struct inode *,struct dentry *,const char *);
        int (*mkdir) (struct mnt_idmap *, struct inode *,struct dentry *,umode_t);
        int (*rmdir) (struct inode *,struct dentry *);
-       int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
+       int (*mknod) (struct mnt_idmap *, struct inode *,struct dentry *,umode_t,dev_t);
        int (*rename) (struct inode *, struct dentry *,
                        struct inode *, struct dentry *, unsigned int);
        int (*readlink) (struct dentry *, char __user *,int);
index daf9593b3754f127a4e9ccc007002f3fb0a8c83c..e2cb36f15ce4fdb2c92488d2ba7e6c064c79e039 100644 (file)
@@ -428,7 +428,7 @@ As of kernel 2.6.22, the following members are defined:
                int (*symlink) (struct mnt_idmap *, struct inode *,struct dentry *,const char *);
                int (*mkdir) (struct mnt_idmap *, struct inode *,struct dentry *,umode_t);
                int (*rmdir) (struct inode *,struct dentry *);
-               int (*mknod) (struct user_namespace *, struct inode *,struct dentry *,umode_t,dev_t);
+               int (*mknod) (struct mnt_idmap *, struct inode *,struct dentry *,umode_t,dev_t);
                int (*rename) (struct user_namespace *, struct inode *, struct dentry *,
                               struct inode *, struct dentry *, unsigned int);
                int (*readlink) (struct dentry *, char __user *,int);
index ba9e68bd35899547d78a0633188abd46f1b5fa53..1a21b001f377b8b5ce1fc6d192d4256081975f4c 100644 (file)
@@ -1356,7 +1356,7 @@ v9fs_vfs_link(struct dentry *old_dentry, struct inode *dir,
 
 /**
  * v9fs_vfs_mknod - create a special file
- * @mnt_userns: The user namespace of the mount
+ * @idmap: idmap of the mount
  * @dir: inode destination for new link
  * @dentry: dentry for file
  * @mode: mode for creation
@@ -1365,7 +1365,7 @@ v9fs_vfs_link(struct dentry *old_dentry, struct inode *dir,
  */
 
 static int
-v9fs_vfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+v9fs_vfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
               struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);
index 63389ba14806c30290df1ac84fb293f8a7e7c7a3..3bed3eb3a0e270673289566bd4913db5079b0d1b 100644 (file)
@@ -30,7 +30,7 @@
 #include "acl.h"
 
 static int
-v9fs_vfs_mknod_dotl(struct user_namespace *mnt_userns, struct inode *dir,
+v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir,
                    struct dentry *dentry, umode_t omode, dev_t rdev);
 
 /**
@@ -222,8 +222,7 @@ static int
 v9fs_vfs_create_dotl(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t omode, bool excl)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
-       return v9fs_vfs_mknod_dotl(mnt_userns, dir, dentry, omode, 0);
+       return v9fs_vfs_mknod_dotl(idmap, dir, dentry, omode, 0);
 }
 
 static int
@@ -818,7 +817,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
 
 /**
  * v9fs_vfs_mknod_dotl - create a special file
- * @mnt_userns: The user namespace of the mount
+ * @idmap: The idmap of the mount
  * @dir: inode destination for new link
  * @dentry: dentry for file
  * @omode: mode for creation
@@ -826,7 +825,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
  *
  */
 static int
-v9fs_vfs_mknod_dotl(struct user_namespace *mnt_userns, struct inode *dir,
+v9fs_vfs_mknod_dotl(struct mnt_idmap *idmap, struct inode *dir,
                    struct dentry *dentry, umode_t omode, dev_t rdev)
 {
        int err;
index 6b6d20a41b60730c419c17d8893822ae761d9266..d1b075b4dce880968643abea0eb30546965e179d 100644 (file)
@@ -69,7 +69,7 @@ static int bad_inode_rmdir (struct inode *dir, struct dentry *dentry)
        return -EIO;
 }
 
-static int bad_inode_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int bad_inode_mknod(struct mnt_idmap *idmap, struct inode *dir,
                           struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        return -EIO;
index d0a965cfeda46bb4482216fa19b2bf771270f84b..438b5142be448a5476c3d0c53830c24fe0c34209 100644 (file)
@@ -6725,9 +6725,10 @@ out_inode:
        return err;
 }
 
-static int btrfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int btrfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, dev_t rdev)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode;
 
        inode = new_inode(dir->i_sb);
index af9ef4ba8d272104c318101a1d0149461cebf09d..7ad56d5a63b3c7e0b05b3a1cab3024207b196ea7 100644 (file)
@@ -845,7 +845,7 @@ int ceph_handle_notrace_create(struct inode *dir, struct dentry *dentry)
        return PTR_ERR(result);
 }
 
-static int ceph_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int ceph_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(dir->i_sb);
@@ -908,8 +908,7 @@ out:
 static int ceph_create(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, bool excl)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
-       return ceph_mknod(mnt_userns, dir, dentry, mode, 0);
+       return ceph_mknod(idmap, dir, dentry, mode, 0);
 }
 
 static int ceph_symlink(struct mnt_idmap *idmap, struct inode *dir,
index ab729c6007e87dc79e6bda66cff2e726c13ec9dd..14bb46ab0874b1f795d642d7fdab1a20f7ee179a 100644 (file)
@@ -57,7 +57,7 @@ extern struct dentry *cifs_lookup(struct inode *, struct dentry *,
                                  unsigned int);
 extern int cifs_unlink(struct inode *dir, struct dentry *dentry);
 extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *);
-extern int cifs_mknod(struct user_namespace *, struct inode *, struct dentry *,
+extern int cifs_mknod(struct mnt_idmap *, struct inode *, struct dentry *,
                      umode_t, dev_t);
 extern int cifs_mkdir(struct mnt_idmap *, struct inode *, struct dentry *,
                      umode_t);
index bc78af260fc91e5a64e24c39cd82b98f02fcca41..2b6076324ffc039bcec201dd86ef7f5e2841137e 100644 (file)
@@ -579,7 +579,7 @@ out_free_xid:
        return rc;
 }
 
-int cifs_mknod(struct user_namespace *mnt_userns, struct inode *inode,
+int cifs_mknod(struct mnt_idmap *idmap, struct inode *inode,
               struct dentry *direntry, umode_t mode, dev_t device_number)
 {
        int rc = -EPERM;
index 6f9da8d138dcb5e46e48ebae1e18e1e0c496c84b..6a2052d234b2d3766696eb2055e668b8cb723554 100644 (file)
@@ -548,7 +548,7 @@ static int ecryptfs_rmdir(struct inode *dir, struct dentry *dentry)
 }
 
 static int
-ecryptfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+ecryptfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
               struct dentry *dentry, umode_t mode, dev_t dev)
 {
        int rc;
index 179a6a7b4845ca467052e38480ba72c13a9ffd19..91219a6a5739d25fd586b5b9e897492492842634 100644 (file)
@@ -133,7 +133,7 @@ static int ext2_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
        return finish_open_simple(file, 0);
 }
 
-static int ext2_mknod (struct user_namespace * mnt_userns, struct inode * dir,
+static int ext2_mknod (struct mnt_idmap * idmap, struct inode * dir,
        struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct inode * inode;
index e5c54c30696e9d8d0a21cd0849777535c37a795b..0aa190e03b864770e8096550c14f7a8df8b897b5 100644 (file)
@@ -2828,9 +2828,10 @@ retry:
        return err;
 }
 
-static int ext4_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int ext4_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        handle_t *handle;
        struct inode *inode;
        int err, credits, retries = 0;
index 0ed2909696e24620e25db0dc233103615a957625..39f76a1d8b90e0e0f23198d5c257f1920d000bb6 100644 (file)
@@ -797,9 +797,10 @@ static int f2fs_rmdir(struct inode *dir, struct dentry *dentry)
        return -ENOTEMPTY;
 }
 
-static int f2fs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int f2fs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        struct inode *inode;
        int err = 0;
index d007e504f4c692fb7e223c6a601badcde9d71710..f6aa799fb584ddcb02776e336ed24a97a8f28962 100644 (file)
@@ -645,7 +645,7 @@ out_err:
        return err;
 }
 
-static int fuse_mknod(struct user_namespace *, struct inode *, struct dentry *,
+static int fuse_mknod(struct mnt_idmap *, struct inode *, struct dentry *,
                      umode_t, dev_t);
 static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
                            struct file *file, unsigned flags,
@@ -686,7 +686,7 @@ out_dput:
        return err;
 
 mknod:
-       err = fuse_mknod(&init_user_ns, dir, entry, mode, 0);
+       err = fuse_mknod(&nop_mnt_idmap, dir, entry, mode, 0);
        if (err)
                goto out_dput;
 no_open:
@@ -773,7 +773,7 @@ static int create_new_entry(struct fuse_mount *fm, struct fuse_args *args,
        return err;
 }
 
-static int fuse_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int fuse_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *entry, umode_t mode, dev_t rdev)
 {
        struct fuse_mknod_in inarg;
@@ -799,7 +799,7 @@ static int fuse_mknod(struct user_namespace *mnt_userns, struct inode *dir,
 static int fuse_create(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *entry, umode_t mode, bool excl)
 {
-       return fuse_mknod(&init_user_ns, dir, entry, mode, 0);
+       return fuse_mknod(&nop_mnt_idmap, dir, entry, mode, 0);
 }
 
 static int fuse_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
index bb06eabd2fc303b7f1138eebbc63c2b079f68d27..ed015ab6628780b81814f402e6f2cdc70fe624d0 100644 (file)
@@ -1246,7 +1246,7 @@ static int gfs2_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 
 /**
  * gfs2_mknod - Make a special file
- * @mnt_userns: User namespace of the mount the inode was found from
+ * @idmap: idmap of the mount the inode was found from
  * @dir: The directory in which the special file will reside
  * @dentry: The dentry of the special file
  * @mode: The mode of the special file
@@ -1254,7 +1254,7 @@ static int gfs2_mkdir(struct mnt_idmap *idmap, struct inode *dir,
  *
  */
 
-static int gfs2_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int gfs2_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t dev)
 {
        return gfs2_create_inode(dir, dentry, NULL, mode, dev, NULL, 0, 0);
index 9a953bb62eac6bf6eae16b6b221d22028a84f87f..19caa2d953a7825d0348037402f05e7c9a84bcf9 100644 (file)
@@ -476,7 +476,7 @@ out:
        return res;
 }
 
-static int hfsplus_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int hfsplus_mknod(struct mnt_idmap *idmap, struct inode *dir,
                         struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb);
@@ -520,13 +520,13 @@ out:
 static int hfsplus_create(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode, bool excl)
 {
-       return hfsplus_mknod(&init_user_ns, dir, dentry, mode, 0);
+       return hfsplus_mknod(&nop_mnt_idmap, dir, dentry, mode, 0);
 }
 
 static int hfsplus_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                         struct dentry *dentry, umode_t mode)
 {
-       return hfsplus_mknod(&init_user_ns, dir, dentry, mode | S_IFDIR, 0);
+       return hfsplus_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFDIR, 0);
 }
 
 static int hfsplus_rename(struct user_namespace *mnt_userns,
index f9369099125eb9c6c05f789fb991618e51c3790f..b7f512d2c66920f3aec9110d008f3f5c9e5ba0b3 100644 (file)
@@ -696,7 +696,7 @@ static int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
        return err;
 }
 
-static int hostfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int hostfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, umode_t mode, dev_t dev)
 {
        struct inode *inode;
index b44bc14e735b9f8bd2526372e907513ec8f121c4..8415137a064d8b7760b80b4e1b8d0c0f94950ab8 100644 (file)
@@ -217,7 +217,7 @@ bail:
        return err;
 }
 
-static int hpfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int hpfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        const unsigned char *name = dentry->d_name.name;
index 0f16a509c3d80bc9599ec5df1a4235101b4abbf1..b37e29dc125d537712eef1677816f8e09e3bdebd 100644 (file)
@@ -1019,7 +1019,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
 /*
  * File creation. Allocate an inode, and we're done..
  */
-static int hugetlbfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int hugetlbfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                           struct dentry *dentry, umode_t mode, dev_t dev)
 {
        struct inode *inode;
@@ -1036,7 +1036,7 @@ static int hugetlbfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
 static int hugetlbfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                           struct dentry *dentry, umode_t mode)
 {
-       int retval = hugetlbfs_mknod(&init_user_ns, dir, dentry,
+       int retval = hugetlbfs_mknod(&nop_mnt_idmap, dir, dentry,
                                     mode | S_IFDIR, 0);
        if (!retval)
                inc_nlink(dir);
@@ -1047,7 +1047,7 @@ static int hugetlbfs_create(struct mnt_idmap *idmap,
                            struct inode *dir, struct dentry *dentry,
                            umode_t mode, bool excl)
 {
-       return hugetlbfs_mknod(&init_user_ns, dir, dentry, mode | S_IFREG, 0);
+       return hugetlbfs_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFREG, 0);
 }
 
 static int hugetlbfs_tmpfile(struct user_namespace *mnt_userns,
index 9158d8e1b762cf7433a68bbd5ba235ea22fb33da..9e1110de6f0b223d0ef67207ef3970fc11d59ed5 100644 (file)
@@ -35,7 +35,7 @@ static int jffs2_symlink (struct mnt_idmap *, struct inode *,
 static int jffs2_mkdir (struct mnt_idmap *, struct inode *,struct dentry *,
                        umode_t);
 static int jffs2_rmdir (struct inode *,struct dentry *);
-static int jffs2_mknod (struct user_namespace *, struct inode *,struct dentry *,
+static int jffs2_mknod (struct mnt_idmap *, struct inode *,struct dentry *,
                        umode_t,dev_t);
 static int jffs2_rename (struct user_namespace *, struct inode *,
                         struct dentry *, struct inode *, struct dentry *,
@@ -614,7 +614,7 @@ static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
        return ret;
 }
 
-static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i,
+static int jffs2_mknod (struct mnt_idmap *idmap, struct inode *dir_i,
                        struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct jffs2_inode_info *f, *dir_f;
index 588dbd7572932b41c7e334df7e07bfeecc88a89d..917c1237cf9342bbfb96b6d92433418508d779bf 100644 (file)
@@ -1345,7 +1345,7 @@ static int jfs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
  *
  * FUNCTION:   Create a special file (device)
  */
-static int jfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int jfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct jfs_inode_info *jfs_ip;
index bd5dcd528b9ac4dc2b7288f210cf3dc0033ea086..b6b4b0a1608e613963134eff3f35978f7cd3e40b 100644 (file)
@@ -33,7 +33,7 @@ static struct dentry *minix_lookup(struct inode * dir, struct dentry *dentry, un
        return d_splice_alias(inode, dentry);
 }
 
-static int minix_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int minix_mknod(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        int error;
@@ -68,7 +68,7 @@ static int minix_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
 static int minix_create(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, umode_t mode, bool excl)
 {
-       return minix_mknod(&init_user_ns, dir, dentry, mode, 0);
+       return minix_mknod(&nop_mnt_idmap, dir, dentry, mode, 0);
 }
 
 static int minix_symlink(struct mnt_idmap *idmap, struct inode *dir,
index 7b543c52335083f453d7d7ca6c12f9e0bc97bffd..74c194c0ceab1bcac32fc667fd6b4bf0a823d589 100644 (file)
@@ -3919,7 +3919,7 @@ int vfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
        if (error)
                return error;
 
-       error = dir->i_op->mknod(mnt_userns, dir, dentry, mode, dev);
+       error = dir->i_op->mknod(idmap, dir, dentry, mode, dev);
        if (!error)
                fsnotify_create(dir, dentry);
        return error;
index 91ad69a1776e33fe774814f4ccb5a8851ea4dc60..19b4926b93cbcfccee91c18978edea6ea9495286 100644 (file)
@@ -2325,7 +2325,7 @@ EXPORT_SYMBOL_GPL(nfs_create);
  * See comments for nfs_proc_create regarding failed operations.
  */
 int
-nfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+nfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
          struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct iattr attr;
index 93a97af3638ae96f601d8f46f4c505858360e0d4..d6df06d61f2828d824a5379a17e278ab0282512e 100644 (file)
@@ -393,7 +393,7 @@ int nfs_unlink(struct inode *, struct dentry *);
 int nfs_symlink(struct mnt_idmap *, struct inode *, struct dentry *,
                const char *);
 int nfs_link(struct dentry *, struct inode *, struct dentry *);
-int nfs_mknod(struct user_namespace *, struct inode *, struct dentry *, umode_t,
+int nfs_mknod(struct mnt_idmap *, struct inode *, struct dentry *, umode_t,
              dev_t);
 int nfs_rename(struct user_namespace *, struct inode *, struct dentry *,
               struct inode *, struct dentry *, unsigned int);
index e0ef6ff0f35c4b068d7ce99f56e51487a95f9e43..9cc52d8fa02289f1ac0597f73896c5890fb4de8a 100644 (file)
@@ -100,7 +100,7 @@ static int nilfs_create(struct mnt_idmap *idmap, struct inode *dir,
 }
 
 static int
-nilfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+nilfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
            struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct inode *inode;
index f40ac46fa1d1e2ca022bd9fccffb037f025be7ed..3cd1a18c6c02dd636d3f704127dca5fc80977060 100644 (file)
@@ -111,9 +111,10 @@ static int ntfs_create(struct mnt_idmap *idmap, struct inode *dir,
  *
  * inode_operations::mknod
  */
-static int ntfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int ntfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode;
 
        inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, mode, rdev,
index e1db6da2f70b5b594d42876501d1fff14e5b2df6..e588009cb04e18ed82574a0026fcec74ea4d83f2 100644 (file)
@@ -221,7 +221,7 @@ static void ocfs2_cleanup_add_entry_failure(struct ocfs2_super *osb,
        iput(inode);
 }
 
-static int ocfs2_mknod(struct user_namespace *mnt_userns,
+static int ocfs2_mknod(struct mnt_idmap *idmap,
                       struct inode *dir,
                       struct dentry *dentry,
                       umode_t mode,
@@ -651,7 +651,7 @@ static int ocfs2_mkdir(struct mnt_idmap *idmap,
 
        trace_ocfs2_mkdir(dir, dentry, dentry->d_name.len, dentry->d_name.name,
                          OCFS2_I(dir)->ip_blkno, mode);
-       ret = ocfs2_mknod(&init_user_ns, dir, dentry, mode | S_IFDIR, 0);
+       ret = ocfs2_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFDIR, 0);
        if (ret)
                mlog_errno(ret);
 
@@ -668,7 +668,7 @@ static int ocfs2_create(struct mnt_idmap *idmap,
 
        trace_ocfs2_create(dir, dentry, dentry->d_name.len, dentry->d_name.name,
                           (unsigned long long)OCFS2_I(dir)->ip_blkno, mode);
-       ret = ocfs2_mknod(&init_user_ns, dir, dentry, mode | S_IFREG, 0);
+       ret = ocfs2_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFREG, 0);
        if (ret)
                mlog_errno(ret);
 
index abdaa12e833d9320cb9bfd47ab9a69baec8d1742..ff18a6a16b01e79be76ae92834dd2f97f733dbc8 100644 (file)
@@ -667,7 +667,7 @@ static int ovl_mkdir(struct mnt_idmap *idmap, struct inode *dir,
        return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
 }
 
-static int ovl_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int ovl_mknod(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        /* Don't allow creation of "whiteout" on overlay */
index 1f0e9c8581cdc7b0565fb54cc35978ed7cb9ff02..2ca68aa81895f787420ff3aae70a24231e6807f9 100644 (file)
@@ -95,7 +95,7 @@ struct inode *ramfs_get_inode(struct super_block *sb,
  */
 /* SMP-safe */
 static int
-ramfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+ramfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
            struct dentry *dentry, umode_t mode, dev_t dev)
 {
        struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev);
@@ -113,7 +113,7 @@ ramfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
 static int ramfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
-       int retval = ramfs_mknod(&init_user_ns, dir, dentry, mode | S_IFDIR, 0);
+       int retval = ramfs_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFDIR, 0);
        if (!retval)
                inc_nlink(dir);
        return retval;
@@ -122,7 +122,7 @@ static int ramfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 static int ramfs_create(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, umode_t mode, bool excl)
 {
-       return ramfs_mknod(&init_user_ns, dir, dentry, mode | S_IFREG, 0);
+       return ramfs_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFREG, 0);
 }
 
 static int ramfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
index 149b3c9af27552452896176277450d5bdbb93b41..4c3da7ccca345babd1a5545f7d63f230df889a4a 100644 (file)
@@ -700,7 +700,7 @@ out_failed:
        return retval;
 }
 
-static int reiserfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int reiserfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        int retval;
index 982caf4dec671e4bf3166c6c7751bd6e48bf6f66..e44c5f5f5b0ceea2b1dcbbf571700fcb6f52e0ce 100644 (file)
@@ -41,7 +41,7 @@ static struct dentry *sysv_lookup(struct inode * dir, struct dentry * dentry, un
        return d_splice_alias(inode, dentry);
 }
 
-static int sysv_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int sysv_mknod(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct inode * inode;
@@ -64,7 +64,7 @@ static int sysv_mknod(struct user_namespace *mnt_userns, struct inode *dir,
 static int sysv_create(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, bool excl)
 {
-       return sysv_mknod(&init_user_ns, dir, dentry, mode, 0);
+       return sysv_mknod(&nop_mnt_idmap, dir, dentry, mode, 0);
 }
 
 static int sysv_symlink(struct mnt_idmap *idmap, struct inode *dir,
index 042ddfbc1d82cffae17dbcb77769ecaaabaab61c..9f521a8edebfd45c9a6512f078f017e8e214128f 100644 (file)
@@ -1052,7 +1052,7 @@ out_budg:
        return err;
 }
 
-static int ubifs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int ubifs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct inode *inode;
index 9a360f286d1cbcee4d0a5aa4ee84eb172cef0deb..7ecfeaad41b17d3d1633cdabfa55a50f2549fbb3 100644 (file)
@@ -645,7 +645,7 @@ static int udf_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
        return finish_open_simple(file, 0);
 }
 
-static int udf_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int udf_mknod(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct inode *inode;
index 5d6b05269cf4445a913ff2b1dae01c356088c058..85afc26d559dd8f21e6d7b4579b7e45ff8ae6af0 100644 (file)
@@ -86,7 +86,7 @@ static int ufs_create (struct mnt_idmap * idmap,
        return ufs_add_nondir(dentry, inode);
 }
 
-static int ufs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+static int ufs_mknod(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode, dev_t rdev)
 {
        struct inode *inode;
index df3d7f6dbd7d5507ab3f31870673db6918a8e262..249b0d8fcd844ef96797d3791087d3674fae47e7 100644 (file)
@@ -255,13 +255,14 @@ xfs_generic_create(
 
 STATIC int
 xfs_vn_mknod(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct inode            *dir,
        struct dentry           *dentry,
        umode_t                 mode,
        dev_t                   rdev)
 {
-       return xfs_generic_create(mnt_userns, dir, dentry, mode, rdev, NULL);
+       return xfs_generic_create(mnt_idmap_owner(idmap), dir, dentry, mode,
+                                 rdev, NULL);
 }
 
 STATIC int
index f6b1f0ca261ad7675b1f83204ab748e4b87dc98b..a28117398e71baf5a1c97135f2c3b833f8dd7637 100644 (file)
@@ -2148,7 +2148,7 @@ struct inode_operations {
        int (*mkdir) (struct mnt_idmap *, struct inode *,struct dentry *,
                      umode_t);
        int (*rmdir) (struct inode *,struct dentry *);
-       int (*mknod) (struct user_namespace *, struct inode *,struct dentry *,
+       int (*mknod) (struct mnt_idmap *, struct inode *,struct dentry *,
                      umode_t,dev_t);
        int (*rename) (struct user_namespace *, struct inode *, struct dentry *,
                        struct inode *, struct dentry *, unsigned int);
index 998e5873f029017bcd769bf6d78a449f270174e3..d66f75c5e85e53d3287af4e1bce911cfd8e9f5e7 100644 (file)
@@ -2915,7 +2915,7 @@ static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf)
  * File creation. Allocate an inode, and we're done..
  */
 static int
-shmem_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+shmem_mknod(struct mnt_idmap *idmap, struct inode *dir,
            struct dentry *dentry, umode_t mode, dev_t dev)
 {
        struct inode *inode;
@@ -2975,7 +2975,7 @@ static int shmem_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 {
        int error;
 
-       if ((error = shmem_mknod(&init_user_ns, dir, dentry,
+       if ((error = shmem_mknod(&nop_mnt_idmap, dir, dentry,
                                 mode | S_IFDIR, 0)))
                return error;
        inc_nlink(dir);
@@ -2985,7 +2985,7 @@ static int shmem_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 static int shmem_create(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, umode_t mode, bool excl)
 {
-       return shmem_mknod(&init_user_ns, dir, dentry, mode | S_IFREG, 0);
+       return shmem_mknod(&nop_mnt_idmap, dir, dentry, mode | S_IFREG, 0);
 }
 
 /*
@@ -3055,7 +3055,7 @@ static int shmem_whiteout(struct user_namespace *mnt_userns,
        if (!whiteout)
                return -ENOMEM;
 
-       error = shmem_mknod(&init_user_ns, old_dir, whiteout,
+       error = shmem_mknod(&nop_mnt_idmap, old_dir, whiteout,
                            S_IFCHR | WHITEOUT_MODE, WHITEOUT_DEV);
        dput(whiteout);
        if (error)