fs: port inode_init_owner() to mnt_idmap
authorChristian Brauner <brauner@kernel.org>
Fri, 13 Jan 2023 11:49:25 +0000 (12:49 +0100)
committerChristian Brauner (Microsoft) <brauner@kernel.org>
Thu, 19 Jan 2023 08:24:28 +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>
41 files changed:
arch/powerpc/platforms/cell/spufs/inode.c
fs/9p/vfs_inode.c
fs/bfs/dir.c
fs/btrfs/btrfs_inode.h
fs/btrfs/inode.c
fs/btrfs/ioctl.c
fs/btrfs/tests/btrfs-tests.c
fs/ext2/ialloc.c
fs/ext4/ext4.h
fs/ext4/ialloc.c
fs/ext4/namei.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/namei.c
fs/hfsplus/inode.c
fs/hugetlbfs/inode.c
fs/inode.c
fs/jfs/jfs_inode.c
fs/minix/bitmap.c
fs/nilfs2/inode.c
fs/ntfs3/inode.c
fs/ocfs2/dlmfs/dlmfs.c
fs/ocfs2/namei.c
fs/omfs/inode.c
fs/overlayfs/dir.c
fs/ramfs/inode.c
fs/reiserfs/namei.c
fs/sysv/ialloc.c
fs/ubifs/dir.c
fs/udf/ialloc.c
fs/ufs/ialloc.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_iops.c
fs/xfs/xfs_qm.c
fs/xfs/xfs_symlink.c
fs/xfs/xfs_symlink.h
fs/zonefs/super.c
include/linux/fs.h
kernel/bpf/inode.c
mm/shmem.c

index 19fec984fdb0410541446e2862d39d0e78622fa0..ea807aa0c31aaca2e95d3767a60a41902e3d29df 100644 (file)
@@ -237,7 +237,7 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags,
        if (!inode)
                return -ENOSPC;
 
-       inode_init_owner(&init_user_ns, inode, dir, mode | S_IFDIR);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode | S_IFDIR);
        ctx = alloc_spu_context(SPUFS_I(dir)->i_gang); /* XXX gang */
        SPUFS_I(inode)->i_ctx = ctx;
        if (!ctx) {
@@ -468,7 +468,7 @@ spufs_mkgang(struct inode *dir, struct dentry *dentry, umode_t mode)
                goto out;
 
        ret = 0;
-       inode_init_owner(&init_user_ns, inode, dir, mode | S_IFDIR);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode | S_IFDIR);
        gang = alloc_spu_gang();
        SPUFS_I(inode)->i_ctx = NULL;
        SPUFS_I(inode)->i_gang = gang;
index a714df142d05ef4fb1b124001da32398a4ab72a0..4344e7a7865f8df3f15fde270446e6c36ba7bcd0 100644 (file)
@@ -260,7 +260,7 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses,
 {
        int err = 0;
 
-       inode_init_owner(&init_user_ns, inode, NULL, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, NULL, mode);
        inode->i_blocks = 0;
        inode->i_rdev = rdev;
        inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
index fa3e66bc9be3e6fa57b623efb4f2b269ccd9bab5..040d5140e4266b69beef0d8f9b6628e099fc70c0 100644 (file)
@@ -96,7 +96,7 @@ static int bfs_create(struct mnt_idmap *idmap, struct inode *dir,
        }
        set_bit(ino, info->si_imap);
        info->si_freei--;
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
        inode->i_blocks = 0;
        inode->i_op = &bfs_file_inops;
index 195c09e20609e48ffed8a01f73056937451f3577..7c1527fcc7b381fd1ac972d96aeb33b1c049f43b 100644 (file)
@@ -469,7 +469,7 @@ int btrfs_new_inode_prepare(struct btrfs_new_inode_args *args,
 int btrfs_create_new_inode(struct btrfs_trans_handle *trans,
                           struct btrfs_new_inode_args *args);
 void btrfs_new_inode_args_destroy(struct btrfs_new_inode_args *args);
-struct inode *btrfs_new_subvol_inode(struct user_namespace *mnt_userns,
+struct inode *btrfs_new_subvol_inode(struct mnt_idmap *idmap,
                                     struct inode *dir);
  void btrfs_set_delalloc_extent(struct btrfs_inode *inode, struct extent_state *state,
                                u32 bits);
index 5251547fdf0b1fee86837dadf7cbfcb7d37d8b38..8d74d042c6264c93856680bf73bcda6f20027d49 100644 (file)
@@ -6727,13 +6727,12 @@ out_inode:
 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);
        if (!inode)
                return -ENOMEM;
-       inode_init_owner(mnt_userns, inode, dir, mode);
+       inode_init_owner(idmap, inode, dir, mode);
        inode->i_op = &btrfs_special_inode_operations;
        init_special_inode(inode, inode->i_mode, rdev);
        return btrfs_create_common(dir, dentry, inode);
@@ -6742,13 +6741,12 @@ static int btrfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
 static int btrfs_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);
        struct inode *inode;
 
        inode = new_inode(dir->i_sb);
        if (!inode)
                return -ENOMEM;
-       inode_init_owner(mnt_userns, inode, dir, mode);
+       inode_init_owner(idmap, inode, dir, mode);
        inode->i_fop = &btrfs_file_operations;
        inode->i_op = &btrfs_file_inode_operations;
        inode->i_mapping->a_ops = &btrfs_aops;
@@ -6842,13 +6840,12 @@ fail:
 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);
        if (!inode)
                return -ENOMEM;
-       inode_init_owner(mnt_userns, inode, dir, S_IFDIR | mode);
+       inode_init_owner(idmap, inode, dir, S_IFDIR | mode);
        inode->i_op = &btrfs_dir_inode_operations;
        inode->i_fop = &btrfs_dir_file_operations;
        return btrfs_create_common(dir, dentry, inode);
@@ -8805,7 +8802,7 @@ out:
        return ret;
 }
 
-struct inode *btrfs_new_subvol_inode(struct user_namespace *mnt_userns,
+struct inode *btrfs_new_subvol_inode(struct mnt_idmap *idmap,
                                     struct inode *dir)
 {
        struct inode *inode;
@@ -8816,7 +8813,7 @@ struct inode *btrfs_new_subvol_inode(struct user_namespace *mnt_userns,
                 * Subvolumes don't inherit the sgid bit or the parent's gid if
                 * the parent's sgid bit is set. This is probably a bug.
                 */
-               inode_init_owner(mnt_userns, inode, NULL,
+               inode_init_owner(idmap, inode, NULL,
                                 S_IFDIR | (~current_umask() & S_IRWXUGO));
                inode->i_op = &btrfs_dir_inode_operations;
                inode->i_fop = &btrfs_dir_file_operations;
@@ -9292,14 +9289,14 @@ out_notrans:
        return ret;
 }
 
-static struct inode *new_whiteout_inode(struct user_namespace *mnt_userns,
+static struct inode *new_whiteout_inode(struct mnt_idmap *idmap,
                                        struct inode *dir)
 {
        struct inode *inode;
 
        inode = new_inode(dir->i_sb);
        if (inode) {
-               inode_init_owner(mnt_userns, inode, dir,
+               inode_init_owner(idmap, inode, dir,
                                 S_IFCHR | WHITEOUT_MODE);
                inode->i_op = &btrfs_special_inode_operations;
                init_special_inode(inode, inode->i_mode, WHITEOUT_DEV);
@@ -9307,7 +9304,7 @@ static struct inode *new_whiteout_inode(struct user_namespace *mnt_userns,
        return inode;
 }
 
-static int btrfs_rename(struct user_namespace *mnt_userns,
+static int btrfs_rename(struct mnt_idmap *idmap,
                        struct inode *old_dir, struct dentry *old_dentry,
                        struct inode *new_dir, struct dentry *new_dentry,
                        unsigned int flags)
@@ -9379,7 +9376,7 @@ static int btrfs_rename(struct user_namespace *mnt_userns,
                filemap_flush(old_inode->i_mapping);
 
        if (flags & RENAME_WHITEOUT) {
-               whiteout_args.inode = new_whiteout_inode(mnt_userns, old_dir);
+               whiteout_args.inode = new_whiteout_inode(idmap, old_dir);
                if (!whiteout_args.inode)
                        return -ENOMEM;
                ret = btrfs_new_inode_prepare(&whiteout_args, &trans_num_items);
@@ -9550,7 +9547,6 @@ static int btrfs_rename2(struct mnt_idmap *idmap, struct inode *old_dir,
                         struct dentry *old_dentry, struct inode *new_dir,
                         struct dentry *new_dentry, unsigned int flags)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        int ret;
 
        if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
@@ -9560,7 +9556,7 @@ static int btrfs_rename2(struct mnt_idmap *idmap, struct inode *old_dir,
                ret = btrfs_rename_exchange(old_dir, old_dentry, new_dir,
                                            new_dentry);
        else
-               ret = btrfs_rename(mnt_userns, old_dir, old_dentry, new_dir,
+               ret = btrfs_rename(idmap, old_dir, old_dentry, new_dir,
                                   new_dentry, flags);
 
        btrfs_btree_balance_dirty(BTRFS_I(new_dir)->root->fs_info);
@@ -9763,7 +9759,6 @@ out:
 static int btrfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
                         struct dentry *dentry, const char *symname)
 {
-       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;
@@ -9789,7 +9784,7 @@ static int btrfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
        inode = new_inode(dir->i_sb);
        if (!inode)
                return -ENOMEM;
-       inode_init_owner(mnt_userns, inode, dir, S_IFLNK | S_IRWXUGO);
+       inode_init_owner(idmap, inode, dir, S_IFLNK | S_IRWXUGO);
        inode->i_op = &btrfs_symlink_inode_operations;
        inode_nohighmem(inode);
        inode->i_mapping->a_ops = &btrfs_aops;
@@ -10097,7 +10092,6 @@ static int btrfs_permission(struct mnt_idmap *idmap,
 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;
@@ -10113,7 +10107,7 @@ static int btrfs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
        inode = new_inode(dir->i_sb);
        if (!inode)
                return -ENOMEM;
-       inode_init_owner(mnt_userns, inode, dir, mode);
+       inode_init_owner(idmap, inode, dir, mode);
        inode->i_fop = &btrfs_file_operations;
        inode->i_op = &btrfs_file_inode_operations;
        inode->i_mapping->a_ops = &btrfs_aops;
index 80c7feb30770f2749511b218bfc2649322c025d2..7c6bb1ff41b39b4e253471f660c4b2c561e0b9c9 100644 (file)
@@ -578,7 +578,7 @@ static unsigned int create_subvol_num_items(struct btrfs_qgroup_inherit *inherit
        return num_items;
 }
 
-static noinline int create_subvol(struct user_namespace *mnt_userns,
+static noinline int create_subvol(struct mnt_idmap *idmap,
                                  struct inode *dir, struct dentry *dentry,
                                  struct btrfs_qgroup_inherit *inherit)
 {
@@ -623,7 +623,7 @@ static noinline int create_subvol(struct user_namespace *mnt_userns,
        if (ret < 0)
                goto out_root_item;
 
-       new_inode_args.inode = btrfs_new_subvol_inode(mnt_userns, dir);
+       new_inode_args.inode = btrfs_new_subvol_inode(idmap, dir);
        if (!new_inode_args.inode) {
                ret = -ENOMEM;
                goto out_anon_dev;
@@ -962,7 +962,6 @@ static noinline int btrfs_mksubvol(const struct path *parent,
        struct btrfs_fs_info *fs_info = btrfs_sb(dir->i_sb);
        struct dentry *dentry;
        struct fscrypt_str name_str = FSTR_INIT((char *)name, namelen);
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        int error;
 
        error = down_write_killable_nested(&dir->i_rwsem, I_MUTEX_PARENT);
@@ -995,7 +994,7 @@ static noinline int btrfs_mksubvol(const struct path *parent,
        if (snap_src)
                error = create_snapshot(snap_src, dir, dentry, readonly, inherit);
        else
-               error = create_subvol(mnt_userns, dir, dentry, inherit);
+               error = create_subvol(idmap, dir, dentry, inherit);
 
        if (!error)
                fsnotify_mkdir(dir, dentry);
index 181469fc0bb32b8741887d3a1563dfacf6f51a09..ca09cf9afce800fce824474d4ad9ebcbfffd6861 100644 (file)
@@ -64,7 +64,7 @@ struct inode *btrfs_new_test_inode(void)
        BTRFS_I(inode)->location.type = BTRFS_INODE_ITEM_KEY;
        BTRFS_I(inode)->location.objectid = BTRFS_FIRST_FREE_OBJECTID;
        BTRFS_I(inode)->location.offset = 0;
-       inode_init_owner(&init_user_ns, inode, NULL, S_IFREG);
+       inode_init_owner(&nop_mnt_idmap, inode, NULL, S_IFREG);
 
        return inode;
 }
index 78b8686d9a4ae6037e996cdce9acb64e4116c7ff..a4e1d7a9c5445261f1a80a0bbefe88d0a8fedd1e 100644 (file)
@@ -545,7 +545,7 @@ got:
                inode->i_uid = current_fsuid();
                inode->i_gid = dir->i_gid;
        } else
-               inode_init_owner(&init_user_ns, inode, dir, mode);
+               inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
 
        inode->i_ino = ino;
        inode->i_blocks = 0;
index 8d5008754cc255bb631022e6df5cfb755c3278ae..43e26e6f6e4240f884ce08295db62f9684deda99 100644 (file)
@@ -2845,7 +2845,7 @@ extern int ext4fs_dirhash(const struct inode *dir, const char *name, int len,
 
 /* ialloc.c */
 extern int ext4_mark_inode_used(struct super_block *sb, int ino);
-extern struct inode *__ext4_new_inode(struct user_namespace *, handle_t *,
+extern struct inode *__ext4_new_inode(struct mnt_idmap *, handle_t *,
                                      struct inode *, umode_t,
                                      const struct qstr *qstr, __u32 goal,
                                      uid_t *owner, __u32 i_flags,
@@ -2853,11 +2853,11 @@ extern struct inode *__ext4_new_inode(struct user_namespace *, handle_t *,
                                      int nblocks);
 
 #define ext4_new_inode(handle, dir, mode, qstr, goal, owner, i_flags)          \
-       __ext4_new_inode(&init_user_ns, (handle), (dir), (mode), (qstr),       \
+       __ext4_new_inode(&nop_mnt_idmap, (handle), (dir), (mode), (qstr),      \
                         (goal), (owner), i_flags, 0, 0, 0)
-#define ext4_new_inode_start_handle(mnt_userns, dir, mode, qstr, goal, owner, \
+#define ext4_new_inode_start_handle(idmap, dir, mode, qstr, goal, owner, \
                                    type, nblocks)                  \
-       __ext4_new_inode((mnt_userns), NULL, (dir), (mode), (qstr), (goal), (owner), \
+       __ext4_new_inode((idmap), NULL, (dir), (mode), (qstr), (goal), (owner), \
                         0, (type), __LINE__, (nblocks))
 
 
index 63f9bb6e88513944e1e0004e98e7e8ac2cf9acf4..1024b0c0243145f434a163076a00bc40d86daedb 100644 (file)
@@ -921,7 +921,7 @@ static int ext4_xattr_credits_for_new_inode(struct inode *dir, mode_t mode,
  * For other inodes, search forward from the parent directory's block
  * group to find a free inode.
  */
-struct inode *__ext4_new_inode(struct user_namespace *mnt_userns,
+struct inode *__ext4_new_inode(struct mnt_idmap *idmap,
                               handle_t *handle, struct inode *dir,
                               umode_t mode, const struct qstr *qstr,
                               __u32 goal, uid_t *owner, __u32 i_flags,
@@ -943,6 +943,7 @@ struct inode *__ext4_new_inode(struct user_namespace *mnt_userns,
        ext4_group_t flex_group;
        struct ext4_group_info *grp = NULL;
        bool encrypt = false;
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
 
        /* Cannot create files in a deleted directory */
        if (!dir || !dir->i_nlink)
@@ -975,7 +976,7 @@ struct inode *__ext4_new_inode(struct user_namespace *mnt_userns,
                inode_fsuid_set(inode, mnt_userns);
                inode->i_gid = dir->i_gid;
        } else
-               inode_init_owner(mnt_userns, inode, dir, mode);
+               inode_init_owner(idmap, inode, dir, mode);
 
        if (ext4_has_feature_project(sb) &&
            ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT))
index 74a2c3eae066de39d743186453abb976f0097daa..d10a508d95cd6d0241c28f67d5bee2c1cf7d2f26 100644 (file)
@@ -2795,7 +2795,6 @@ static int ext4_add_nondir(handle_t *handle,
 static int ext4_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);
        handle_t *handle;
        struct inode *inode;
        int err, credits, retries = 0;
@@ -2807,7 +2806,7 @@ static int ext4_create(struct mnt_idmap *idmap, struct inode *dir,
        credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
                   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);
 retry:
-       inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, &dentry->d_name,
+       inode = ext4_new_inode_start_handle(idmap, dir, mode, &dentry->d_name,
                                            0, NULL, EXT4_HT_DIR, credits);
        handle = ext4_journal_current_handle();
        err = PTR_ERR(inode);
@@ -2831,7 +2830,6 @@ retry:
 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;
@@ -2843,7 +2841,7 @@ static int ext4_mknod(struct mnt_idmap *idmap, struct inode *dir,
        credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
                   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);
 retry:
-       inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, &dentry->d_name,
+       inode = ext4_new_inode_start_handle(idmap, dir, mode, &dentry->d_name,
                                            0, NULL, EXT4_HT_DIR, credits);
        handle = ext4_journal_current_handle();
        err = PTR_ERR(inode);
@@ -2866,7 +2864,6 @@ retry:
 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;
@@ -2876,7 +2873,7 @@ static int ext4_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                return err;
 
 retry:
-       inode = ext4_new_inode_start_handle(mnt_userns, dir, mode,
+       inode = ext4_new_inode_start_handle(idmap, dir, mode,
                                            NULL, 0, NULL,
                                            EXT4_HT_DIR,
                        EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) +
@@ -2978,7 +2975,6 @@ out:
 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;
@@ -2993,7 +2989,7 @@ static int ext4_mkdir(struct mnt_idmap *idmap, struct inode *dir,
        credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
                   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);
 retry:
-       inode = ext4_new_inode_start_handle(mnt_userns, dir, S_IFDIR | mode,
+       inode = ext4_new_inode_start_handle(idmap, dir, S_IFDIR | mode,
                                            &dentry->d_name,
                                            0, NULL, EXT4_HT_DIR, credits);
        handle = ext4_journal_current_handle();
@@ -3346,7 +3342,6 @@ out:
 static int ext4_symlink(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, const char *symname)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        handle_t *handle;
        struct inode *inode;
        int err, len = strlen(symname);
@@ -3375,7 +3370,7 @@ static int ext4_symlink(struct mnt_idmap *idmap, struct inode *dir,
        credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
                  EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3;
 retry:
-       inode = ext4_new_inode_start_handle(mnt_userns, dir, S_IFLNK|S_IRWXUGO,
+       inode = ext4_new_inode_start_handle(idmap, dir, S_IFLNK|S_IRWXUGO,
                                            &dentry->d_name, 0, NULL,
                                            EXT4_HT_DIR, credits);
        handle = ext4_journal_current_handle();
@@ -3725,7 +3720,7 @@ static void ext4_update_dir_count(handle_t *handle, struct ext4_renament *ent)
        }
 }
 
-static struct inode *ext4_whiteout_for_rename(struct user_namespace *mnt_userns,
+static struct inode *ext4_whiteout_for_rename(struct mnt_idmap *idmap,
                                              struct ext4_renament *ent,
                                              int credits, handle_t **h)
 {
@@ -3740,7 +3735,7 @@ static struct inode *ext4_whiteout_for_rename(struct user_namespace *mnt_userns,
        credits += (EXT4_MAXQUOTAS_TRANS_BLOCKS(ent->dir->i_sb) +
                    EXT4_XATTR_TRANS_BLOCKS + 4);
 retry:
-       wh = ext4_new_inode_start_handle(mnt_userns, ent->dir,
+       wh = ext4_new_inode_start_handle(idmap, ent->dir,
                                         S_IFCHR | WHITEOUT_MODE,
                                         &ent->dentry->d_name, 0, NULL,
                                         EXT4_HT_DIR, credits);
@@ -3768,7 +3763,7 @@ retry:
  * while new_{dentry,inode) refers to the destination dentry/inode
  * This comes from rename(const char *oldpath, const char *newpath)
  */
-static int ext4_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
+static int ext4_rename(struct mnt_idmap *idmap, struct inode *old_dir,
                       struct dentry *old_dentry, struct inode *new_dir,
                       struct dentry *new_dentry, unsigned int flags)
 {
@@ -3856,7 +3851,7 @@ static int ext4_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
                        goto release_bh;
                }
        } else {
-               whiteout = ext4_whiteout_for_rename(mnt_userns, &old, credits, &handle);
+               whiteout = ext4_whiteout_for_rename(idmap, &old, credits, &handle);
                if (IS_ERR(whiteout)) {
                        retval = PTR_ERR(whiteout);
                        goto release_bh;
@@ -4168,7 +4163,6 @@ static int ext4_rename2(struct mnt_idmap *idmap,
                        struct inode *new_dir, struct dentry *new_dentry,
                        unsigned int flags)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        int err;
 
        if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb))))
@@ -4187,7 +4181,7 @@ static int ext4_rename2(struct mnt_idmap *idmap,
                                         new_dir, new_dentry);
        }
 
-       return ext4_rename(mnt_userns, old_dir, old_dentry, new_dir, new_dentry, flags);
+       return ext4_rename(idmap, old_dir, old_dentry, new_dir, new_dentry, flags);
 }
 
 /*
index cf0217d3640219bc315c9910ab50540d1165dee8..9a3ffa39ad30ede1dff0ac55d1b95cdd61abab20 100644 (file)
@@ -3505,7 +3505,7 @@ void f2fs_handle_failed_inode(struct inode *inode);
 int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name,
                                                        bool hot, bool set);
 struct dentry *f2fs_get_parent(struct dentry *child);
-int f2fs_get_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+int f2fs_get_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                     struct inode **new_inode);
 
 /*
index 96dd5cb2f49c1b0f3411c4fc0bd8f7b4dbd7ac65..1d514515a6e7feea53d20bd49d9e2d3eac20ac02 100644 (file)
@@ -2040,7 +2040,8 @@ static int f2fs_ioc_getversion(struct file *filp, unsigned long arg)
 static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)
 {
        struct inode *inode = file_inode(filp);
-       struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
+       struct mnt_idmap *idmap = file_mnt_idmap(filp);
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct f2fs_inode_info *fi = F2FS_I(inode);
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        struct inode *pinode;
@@ -2097,7 +2098,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)
                goto out;
        }
 
-       ret = f2fs_get_tmpfile(mnt_userns, pinode, &fi->cow_inode);
+       ret = f2fs_get_tmpfile(idmap, pinode, &fi->cow_inode);
        iput(pinode);
        if (ret) {
                f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
index 938032cbc1a84ed5aec1b147f37c213f3973e9c8..d8e01bbbf27fb4a6a63b89897570872d5786c6de 100644 (file)
@@ -202,7 +202,7 @@ static void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode,
                file_set_hot(inode);
 }
 
-static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
+static struct inode *f2fs_new_inode(struct mnt_idmap *idmap,
                                                struct inode *dir, umode_t mode,
                                                const char *name)
 {
@@ -225,7 +225,7 @@ static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
 
        nid_free = true;
 
-       inode_init_owner(mnt_userns, inode, dir, mode);
+       inode_init_owner(idmap, inode, dir, mode);
 
        inode->i_ino = ino;
        inode->i_blocks = 0;
@@ -336,7 +336,6 @@ fail_drop:
 static int f2fs_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);
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        struct inode *inode;
        nid_t ino = 0;
@@ -351,7 +350,7 @@ static int f2fs_create(struct mnt_idmap *idmap, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(mnt_userns, dir, mode, dentry->d_name.name);
+       inode = f2fs_new_inode(idmap, dir, mode, dentry->d_name.name);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -663,7 +662,6 @@ static const char *f2fs_get_link(struct dentry *dentry,
 static int f2fs_symlink(struct mnt_idmap *idmap, struct inode *dir,
                        struct dentry *dentry, const char *symname)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        struct inode *inode;
        size_t len = strlen(symname);
@@ -684,7 +682,7 @@ static int f2fs_symlink(struct mnt_idmap *idmap, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(mnt_userns, dir, S_IFLNK | S_IRWXUGO, NULL);
+       inode = f2fs_new_inode(idmap, dir, S_IFLNK | S_IRWXUGO, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -744,7 +742,6 @@ out_free_encrypted_link:
 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;
@@ -756,7 +753,7 @@ static int f2fs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(mnt_userns, dir, S_IFDIR | mode, NULL);
+       inode = f2fs_new_inode(idmap, dir, S_IFDIR | mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -800,7 +797,6 @@ static int f2fs_rmdir(struct inode *dir, struct dentry *dentry)
 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;
@@ -814,7 +810,7 @@ static int f2fs_mknod(struct mnt_idmap *idmap, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(mnt_userns, dir, mode, NULL);
+       inode = f2fs_new_inode(idmap, dir, mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -841,7 +837,7 @@ 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, bool is_whiteout,
                          struct inode **new_inode)
 {
@@ -853,7 +849,7 @@ static int __f2fs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(mnt_userns, dir, mode, NULL);
+       inode = f2fs_new_inode(idmap, dir, mode, NULL);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -914,7 +910,6 @@ out:
 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;
 
@@ -923,28 +918,28 @@ static int f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
 
-       err = __f2fs_tmpfile(mnt_userns, dir, file, mode, false, NULL);
+       err = __f2fs_tmpfile(idmap, dir, file, mode, false, NULL);
 
        return finish_open_simple(file, err);
 }
 
-static int f2fs_create_whiteout(struct user_namespace *mnt_userns,
+static int f2fs_create_whiteout(struct mnt_idmap *idmap,
                                struct inode *dir, struct inode **whiteout)
 {
        if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
                return -EIO;
 
-       return __f2fs_tmpfile(mnt_userns, dir, NULL,
+       return __f2fs_tmpfile(idmap, dir, NULL,
                                S_IFCHR | WHITEOUT_MODE, true, whiteout);
 }
 
-int f2fs_get_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+int f2fs_get_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                     struct inode **new_inode)
 {
-       return __f2fs_tmpfile(mnt_userns, dir, NULL, S_IFREG, false, new_inode);
+       return __f2fs_tmpfile(idmap, dir, NULL, S_IFREG, false, new_inode);
 }
 
-static int f2fs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
+static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
                        struct dentry *old_dentry, struct inode *new_dir,
                        struct dentry *new_dentry, unsigned int flags)
 {
@@ -984,7 +979,7 @@ static int f2fs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
        }
 
        if (flags & RENAME_WHITEOUT) {
-               err = f2fs_create_whiteout(mnt_userns, old_dir, &whiteout);
+               err = f2fs_create_whiteout(idmap, old_dir, &whiteout);
                if (err)
                        return err;
        }
@@ -1305,7 +1300,6 @@ static int f2fs_rename2(struct mnt_idmap *idmap,
                        struct inode *new_dir, struct dentry *new_dentry,
                        unsigned int flags)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        int err;
 
        if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
@@ -1324,7 +1318,7 @@ static int f2fs_rename2(struct mnt_idmap *idmap,
         * VFS has already handled the new dentry existence case,
         * here, we just deal with "RENAME_NOREPLACE" as regular rename.
         */
-       return f2fs_rename(mnt_userns, old_dir, old_dentry,
+       return f2fs_rename(idmap, old_dir, old_dentry,
                                        new_dir, new_dentry, flags);
 }
 
index c9ce69728a53879b4018003a4b9fd44eb88890f3..abb91f5fae9211b752914df35a96e50dff846301 100644 (file)
@@ -390,7 +390,7 @@ struct inode *hfsplus_new_inode(struct super_block *sb, struct inode *dir,
                return NULL;
 
        inode->i_ino = sbi->next_cnid++;
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        set_nlink(inode, 1);
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
 
index e1acab15e70dc26e741b5185695fd70117533b35..0ce1cc4c2add6720fddc9d0186928c1a089de78f 100644 (file)
@@ -980,7 +980,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
                struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
 
                inode->i_ino = get_next_ino();
-               inode_init_owner(&init_user_ns, inode, dir, mode);
+               inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
                lockdep_set_class(&inode->i_mapping->i_mmap_rwsem,
                                &hugetlbfs_i_mmap_rwsem_key);
                inode->i_mapping->a_ops = &hugetlbfs_aops;
index 346d9199ad080bc48bdbfaf78b2e22c361782109..413b7380a08942b839271363c4f15689a39f7e16 100644 (file)
@@ -2279,20 +2279,22 @@ EXPORT_SYMBOL(init_special_inode);
 
 /**
  * inode_init_owner - Init uid,gid,mode for new inode according to posix standards
- * @mnt_userns:        User namespace of the mount the inode was created from
+ * @idmap: idmap of the mount the inode was created from
  * @inode: New inode
  * @dir: Directory inode
  * @mode: mode of the new inode
  *
- * If the inode has been created through an idmapped mount the user namespace of
- * the vfsmount must be passed through @mnt_userns. This function will then take
- * care to map the inode according to @mnt_userns before checking permissions
+ * If the inode has been created through an idmapped mount the idmap of
+ * the vfsmount must be passed through @idmap. This function will then take
+ * care to map the inode according to @idmap before checking permissions
  * and initializing i_uid and i_gid. On non-idmapped mounts or if permission
- * checking is to be performed on the raw inode simply passs init_user_ns.
+ * checking is to be performed on the raw inode simply pass @nop_mnt_idmap.
  */
-void inode_init_owner(struct user_namespace *mnt_userns, struct inode *inode,
+void inode_init_owner(struct mnt_idmap *idmap, struct inode *inode,
                      const struct inode *dir, umode_t mode)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
+
        inode_fsuid_set(inode, mnt_userns);
        if (dir && dir->i_mode & S_ISGID) {
                inode->i_gid = dir->i_gid;
index 59379089e939efd5ceaa38ac1b08a99abe2bf036..9e1f02767201d0d2ee0ddef1eac4bff1899d19ac 100644 (file)
@@ -64,7 +64,7 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
                goto fail_put;
        }
 
-       inode_init_owner(&init_user_ns, inode, parent, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, parent, mode);
        /*
         * New inodes need to save sane values on disk when
         * uid & gid mount options are used
index 9115948c624ee43fff95c56f9f3da71ff7ef8bcf..724d8191a31012c0ff35926742ea65aa7f6c7ce8 100644 (file)
@@ -252,7 +252,7 @@ struct inode *minix_new_inode(const struct inode *dir, umode_t mode, int *error)
                iput(inode);
                return NULL;
        }
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        inode->i_ino = j;
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
        inode->i_blocks = 0;
index 7044bfff00ddfc0645810aab32d18d981659c107..1310d2d5feb38778188d894fa0bc189c4a7f30e3 100644 (file)
@@ -364,7 +364,7 @@ struct inode *nilfs_new_inode(struct inode *dir, umode_t mode)
        ii->i_bh = bh;
 
        atomic64_inc(&root->inodes_count);
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        inode->i_ino = ino;
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
 
index 2a9347e747e5714f8cf1d608a9b4f64888d1e6b9..8ce2616b087f1853a68a5982aca5f83a0fc815d6 100644 (file)
@@ -1192,7 +1192,6 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap,
                                struct ntfs_fnd *fnd)
 {
        int err;
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct super_block *sb = dir->i_sb;
        struct ntfs_sb_info *sbi = sb->s_fs_info;
        const struct qstr *name = &dentry->d_name;
@@ -1308,7 +1307,7 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap,
                goto out3;
        }
        inode = &ni->vfs_inode;
-       inode_init_owner(mnt_userns, inode, dir, mode);
+       inode_init_owner(idmap, inode, dir, mode);
        mode = inode->i_mode;
 
        inode->i_atime = inode->i_mtime = inode->i_ctime = ni->i_crtime =
index 80146869eac909c47bb573f3958f447c3f1451be..ba26c5567cff775ce129ddf09ab7eac1f5e70bef 100644 (file)
@@ -336,7 +336,7 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb)
 
        if (inode) {
                inode->i_ino = get_next_ino();
-               inode_init_owner(&init_user_ns, inode, NULL, mode);
+               inode_init_owner(&nop_mnt_idmap, inode, NULL, mode);
                inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
                inc_nlink(inode);
 
@@ -359,7 +359,7 @@ static struct inode *dlmfs_get_inode(struct inode *parent,
                return NULL;
 
        inode->i_ino = get_next_ino();
-       inode_init_owner(&init_user_ns, inode, parent, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, parent, mode);
        inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
 
        ip = DLMFS_I(inode);
index 13433e774e3d15fecb864bb615d4cba7f0aba55d..892d83576dae0add365a133320be4d945b0603fc 100644 (file)
@@ -198,7 +198,7 @@ static struct inode *ocfs2_get_init_inode(struct inode *dir, umode_t mode)
        if (S_ISDIR(mode))
                set_nlink(inode, 2);
        mode = mode_strip_sgid(&init_user_ns, dir, mode);
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        status = dquot_initialize(inode);
        if (status)
                return ERR_PTR(status);
index 2a0e83236c0115f938dc209c059533dbeb0f0246..c4c79e07efc79d2e9902bdbc452cdedded47d0e0 100644 (file)
@@ -48,7 +48,7 @@ struct inode *omfs_new_inode(struct inode *dir, umode_t mode)
                goto fail;
 
        inode->i_ino = new_block;
-       inode_init_owner(&init_user_ns, inode, NULL, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, NULL, mode);
        inode->i_mapping->a_ops = &omfs_aops;
 
        inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
index 17d5091562156db838268a9be14cd52a2834fe8d..fc25fb95d5fc03c45ea69c36f79a727494e867fc 100644 (file)
@@ -641,7 +641,7 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
        inode->i_state |= I_CREATING;
        spin_unlock(&inode->i_lock);
 
-       inode_init_owner(&init_user_ns, inode, dentry->d_parent->d_inode, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dentry->d_parent->d_inode, mode);
        attr.mode = inode->i_mode;
 
        err = ovl_create_or_link(dentry, inode, &attr, false);
index ba14f18bd1e513ae2e30f14fe9fef86457ff1de7..5ba580c78835fd8a85ce01f4c2f377f839220290 100644 (file)
@@ -61,7 +61,7 @@ struct inode *ramfs_get_inode(struct super_block *sb,
 
        if (inode) {
                inode->i_ino = get_next_ino();
-               inode_init_owner(&init_user_ns, inode, dir, mode);
+               inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
                inode->i_mapping->a_ops = &ram_aops;
                mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER);
                mapping_set_unevictable(inode->i_mapping);
index f80b4a6ecf51edd20c6313988fb664e09b4c6c30..42d2c20e13455a7ad86a7d87dc5c61fdda82ab63 100644 (file)
@@ -616,7 +616,7 @@ static int new_inode_init(struct inode *inode, struct inode *dir, umode_t mode)
         * the quota init calls have to know who to charge the quota to, so
         * we have to set uid and gid here
         */
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        return dquot_initialize(inode);
 }
 
index 50df794a3c1f70d0fa1964a7a48c9cf475197635..e732879036ab6d5dfb28fb7306a1f6da68b687c0 100644 (file)
@@ -163,7 +163,7 @@ struct inode * sysv_new_inode(const struct inode * dir, umode_t mode)
        *sbi->s_sb_fic_count = cpu_to_fs16(sbi, count);
        fs16_add(sbi, sbi->s_sb_total_free_inodes, -1);
        dirty_sb(sb);
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        inode->i_ino = fs16_to_cpu(sbi, ino);
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
        inode->i_blocks = 0;
index 832e6adf9a928aac7686af23375d12c6864cf2c5..1e92c1730c16540cf804fa74299a7b1228eda45e 100644 (file)
@@ -95,7 +95,7 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
         */
        inode->i_flags |= S_NOCMTIME;
 
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        inode->i_mtime = inode->i_atime = inode->i_ctime =
                         current_time(inode);
        inode->i_mapping->nrpages = 0;
index b5d611cee749ca422b63dbf1db6fd15c629df3c8..e78a859d13e333133d884b97b93ee44015b1510e 100644 (file)
@@ -105,7 +105,7 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode)
                mutex_unlock(&sbi->s_alloc_mutex);
        }
 
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET))
                inode->i_uid = sbi->s_uid;
        if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET))
index 7e3e08c0166f779f96d8524a97bb3b48def6c90d..06bd84d555bd41f1d423d0637c35ce597624f0dd 100644 (file)
@@ -289,7 +289,7 @@ cg_found:
        ufs_mark_sb_dirty(sb);
 
        inode->i_ino = cg * uspi->s_ipg + bit;
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
        inode->i_blocks = 0;
        inode->i_generation = 0;
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
index d354ea2b74f96d8eed57c375b031e3916263bbfb..f6e27224bd59eea8c09b1ecb543fd9f85934d018 100644 (file)
@@ -777,7 +777,7 @@ xfs_inode_inherit_flags2(
  */
 int
 xfs_init_new_inode(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct xfs_trans        *tp,
        struct xfs_inode        *pip,
        xfs_ino_t               ino,
@@ -788,6 +788,7 @@ xfs_init_new_inode(
        bool                    init_xattrs,
        struct xfs_inode        **ipp)
 {
+       struct user_namespace   *mnt_userns = mnt_idmap_owner(idmap);
        struct inode            *dir = pip ? VFS_I(pip) : NULL;
        struct xfs_mount        *mp = tp->t_mountp;
        struct xfs_inode        *ip;
@@ -827,7 +828,7 @@ xfs_init_new_inode(
                inode->i_gid = dir->i_gid;
                inode->i_mode = mode;
        } else {
-               inode_init_owner(mnt_userns, inode, dir, mode);
+               inode_init_owner(idmap, inode, dir, mode);
        }
 
        /*
@@ -946,7 +947,7 @@ xfs_bumplink(
 
 int
 xfs_create(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        xfs_inode_t             *dp,
        struct xfs_name         *name,
        umode_t                 mode,
@@ -954,6 +955,7 @@ xfs_create(
        bool                    init_xattrs,
        xfs_inode_t             **ipp)
 {
+       struct user_namespace   *mnt_userns = mnt_idmap_owner(idmap);
        int                     is_dir = S_ISDIR(mode);
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_inode        *ip = NULL;
@@ -1020,7 +1022,7 @@ xfs_create(
         */
        error = xfs_dialloc(&tp, dp->i_ino, mode, &ino);
        if (!error)
-               error = xfs_init_new_inode(mnt_userns, tp, dp, ino, mode,
+               error = xfs_init_new_inode(idmap, tp, dp, ino, mode,
                                is_dir ? 2 : 1, rdev, prid, init_xattrs, &ip);
        if (error)
                goto out_trans_cancel;
@@ -1102,11 +1104,12 @@ xfs_create(
 
 int
 xfs_create_tmpfile(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct xfs_inode        *dp,
        umode_t                 mode,
        struct xfs_inode        **ipp)
 {
+       struct user_namespace   *mnt_userns = mnt_idmap_owner(idmap);
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_inode        *ip = NULL;
        struct xfs_trans        *tp = NULL;
@@ -1144,7 +1147,7 @@ xfs_create_tmpfile(
 
        error = xfs_dialloc(&tp, dp->i_ino, mode, &ino);
        if (!error)
-               error = xfs_init_new_inode(mnt_userns, tp, dp, ino, mode,
+               error = xfs_init_new_inode(idmap, tp, dp, ino, mode,
                                0, 0, prid, false, &ip);
        if (error)
                goto out_trans_cancel;
@@ -2709,7 +2712,7 @@ out_trans_abort:
  */
 static int
 xfs_rename_alloc_whiteout(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct xfs_name         *src_name,
        struct xfs_inode        *dp,
        struct xfs_inode        **wip)
@@ -2718,7 +2721,7 @@ xfs_rename_alloc_whiteout(
        struct qstr             name;
        int                     error;
 
-       error = xfs_create_tmpfile(mnt_userns, dp, S_IFCHR | WHITEOUT_MODE,
+       error = xfs_create_tmpfile(idmap, dp, S_IFCHR | WHITEOUT_MODE,
                                   &tmpfile);
        if (error)
                return error;
@@ -2750,7 +2753,7 @@ xfs_rename_alloc_whiteout(
  */
 int
 xfs_rename(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct xfs_inode        *src_dp,
        struct xfs_name         *src_name,
        struct xfs_inode        *src_ip,
@@ -2782,7 +2785,7 @@ xfs_rename(
         * appropriately.
         */
        if (flags & RENAME_WHITEOUT) {
-               error = xfs_rename_alloc_whiteout(mnt_userns, src_name,
+               error = xfs_rename_alloc_whiteout(idmap, src_name,
                                                  target_dp, &wip);
                if (error)
                        return error;
index fa780f08dc8918f3d9220a7e406b380efa7e1ad3..69d21e42c10a5f5d84f180d31397270bb83bf9b7 100644 (file)
@@ -473,18 +473,18 @@ int               xfs_release(struct xfs_inode *ip);
 void           xfs_inactive(struct xfs_inode *ip);
 int            xfs_lookup(struct xfs_inode *dp, const struct xfs_name *name,
                           struct xfs_inode **ipp, struct xfs_name *ci_name);
-int            xfs_create(struct user_namespace *mnt_userns,
+int            xfs_create(struct mnt_idmap *idmap,
                           struct xfs_inode *dp, struct xfs_name *name,
                           umode_t mode, dev_t rdev, bool need_xattr,
                           struct xfs_inode **ipp);
-int            xfs_create_tmpfile(struct user_namespace *mnt_userns,
+int            xfs_create_tmpfile(struct mnt_idmap *idmap,
                           struct xfs_inode *dp, umode_t mode,
                           struct xfs_inode **ipp);
 int            xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
                           struct xfs_inode *ip);
 int            xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
                         struct xfs_name *target_name);
-int            xfs_rename(struct user_namespace *mnt_userns,
+int            xfs_rename(struct mnt_idmap *idmap,
                           struct xfs_inode *src_dp, struct xfs_name *src_name,
                           struct xfs_inode *src_ip, struct xfs_inode *target_dp,
                           struct xfs_name *target_name,
@@ -515,7 +515,7 @@ void                xfs_lock_two_inodes(struct xfs_inode *ip0, uint ip0_mode,
 xfs_extlen_t   xfs_get_extsz_hint(struct xfs_inode *ip);
 xfs_extlen_t   xfs_get_cowextsz_hint(struct xfs_inode *ip);
 
-int xfs_init_new_inode(struct user_namespace *mnt_userns, struct xfs_trans *tp,
+int xfs_init_new_inode(struct mnt_idmap *idmap, struct xfs_trans *tp,
                struct xfs_inode *pip, xfs_ino_t ino, umode_t mode,
                xfs_nlink_t nlink, dev_t rdev, prid_t prid, bool init_xattrs,
                struct xfs_inode **ipp);
index 1323ac546e5ffc0e8ba0f571fcd7e5a50506e794..94c2f4aa675a2def1c47a1244cd9de2c520d8e95 100644 (file)
@@ -162,12 +162,12 @@ xfs_create_need_xattr(
 
 STATIC int
 xfs_generic_create(
-       struct user_namespace   *mnt_userns,
-       struct inode    *dir,
-       struct dentry   *dentry,
-       umode_t         mode,
-       dev_t           rdev,
-       struct file     *tmpfile)       /* unnamed file */
+       struct mnt_idmap        *idmap,
+       struct inode            *dir,
+       struct dentry           *dentry,
+       umode_t                 mode,
+       dev_t                   rdev,
+       struct file             *tmpfile)       /* unnamed file */
 {
        struct inode    *inode;
        struct xfs_inode *ip = NULL;
@@ -196,11 +196,11 @@ xfs_generic_create(
                goto out_free_acl;
 
        if (!tmpfile) {
-               error = xfs_create(mnt_userns, XFS_I(dir), &name, mode, rdev,
+               error = xfs_create(idmap, XFS_I(dir), &name, mode, rdev,
                                xfs_create_need_xattr(dir, default_acl, acl),
                                &ip);
        } else {
-               error = xfs_create_tmpfile(mnt_userns, XFS_I(dir), mode, &ip);
+               error = xfs_create_tmpfile(idmap, XFS_I(dir), mode, &ip);
        }
        if (unlikely(error))
                goto out_free_acl;
@@ -261,8 +261,7 @@ xfs_vn_mknod(
        umode_t                 mode,
        dev_t                   rdev)
 {
-       return xfs_generic_create(mnt_idmap_owner(idmap), dir, dentry, mode,
-                                 rdev, NULL);
+       return xfs_generic_create(idmap, dir, dentry, mode, rdev, NULL);
 }
 
 STATIC int
@@ -273,8 +272,7 @@ xfs_vn_create(
        umode_t                 mode,
        bool                    flags)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
-       return xfs_generic_create(mnt_userns, dir, dentry, mode, 0, NULL);
+       return xfs_generic_create(idmap, dir, dentry, mode, 0, NULL);
 }
 
 STATIC int
@@ -284,8 +282,7 @@ xfs_vn_mkdir(
        struct dentry           *dentry,
        umode_t                 mode)
 {
-       return xfs_generic_create(mnt_idmap_owner(idmap), dir, dentry,
-                                 mode | S_IFDIR, 0, NULL);
+       return xfs_generic_create(idmap, dir, dentry, mode | S_IFDIR, 0, NULL);
 }
 
 STATIC struct dentry *
@@ -407,7 +404,6 @@ xfs_vn_symlink(
        struct dentry           *dentry,
        const char              *symname)
 {
-       struct user_namespace   *mnt_userns = mnt_idmap_owner(idmap);
        struct inode    *inode;
        struct xfs_inode *cip = NULL;
        struct xfs_name name;
@@ -420,7 +416,7 @@ xfs_vn_symlink(
        if (unlikely(error))
                goto out;
 
-       error = xfs_symlink(mnt_userns, XFS_I(dir), &name, symname, mode, &cip);
+       error = xfs_symlink(idmap, XFS_I(dir), &name, symname, mode, &cip);
        if (unlikely(error))
                goto out;
 
@@ -453,7 +449,6 @@ xfs_vn_rename(
        struct dentry           *ndentry,
        unsigned int            flags)
 {
-       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode    *new_inode = d_inode(ndentry);
        int             omode = 0;
        int             error;
@@ -476,7 +471,7 @@ xfs_vn_rename(
        if (unlikely(error))
                return error;
 
-       return xfs_rename(mnt_userns, XFS_I(odir), &oname,
+       return xfs_rename(idmap, XFS_I(odir), &oname,
                          XFS_I(d_inode(odentry)), XFS_I(ndir), &nname,
                          new_inode ? XFS_I(new_inode) : NULL, flags);
 }
@@ -1103,9 +1098,7 @@ xfs_vn_tmpfile(
        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);
+       int err = xfs_generic_create(idmap, dir, file->f_path.dentry, mode, 0, file);
 
        return finish_open_simple(file, err);
 }
index ff53d40a2dae3ad5443980aef6922dfbfa20be6b..a7303a9aa40583908ba43ad6a4c442792f210764 100644 (file)
@@ -787,7 +787,7 @@ xfs_qm_qino_alloc(
 
                error = xfs_dialloc(&tp, 0, S_IFREG, &ino);
                if (!error)
-                       error = xfs_init_new_inode(&init_user_ns, tp, NULL, ino,
+                       error = xfs_init_new_inode(&nop_mnt_idmap, tp, NULL, ino,
                                        S_IFREG, 1, 0, 0, false, ipp);
                if (error) {
                        xfs_trans_cancel(tp);
index 8389f3ef88ef2c2055685d1dea06b41f3d184421..24cf0a16bf35acdd7b50e4c2b02343f40fe7c45a 100644 (file)
@@ -144,13 +144,14 @@ xfs_readlink(
 
 int
 xfs_symlink(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct xfs_inode        *dp,
        struct xfs_name         *link_name,
        const char              *target_path,
        umode_t                 mode,
        struct xfs_inode        **ipp)
 {
+       struct user_namespace   *mnt_userns = mnt_idmap_owner(idmap);
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_trans        *tp = NULL;
        struct xfs_inode        *ip = NULL;
@@ -231,7 +232,7 @@ xfs_symlink(
         */
        error = xfs_dialloc(&tp, dp->i_ino, S_IFLNK, &ino);
        if (!error)
-               error = xfs_init_new_inode(mnt_userns, tp, dp, ino,
+               error = xfs_init_new_inode(idmap, tp, dp, ino,
                                S_IFLNK | (mode & ~S_IFMT), 1, 0, prid,
                                false, &ip);
        if (error)
index 2586b7e393f39870440ed7a98d06395cd6765278..d1ca1ce62a93b91b51bff26796505dd612aa18cd 100644 (file)
@@ -7,7 +7,7 @@
 
 /* Kernel only symlink definitions */
 
-int xfs_symlink(struct user_namespace *mnt_userns, struct xfs_inode *dp,
+int xfs_symlink(struct mnt_idmap *idmap, struct xfs_inode *dp,
                struct xfs_name *link_name, const char *target_path,
                umode_t mode, struct xfs_inode **ipp);
 int xfs_readlink_bmap_ilocked(struct xfs_inode *ip, char *link);
index df3c139c7d0e376a0bc6d0c37e7adb772b7e72a3..371964ed09dcf7330c073e9089cf5dd27fa67eac 100644 (file)
@@ -1405,7 +1405,7 @@ static void zonefs_init_dir_inode(struct inode *parent, struct inode *inode,
        struct super_block *sb = parent->i_sb;
 
        inode->i_ino = bdev_nr_zones(sb->s_bdev) + type + 1;
-       inode_init_owner(&init_user_ns, inode, parent, S_IFDIR | 0555);
+       inode_init_owner(&nop_mnt_idmap, inode, parent, S_IFDIR | 0555);
        inode->i_op = &zonefs_dir_inode_operations;
        inode->i_fop = &simple_dir_operations;
        set_nlink(inode, 2);
index 635ce7a7740f17a4a02b4c6d2db935609238d906..c1d698923d15908dfda9234582ea1eedd1bd4b2a 100644 (file)
@@ -2014,7 +2014,7 @@ extern long compat_ptr_ioctl(struct file *file, unsigned int cmd,
 /*
  * VFS file helper functions.
  */
-void inode_init_owner(struct user_namespace *mnt_userns, struct inode *inode,
+void inode_init_owner(struct mnt_idmap *idmap, struct inode *inode,
                      const struct inode *dir, umode_t mode);
 extern bool may_open_dev(const struct path *path);
 umode_t mode_strip_sgid(struct user_namespace *mnt_userns,
index d4fa74bdf80cfcd039760ea713481ffa2f10e440..9948b542a470ebfa5a7f3bbc7f15d57d63f50678 100644 (file)
@@ -122,7 +122,7 @@ static struct inode *bpf_get_inode(struct super_block *sb,
        inode->i_mtime = inode->i_atime;
        inode->i_ctime = inode->i_atime;
 
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
 
        return inode;
 }
index ed0fa9ed0a3b9a0890f6f74bb412c6de143db4ea..028675cd97d445278c1ae2f6afad0577dd6d5f46 100644 (file)
@@ -2343,7 +2343,7 @@ static struct inode *shmem_get_inode(struct super_block *sb, struct inode *dir,
        inode = new_inode(sb);
        if (inode) {
                inode->i_ino = ino;
-               inode_init_owner(&init_user_ns, inode, dir, mode);
+               inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
                inode->i_blocks = 0;
                inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
                inode->i_generation = get_random_u32();