fs: port ->mkdir() to pass mnt_idmap
authorChristian Brauner <brauner@kernel.org>
Fri, 13 Jan 2023 11:49:15 +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>
57 files changed:
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
fs/9p/vfs_inode.c
fs/9p/vfs_inode_dotl.c
fs/affs/affs.h
fs/affs/namei.c
fs/afs/dir.c
fs/autofs/root.c
fs/bad_inode.c
fs/btrfs/inode.c
fs/ceph/dir.c
fs/cifs/cifsfs.h
fs/cifs/inode.c
fs/coda/dir.c
fs/configfs/dir.c
fs/ecryptfs/inode.c
fs/exfat/namei.c
fs/ext2/namei.c
fs/ext4/namei.c
fs/f2fs/namei.c
fs/fat/namei_msdos.c
fs/fat/namei_vfat.c
fs/fuse/dir.c
fs/gfs2/inode.c
fs/hfs/dir.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/kernfs/dir.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/dlmfs/dlmfs.c
fs/ocfs2/namei.c
fs/omfs/dir.c
fs/orangefs/namei.c
fs/overlayfs/dir.c
fs/ramfs/inode.c
fs/reiserfs/namei.c
fs/reiserfs/xattr.c
fs/sysv/namei.c
fs/tracefs/inode.c
fs/ubifs/dir.c
fs/udf/namei.c
fs/ufs/namei.c
fs/vboxsf/dir.c
fs/xfs/xfs_iops.c
include/linux/fs.h
kernel/bpf/inode.c
mm/shmem.c
security/apparmor/apparmorfs.c

index 2e656b651574ce247e160262b031e199d0074466..ac7871ff1e3cc4158c860862f8034c3b38aa31df 100644 (file)
@@ -61,7 +61,7 @@ prototypes::
        int (*link) (struct dentry *,struct inode *,struct dentry *);
        int (*unlink) (struct inode *,struct dentry *);
        int (*symlink) (struct mnt_idmap *, struct inode *,struct dentry *,const char *);
-       int (*mkdir) (struct inode *,struct dentry *,umode_t);
+       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 (*rename) (struct inode *, struct dentry *,
index 5a1195cf34ba1c85abece3064e0484454de5bf9e..daf9593b3754f127a4e9ccc007002f3fb0a8c83c 100644 (file)
@@ -426,7 +426,7 @@ As of kernel 2.6.22, the following members are defined:
                int (*link) (struct dentry *,struct inode *,struct dentry *);
                int (*unlink) (struct inode *,struct dentry *);
                int (*symlink) (struct mnt_idmap *, struct inode *,struct dentry *,const char *);
-               int (*mkdir) (struct user_namespace *, struct inode *,struct dentry *,umode_t);
+               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 (*rename) (struct user_namespace *, struct inode *, struct dentry *,
index 401c0b63d5bbdfb10ca1dc4d6597f0cf54144fdb..ba9e68bd35899547d78a0633188abd46f1b5fa53 100644 (file)
@@ -704,14 +704,14 @@ v9fs_vfs_create(struct mnt_idmap *idmap, struct inode *dir,
 
 /**
  * v9fs_vfs_mkdir - VFS mkdir hook to create a directory
- * @mnt_userns: The user namespace of the mount
+ * @idmap: idmap of the mount
  * @dir:  inode that is being unlinked
  * @dentry: dentry that is being unlinked
  * @mode: mode for new directory
  *
  */
 
-static int v9fs_vfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int v9fs_vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode)
 {
        int err;
index d3245221ddd4a83b963e367c31d55d13ec34e615..63389ba14806c30290df1ac84fb293f8a7e7c7a3 100644 (file)
@@ -357,14 +357,14 @@ out:
 
 /**
  * v9fs_vfs_mkdir_dotl - VFS mkdir hook to create a directory
- * @mnt_userns: The user namespace of the mount
+ * @idmap: The idmap of the mount
  * @dir:  inode that is being unlinked
  * @dentry: dentry that is being unlinked
  * @omode: mode for new directory
  *
  */
 
-static int v9fs_vfs_mkdir_dotl(struct user_namespace *mnt_userns,
+static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap,
                               struct inode *dir, struct dentry *dentry,
                               umode_t omode)
 {
index f9f986a2c5098806ac79b6d43f865d49b47f9523..8f70a839c3119f696396c33869cd56423025c816 100644 (file)
@@ -169,7 +169,7 @@ extern struct dentry *affs_lookup(struct inode *dir, struct dentry *dentry, unsi
 extern int     affs_unlink(struct inode *dir, struct dentry *dentry);
 extern int     affs_create(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, umode_t mode, bool);
-extern int     affs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+extern int     affs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, umode_t mode);
 extern int     affs_rmdir(struct inode *dir, struct dentry *dentry);
 extern int     affs_link(struct dentry *olddentry, struct inode *dir,
index 1d7f7232964d573e44eb5dd0ca621979e0b17b79..e0300f0b6fc35498f0139fd3bccbbc7ff9458887 100644 (file)
@@ -274,7 +274,7 @@ affs_create(struct mnt_idmap *idmap, struct inode *dir,
 }
 
 int
-affs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+affs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
           struct dentry *dentry, umode_t mode)
 {
        struct inode            *inode;
index a936aa8191b27e5a7d23054d574ebd064ef9b389..c2ada2fc51b44aa21b9e6f99a102c773bc5504bd 100644 (file)
@@ -30,7 +30,7 @@ static bool afs_lookup_filldir(struct dir_context *ctx, const char *name, int nl
                              loff_t fpos, u64 ino, unsigned dtype);
 static int afs_create(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode, bool excl);
-static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int afs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode);
 static int afs_rmdir(struct inode *dir, struct dentry *dentry);
 static int afs_unlink(struct inode *dir, struct dentry *dentry);
@@ -1332,7 +1332,7 @@ static const struct afs_operation_ops afs_mkdir_operation = {
 /*
  * create a directory on an AFS filesystem
  */
-static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int afs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode)
 {
        struct afs_operation *op;
index bf0029cef304de1487688e185e5762a2cc10fc7f..cbc0da00a3cf6648a7670878711534ab72dd1471 100644 (file)
@@ -15,7 +15,7 @@ static int autofs_dir_symlink(struct mnt_idmap *, struct inode *,
                              struct dentry *, const char *);
 static int autofs_dir_unlink(struct inode *, struct dentry *);
 static int autofs_dir_rmdir(struct inode *, struct dentry *);
-static int autofs_dir_mkdir(struct user_namespace *, struct inode *,
+static int autofs_dir_mkdir(struct mnt_idmap *, struct inode *,
                            struct dentry *, umode_t);
 static long autofs_root_ioctl(struct file *, unsigned int, unsigned long);
 #ifdef CONFIG_COMPAT
@@ -720,7 +720,7 @@ static int autofs_dir_rmdir(struct inode *dir, struct dentry *dentry)
        return 0;
 }
 
-static int autofs_dir_mkdir(struct user_namespace *mnt_userns,
+static int autofs_dir_mkdir(struct mnt_idmap *idmap,
                            struct inode *dir, struct dentry *dentry,
                            umode_t mode)
 {
index 2d3ca4b5628f77fdde63483f3cc42b7cd6c484af..6b6d20a41b60730c419c17d8893822ae761d9266 100644 (file)
@@ -58,7 +58,7 @@ static int bad_inode_symlink(struct mnt_idmap *idmap,
        return -EIO;
 }
 
-static int bad_inode_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int bad_inode_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                           struct dentry *dentry, umode_t mode)
 {
        return -EIO;
index f4879dd92035f7b53cd4f245bc0c8ac2ff17395d..d0a965cfeda46bb4482216fa19b2bf771270f84b 100644 (file)
@@ -6839,9 +6839,10 @@ fail:
        return err;
 }
 
-static int btrfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int btrfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode;
 
        inode = new_inode(dir->i_sb);
index 114375efa2f78602aae892a4eb83f31694bfcc3e..af9ef4ba8d272104c318101a1d0149461cebf09d 100644 (file)
@@ -971,7 +971,7 @@ out:
        return err;
 }
 
-static int ceph_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int ceph_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
        struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(dir->i_sb);
index 52256b751c7524ce09d940eaecd3c772482a0e32..ab729c6007e87dc79e6bda66cff2e726c13ec9dd 100644 (file)
@@ -59,7 +59,7 @@ 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 *,
                      umode_t, dev_t);
-extern int cifs_mkdir(struct user_namespace *, struct inode *, struct dentry *,
+extern int cifs_mkdir(struct mnt_idmap *, struct inode *, struct dentry *,
                      umode_t);
 extern int cifs_rmdir(struct inode *, struct dentry *);
 extern int cifs_rename2(struct user_namespace *, struct inode *,
index aad6a40c9721ea7ae2f16921b32939d5b9079378..ce4f086db2dfa334414b937ce95b153251ca2ae6 100644 (file)
@@ -1910,7 +1910,7 @@ posix_mkdir_get_info:
 }
 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
 
-int cifs_mkdir(struct user_namespace *mnt_userns, struct inode *inode,
+int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
               struct dentry *direntry, umode_t mode)
 {
        int rc = 0;
index b8e82bc0071f627c7f0d43f34964799567deebaa..ff90117f1eec5753092dd96e3442a8255088d527 100644 (file)
@@ -166,7 +166,7 @@ err_out:
        return error;
 }
 
-static int coda_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int coda_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *de, umode_t mode)
 {
        struct inode *inode;
index ec6519e1ca3bfcc7e974bc8579c08758df3d98d4..4afcbbe63e685f8b4e2d225e3f86360b55bda4ac 100644 (file)
@@ -1251,7 +1251,7 @@ out_root_unlock:
 }
 EXPORT_SYMBOL(configfs_depend_item_unlocked);
 
-static int configfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int configfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode)
 {
        int ret = 0;
index 692320ee079d60903d82a8a30e95479db520dd14..6f9da8d138dcb5e46e48ebae1e18e1e0c496c84b 100644 (file)
@@ -495,7 +495,7 @@ out_lock:
        return rc;
 }
 
-static int ecryptfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int ecryptfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode)
 {
        int rc;
index f40cc11016adcd05c65d6c6f3ae8bd4880eea1e4..99e86caba54496d74b3bd75bada0763a8e53e319 100644 (file)
@@ -834,7 +834,7 @@ unlock:
        return err;
 }
 
-static int exfat_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int exfat_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        struct super_block *sb = dir->i_sb;
index 72d9a311100165cc103de6cc6b92ae82a166da1e..179a6a7b4845ca467052e38480ba72c13a9ffd19 100644 (file)
@@ -225,7 +225,7 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir,
        return err;
 }
 
-static int ext2_mkdir(struct user_namespace * mnt_userns,
+static int ext2_mkdir(struct mnt_idmap * idmap,
        struct inode * dir, struct dentry * dentry, umode_t mode)
 {
        struct inode * inode;
index 11d9c1d1fc567f63d9735ee5814d1fde29dbccbc..e5c54c30696e9d8d0a21cd0849777535c37a795b 100644 (file)
@@ -2973,9 +2973,10 @@ out:
        return err;
 }
 
-static int ext4_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int ext4_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        handle_t *handle;
        struct inode *inode;
        int err, err2 = 0, credits, retries = 0;
index 5ef5ed50ce8023868845a2d7692eff027bbcbc24..0ed2909696e24620e25db0dc233103615a957625 100644 (file)
@@ -741,9 +741,10 @@ out_free_encrypted_link:
        return err;
 }
 
-static int f2fs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int f2fs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        struct inode *inode;
        int err;
index 353ca26b3ea4ef31f007cca25905ae20013a99fb..b98025f21d9bc75f5930b7d83d5e594af9557fa6 100644 (file)
@@ -339,7 +339,7 @@ out:
 }
 
 /***** Make a directory */
-static int msdos_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int msdos_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        struct super_block *sb = dir->i_sb;
index de5ee606ae5fb6d204515bfe3069fe6231fface6..f5f4caff75e27dd940d54a8f0728d257101fde98 100644 (file)
@@ -844,7 +844,7 @@ out:
        return err;
 }
 
-static int vfat_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int vfat_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
        struct super_block *sb = dir->i_sb;
index 179d8a33e13e4972502fe3192104d7b5b12cd9d9..d007e504f4c692fb7e223c6a601badcde9d71710 100644 (file)
@@ -819,7 +819,7 @@ static int fuse_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
        return err;
 }
 
-static int fuse_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int fuse_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *entry, umode_t mode)
 {
        struct fuse_mkdir_in inarg;
index 830049759b07814df94709629d22b7f772b4d760..bb06eabd2fc303b7f1138eebbc63c2b079f68d27 100644 (file)
@@ -1229,7 +1229,7 @@ static int gfs2_symlink(struct mnt_idmap *idmap, struct inode *dir,
 
 /**
  * gfs2_mkdir - Make a directory
- * @mnt_userns: User namespace of the mount the inode was found from
+ * @idmap: idmap of the mount the inode was found from
  * @dir: The parent directory of the new one
  * @dentry: The dentry of the new directory
  * @mode: The mode of the new directory
@@ -1237,7 +1237,7 @@ static int gfs2_symlink(struct mnt_idmap *idmap, struct inode *dir,
  * Returns: errno
  */
 
-static int gfs2_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int gfs2_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
        unsigned dsize = gfs2_max_stuffed_size(GFS2_I(dir));
index 17fd7c3914b06a29ee6a2664312780355af60a7b..f8141c407d5521c0dc1cb12d74d490c1470859e6 100644 (file)
@@ -219,7 +219,7 @@ static int hfs_create(struct mnt_idmap *idmap, struct inode *dir,
  * in a directory, given the inode for the parent directory and the
  * name (and its length) of the new directory.
  */
-static int hfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int hfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
index 36927ca6b1f583841a16b1b3e4374d565156bc68..9a953bb62eac6bf6eae16b6b221d22028a84f87f 100644 (file)
@@ -523,7 +523,7 @@ static int hfsplus_create(struct mnt_idmap *idmap, struct inode *dir,
        return hfsplus_mknod(&init_user_ns, dir, dentry, mode, 0);
 }
 
-static int hfsplus_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+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);
index e78f53e60dcd375a4d1f6484aee6622ac59940d4..f9369099125eb9c6c05f789fb991618e51c3790f 100644 (file)
@@ -671,7 +671,7 @@ static int hostfs_symlink(struct mnt_idmap *idmap, struct inode *ino,
        return err;
 }
 
-static int hostfs_mkdir(struct user_namespace *mnt_userns, struct inode *ino,
+static int hostfs_mkdir(struct mnt_idmap *idmap, struct inode *ino,
                        struct dentry *dentry, umode_t mode)
 {
        char *file;
index c5f0aec11457c71ab1f38050381ea03417d9e729..b44bc14e735b9f8bd2526372e907513ec8f121c4 100644 (file)
@@ -20,7 +20,7 @@ static void hpfs_update_directory_times(struct inode *dir)
        hpfs_write_inode_nolock(dir);
 }
 
-static int hpfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int hpfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
        const unsigned char *name = dentry->d_name.name;
index 170c99cb3095d2e562b38e167c5795c617b1da59..0f16a509c3d80bc9599ec5df1a4235101b4abbf1 100644 (file)
@@ -1033,7 +1033,7 @@ static int hugetlbfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
        return 0;
 }
 
-static int hugetlbfs_mkdir(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,
index 51433fef9d2b49380527d0cac1f0198298a8d000..9158d8e1b762cf7433a68bbd5ba235ea22fb33da 100644 (file)
@@ -32,7 +32,7 @@ static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
 static int jffs2_unlink (struct inode *,struct dentry *);
 static int jffs2_symlink (struct mnt_idmap *, struct inode *,
                          struct dentry *, const char *);
-static int jffs2_mkdir (struct user_namespace *, struct inode *,struct dentry *,
+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 *,
@@ -442,7 +442,7 @@ static int jffs2_symlink (struct mnt_idmap *idmap, struct inode *dir_i,
 }
 
 
-static int jffs2_mkdir (struct user_namespace *mnt_userns, struct inode *dir_i,
+static int jffs2_mkdir (struct mnt_idmap *idmap, struct inode *dir_i,
                        struct dentry *dentry, umode_t mode)
 {
        struct jffs2_inode_info *f, *dir_f;
index e7d65581db75888ec25287462c87f0f23f128728..588dbd7572932b41c7e334df7e07bfeecc88a89d 100644 (file)
@@ -192,7 +192,7 @@ static int jfs_create(struct mnt_idmap *idmap, struct inode *dip,
  * note:
  * EACCES: user needs search+write permission on the parent directory
  */
-static int jfs_mkdir(struct user_namespace *mnt_userns, struct inode *dip,
+static int jfs_mkdir(struct mnt_idmap *idmap, struct inode *dip,
                     struct dentry *dentry, umode_t mode)
 {
        int rc = 0;
index 935ef8cb02b26bc6979767eacb8a8789924c46cf..4f2d521bedabba7c3167c3e4a96202397872af24 100644 (file)
@@ -1200,7 +1200,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
        return d_splice_alias(inode, dentry);
 }
 
-static int kernfs_iop_mkdir(struct user_namespace *mnt_userns,
+static int kernfs_iop_mkdir(struct mnt_idmap *idmap,
                            struct inode *dir, struct dentry *dentry,
                            umode_t mode)
 {
index 0a07410a1a27855a12b64b940544f672ac768c2c..bd5dcd528b9ac4dc2b7288f210cf3dc0033ea086 100644 (file)
@@ -111,7 +111,7 @@ static int minix_link(struct dentry * old_dentry, struct inode * dir,
        return add_nondir(dentry, inode);
 }
 
-static int minix_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int minix_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        struct inode * inode;
index 24ad4a8963df1c07741dd1b7c03815093eee94ee..7b543c52335083f453d7d7ca6c12f9e0bc97bffd 100644 (file)
@@ -4044,7 +4044,7 @@ int vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
        if (max_links && dir->i_nlink >= max_links)
                return -EMLINK;
 
-       error = dir->i_op->mkdir(mnt_userns, dir, dentry, mode);
+       error = dir->i_op->mkdir(idmap, dir, dentry, mode);
        if (!error)
                fsnotify_mkdir(dir, dentry);
        return error;
index 5ae3ed47c3884f55ffa8c0a54abd20ec7ffbf706..91ad69a1776e33fe774814f4ccb5a8851ea4dc60 100644 (file)
@@ -2352,7 +2352,7 @@ EXPORT_SYMBOL_GPL(nfs_mknod);
 /*
  * See comments for nfs_proc_create regarding failed operations.
  */
-int nfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+int nfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
              struct dentry *dentry, umode_t mode)
 {
        struct iattr attr;
index 33ec2c2a52de9dda65d3cd2d6292ed5a5649cbe7..93a97af3638ae96f601d8f46f4c505858360e0d4 100644 (file)
@@ -386,7 +386,7 @@ struct dentry *nfs_lookup(struct inode *, struct dentry *, unsigned int);
 void nfs_d_prune_case_insensitive_aliases(struct inode *inode);
 int nfs_create(struct mnt_idmap *, struct inode *, struct dentry *,
               umode_t, bool);
-int nfs_mkdir(struct user_namespace *, struct inode *, struct dentry *,
+int nfs_mkdir(struct mnt_idmap *, struct inode *, struct dentry *,
              umode_t);
 int nfs_rmdir(struct inode *, struct dentry *);
 int nfs_unlink(struct inode *, struct dentry *);
index d6cd71bb91e00392a1b25082d459e86f78c6e5b2..e0ef6ff0f35c4b068d7ce99f56e51487a95f9e43 100644 (file)
@@ -202,7 +202,7 @@ static int nilfs_link(struct dentry *old_dentry, struct inode *dir,
        return err;
 }
 
-static int nilfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int nilfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
index be6a00a070043c557f42f4cfd3b406ad5c934cf8..f40ac46fa1d1e2ca022bd9fccffb037f025be7ed 100644 (file)
@@ -200,9 +200,10 @@ static int ntfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
 /*
  * ntfs_mkdir- inode_operations::mkdir
  */
-static int ntfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int ntfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode;
 
        inode = ntfs_create_inode(mnt_userns, dir, dentry, NULL, S_IFDIR | mode,
index 812ff62e65603c235d2080cedd29408346bc5e22..80146869eac909c47bb573f3958f447c3f1451be 100644 (file)
@@ -402,7 +402,7 @@ static struct inode *dlmfs_get_inode(struct inode *parent,
  * File creation. Allocate an inode, and we're done..
  */
 /* SMP-safe */
-static int dlmfs_mkdir(struct user_namespace * mnt_userns,
+static int dlmfs_mkdir(struct mnt_idmap * idmap,
                       struct inode * dir,
                       struct dentry * dentry,
                       umode_t mode)
index dedb37a88345b32a324f972e9a193abea45f1305..e1db6da2f70b5b594d42876501d1fff14e5b2df6 100644 (file)
@@ -642,7 +642,7 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,
                                    fe_blkno, suballoc_loc, suballoc_bit);
 }
 
-static int ocfs2_mkdir(struct user_namespace *mnt_userns,
+static int ocfs2_mkdir(struct mnt_idmap *idmap,
                       struct inode *dir,
                       struct dentry *dentry,
                       umode_t mode)
index 28590755c1d35f1ed91e60ea8f127f45f57e5410..34138f46f7e731a243b459bf430e9e0b9a11c5b1 100644 (file)
@@ -279,7 +279,7 @@ out_free_inode:
        return err;
 }
 
-static int omfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int omfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
        return omfs_add_node(dir, dentry, mode | S_IFDIR);
index 59866be483299520579178d00ce917081fea4e07..9243c35fb478e56f9305f64685e5518282f971e5 100644 (file)
@@ -305,7 +305,7 @@ out:
        return ret;
 }
 
-static int orangefs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int orangefs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode)
 {
        struct orangefs_inode_s *parent = ORANGEFS_I(dir);
index 272906ec95122bfb5a85c8910286ee54afdac554..abdaa12e833d9320cb9bfd47ab9a69baec8d1742 100644 (file)
@@ -661,7 +661,7 @@ static int ovl_create(struct mnt_idmap *idmap, struct inode *dir,
        return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
 }
 
-static int ovl_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int ovl_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode)
 {
        return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
index f97b8856cebf9eb5f554da18ae95458571e7c5e5..1f0e9c8581cdc7b0565fb54cc35978ed7cb9ff02 100644 (file)
@@ -110,7 +110,7 @@ ramfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
        return error;
 }
 
-static int ramfs_mkdir(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);
index 062e05f1b96136a4e6c06408e5187be12ad7095d..149b3c9af27552452896176277450d5bdbb93b41 100644 (file)
@@ -784,7 +784,7 @@ out_failed:
        return retval;
 }
 
-static int reiserfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int reiserfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                          struct dentry *dentry, umode_t mode)
 {
        int retval;
index 7f5ca335b97b565d7872c2457bd72fbddcca1639..f4300c73a192f8248f495942a22735a5c30c5997 100644 (file)
@@ -73,7 +73,7 @@ static int xattr_create(struct inode *dir, struct dentry *dentry, int mode)
 static int xattr_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 {
        BUG_ON(!inode_is_locked(dir));
-       return dir->i_op->mkdir(&init_user_ns, dir, dentry, mode);
+       return dir->i_op->mkdir(&nop_mnt_idmap, dir, dentry, mode);
 }
 
 /*
index c277c0a8f6b24710456fea8b8ac24d5cb63e4a94..982caf4dec671e4bf3166c6c7751bd6e48bf6f66 100644 (file)
@@ -110,7 +110,7 @@ static int sysv_link(struct dentry * old_dentry, struct inode * dir,
        return add_nondir(dentry, inode);
 }
 
-static int sysv_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int sysv_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                      struct dentry *dentry, umode_t mode)
 {
        struct inode * inode;
index da85b3979195747d09b788ca7884f7575bf3ff15..57ac8aa4a724d651f583b8c29076083bd6a4e988 100644 (file)
@@ -67,7 +67,7 @@ static char *get_dname(struct dentry *dentry)
        return name;
 }
 
-static int tracefs_syscall_mkdir(struct user_namespace *mnt_userns,
+static int tracefs_syscall_mkdir(struct mnt_idmap *idmap,
                                 struct inode *inode, struct dentry *dentry,
                                 umode_t mode)
 {
index 325c5693fb5f4542d155841fea1aced3b5eb4003..042ddfbc1d82cffae17dbcb77769ecaaabaab61c 100644 (file)
@@ -979,7 +979,7 @@ out_fname:
        return err;
 }
 
-static int ubifs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int ubifs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
index f2c3ee7ebe1b393ec1a416dc408e899add7d9328..9a360f286d1cbcee4d0a5aa4ee84eb172cef0deb 100644 (file)
@@ -661,7 +661,7 @@ static int udf_mknod(struct user_namespace *mnt_userns, struct inode *dir,
        return udf_add_nondir(dentry, inode);
 }
 
-static int udf_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int udf_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
index cb3d9bee6626ae5185ed640558b1b45c79d92605..5d6b05269cf4445a913ff2b1dae01c356088c058 100644 (file)
@@ -166,7 +166,7 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir,
        return error;
 }
 
-static int ufs_mkdir(struct user_namespace * mnt_userns, struct inode * dir,
+static int ufs_mkdir(struct mnt_idmap * idmap, struct inode * dir,
        struct dentry * dentry, umode_t mode)
 {
        struct inode * inode;
index 95d54cb5221d3987366f8c6c8e815743a64aae19..4ec79548e9f09dbb7e206ef1c76298104a799a1d 100644 (file)
@@ -301,7 +301,7 @@ static int vboxsf_dir_mkfile(struct mnt_idmap *idmap,
        return vboxsf_dir_create(parent, dentry, mode, false, excl, NULL);
 }
 
-static int vboxsf_dir_mkdir(struct user_namespace *mnt_userns,
+static int vboxsf_dir_mkdir(struct mnt_idmap *idmap,
                            struct inode *parent, struct dentry *dentry,
                            umode_t mode)
 {
index 4f9fcd0cf8ba3329da5ea44215dbd41c52b0a27e..df3d7f6dbd7d5507ab3f31870673db6918a8e262 100644 (file)
@@ -278,13 +278,13 @@ xfs_vn_create(
 
 STATIC int
 xfs_vn_mkdir(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct inode            *dir,
        struct dentry           *dentry,
        umode_t                 mode)
 {
-       return xfs_generic_create(mnt_userns, dir, dentry, mode | S_IFDIR, 0,
-                                 NULL);
+       return xfs_generic_create(mnt_idmap_owner(idmap), dir, dentry,
+                                 mode | S_IFDIR, 0, NULL);
 }
 
 STATIC struct dentry *
index 4bde68e15d5c7b170b853950dcce91ae76b69b80..f6b1f0ca261ad7675b1f83204ab748e4b87dc98b 100644 (file)
@@ -2145,7 +2145,7 @@ struct inode_operations {
        int (*unlink) (struct inode *,struct dentry *);
        int (*symlink) (struct mnt_idmap *, struct inode *,struct dentry *,
                        const char *);
-       int (*mkdir) (struct user_namespace *, struct inode *,struct dentry *,
+       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 *,
index 32c8f695e0b5581af41e336698aba3b511fc2a19..d7d14ce2a0313fa5bf5c228f713dc19f28c33023 100644 (file)
@@ -152,7 +152,7 @@ static void bpf_dentry_finalize(struct dentry *dentry, struct inode *inode,
        dir->i_ctime = dir->i_mtime;
 }
 
-static int bpf_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int bpf_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
index 38b973f116d806dccf183a4a97b742b2e9f7cbeb..998e5873f029017bcd769bf6d78a449f270174e3 100644 (file)
@@ -2970,7 +2970,7 @@ out_iput:
        return error;
 }
 
-static int shmem_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+static int shmem_mkdir(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        int error;
index 424b2c1e586d501981dc2ee09aa213a5df4b2005..db7a51acf9dbd40b52bc42e0c3312ccc29327512 100644 (file)
@@ -1793,7 +1793,7 @@ fail2:
        return error;
 }
 
-static int ns_mkdir_op(struct user_namespace *mnt_userns, struct inode *dir,
+static int ns_mkdir_op(struct mnt_idmap *idmap, struct inode *dir,
                       struct dentry *dentry, umode_t mode)
 {
        struct aa_ns *ns, *parent;