fs: port ->setattr() to pass mnt_idmap
authorChristian Brauner <brauner@kernel.org>
Fri, 13 Jan 2023 11:49:11 +0000 (12:49 +0100)
committerChristian Brauner (Microsoft) <brauner@kernel.org>
Thu, 19 Jan 2023 08:24:02 +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>
101 files changed:
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
arch/powerpc/platforms/cell/spufs/inode.c
fs/9p/acl.c
fs/9p/v9fs_vfs.h
fs/9p/vfs_inode.c
fs/9p/vfs_inode_dotl.c
fs/adfs/adfs.h
fs/adfs/inode.c
fs/affs/affs.h
fs/affs/inode.c
fs/afs/inode.c
fs/afs/internal.h
fs/attr.c
fs/bad_inode.c
fs/btrfs/inode.c
fs/ceph/inode.c
fs/ceph/super.h
fs/cifs/cifsfs.h
fs/cifs/inode.c
fs/coda/coda_linux.h
fs/coda/inode.c
fs/configfs/configfs_internal.h
fs/configfs/inode.c
fs/debugfs/inode.c
fs/ecryptfs/inode.c
fs/exfat/exfat_fs.h
fs/exfat/file.c
fs/ext2/ext2.h
fs/ext2/inode.c
fs/ext4/ext4.h
fs/ext4/inode.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/fat/fat.h
fs/fat/file.c
fs/fuse/dir.c
fs/gfs2/inode.c
fs/hfs/hfs_fs.h
fs/hfs/inode.c
fs/hfsplus/inode.c
fs/hostfs/hostfs_kern.c
fs/hpfs/hpfs_fn.h
fs/hpfs/inode.c
fs/hugetlbfs/inode.c
fs/jffs2/fs.c
fs/jffs2/os-linux.h
fs/jfs/file.c
fs/jfs/jfs_inode.h
fs/kernfs/inode.c
fs/kernfs/kernfs-internal.h
fs/libfs.c
fs/minix/file.c
fs/nfs/inode.c
fs/nfs/namespace.c
fs/nfsd/nfsproc.c
fs/nilfs2/inode.c
fs/nilfs2/nilfs.h
fs/ntfs/inode.c
fs/ntfs/inode.h
fs/ntfs3/file.c
fs/ntfs3/ntfs_fs.h
fs/ocfs2/dlmfs/dlmfs.c
fs/ocfs2/file.c
fs/ocfs2/file.h
fs/omfs/file.c
fs/orangefs/inode.c
fs/orangefs/orangefs-kernel.h
fs/overlayfs/inode.c
fs/overlayfs/overlayfs.h
fs/proc/base.c
fs/proc/generic.c
fs/proc/internal.h
fs/proc/proc_sysctl.c
fs/ramfs/file-nommu.c
fs/reiserfs/inode.c
fs/reiserfs/reiserfs.h
fs/reiserfs/xattr.c
fs/sysv/file.c
fs/ubifs/file.c
fs/ubifs/ubifs.h
fs/udf/file.c
fs/ufs/inode.c
fs/ufs/ufs.h
fs/vboxsf/utils.c
fs/vboxsf/vfsmod.h
fs/xfs/xfs_file.c
fs/xfs/xfs_iops.c
fs/xfs/xfs_iops.h
fs/xfs/xfs_pnfs.c
fs/zonefs/super.c
include/linux/evm.h
include/linux/fs.h
include/linux/nfs_fs.h
include/linux/security.h
mm/secretmem.c
mm/shmem.c
net/socket.c
security/integrity/evm/evm_main.c
security/integrity/evm/evm_secfs.c
security/security.c

index 36fa2a83d71410119bd9ee67e7e4494743abbc8b..04ad02dcd269b56177b60141a814eafa73588ff9 100644 (file)
@@ -71,7 +71,7 @@ prototypes::
        void (*truncate) (struct inode *);
        int (*permission) (struct inode *, int, unsigned int);
        struct posix_acl * (*get_inode_acl)(struct inode *, int, bool);
-       int (*setattr) (struct dentry *, struct iattr *);
+       int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *);
        int (*getattr) (const struct path *, struct kstat *, u32, unsigned int);
        ssize_t (*listxattr) (struct dentry *, char *, size_t);
        int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len);
index 2c15e70531137565ed5ab6b20fe690b60dafedce..894e2a5c3603d24c2796c3e5806bb346c3dbaa56 100644 (file)
@@ -436,7 +436,7 @@ As of kernel 2.6.22, the following members are defined:
                                         struct delayed_call *);
                int (*permission) (struct user_namespace *, struct inode *, int);
                struct posix_acl * (*get_inode_acl)(struct inode *, int, bool);
-               int (*setattr) (struct user_namespace *, struct dentry *, struct iattr *);
+               int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *);
                int (*getattr) (struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int);
                ssize_t (*listxattr) (struct dentry *, char *, size_t);
                void (*update_time)(struct inode *, struct timespec *, int);
index dbcfe361831a663bbe199d4e9c11cc073516adff..19fec984fdb0410541446e2862d39d0e78622fa0 100644 (file)
@@ -92,7 +92,7 @@ out:
 }
 
 static int
-spufs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+spufs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
              struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -100,7 +100,7 @@ spufs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if ((attr->ia_valid & ATTR_SIZE) &&
            (attr->ia_size != inode->i_size))
                return -EINVAL;
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index c397c51f80d9143a42e1e144c7f4179a4edb24d7..9848a245fa6f73d67318c0d76f365a5ee704c60c 100644 (file)
@@ -225,7 +225,7 @@ int v9fs_iop_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
                         * FIXME should we update ctime ?
                         * What is the following setxattr update the mode ?
                         */
-                       v9fs_vfs_setattr_dotl(&init_user_ns, dentry, &iattr);
+                       v9fs_vfs_setattr_dotl(&nop_mnt_idmap, dentry, &iattr);
                }
                break;
        case ACL_TYPE_DEFAULT:
index bc417da7e9c1d7d6e26f8080207dda0eba32fd92..75106b9f293d659cbc0ff1aebdd1b034a63db9a9 100644 (file)
@@ -60,7 +60,7 @@ void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat);
 int v9fs_uflags2omode(int uflags, int extended);
 
 void v9fs_blank_wstat(struct p9_wstat *wstat);
-int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_userns,
+int v9fs_vfs_setattr_dotl(struct mnt_idmap *idmap,
                          struct dentry *dentry, struct iattr *iattr);
 int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
                         int datasync);
index 27a04a226d973a42b57eeaadf589f9dddbbaf22d..d8cd3f17bbf319af16870e802b1602de1c13eec1 100644 (file)
@@ -1060,13 +1060,13 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
 
 /**
  * v9fs_vfs_setattr - set file metadata
- * @mnt_userns: The user namespace of the mount
+ * @idmap: idmap of the mount
  * @dentry: file whose metadata to set
  * @iattr: metadata assignment structure
  *
  */
 
-static int v9fs_vfs_setattr(struct user_namespace *mnt_userns,
+static int v9fs_vfs_setattr(struct mnt_idmap *idmap,
                            struct dentry *dentry, struct iattr *iattr)
 {
        int retval, use_dentry = 0;
@@ -1077,7 +1077,7 @@ static int v9fs_vfs_setattr(struct user_namespace *mnt_userns,
        struct p9_wstat wstat;
 
        p9_debug(P9_DEBUG_VFS, "\n");
-       retval = setattr_prepare(&init_user_ns, dentry, iattr);
+       retval = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (retval)
                return retval;
 
@@ -1135,7 +1135,7 @@ static int v9fs_vfs_setattr(struct user_namespace *mnt_userns,
 
        v9fs_invalidate_inode_attr(inode);
 
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        mark_inode_dirty(inode);
        return 0;
 }
index f806b3f116496858a224cce8e1955ae4dd3d9be1..dfe6b4017bd00b63c8b98032a9b04d35014ddb52 100644 (file)
@@ -529,13 +529,13 @@ static int v9fs_mapped_iattr_valid(int iattr_valid)
 
 /**
  * v9fs_vfs_setattr_dotl - set file metadata
- * @mnt_userns: The user namespace of the mount
+ * @idmap: idmap of the mount
  * @dentry: file whose metadata to set
  * @iattr: metadata assignment structure
  *
  */
 
-int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_userns,
+int v9fs_vfs_setattr_dotl(struct mnt_idmap *idmap,
                          struct dentry *dentry, struct iattr *iattr)
 {
        int retval, use_dentry = 0;
@@ -548,7 +548,7 @@ int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_userns,
 
        p9_debug(P9_DEBUG_VFS, "\n");
 
-       retval = setattr_prepare(&init_user_ns, dentry, iattr);
+       retval = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (retval)
                return retval;
 
@@ -597,7 +597,7 @@ int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_userns,
                truncate_setsize(inode, iattr->ia_size);
 
        v9fs_invalidate_inode_attr(inode);
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        mark_inode_dirty(inode);
        if (iattr->ia_valid & ATTR_MODE) {
                /* We also want to update ACL when we update mode bits */
index 06b7c92343ad137f52c959b5a2a47257469d8212..223f0283d20f91939bc5948e4fb19da8dd5adc6d 100644 (file)
@@ -144,7 +144,7 @@ struct adfs_discmap {
 /* Inode stuff */
 struct inode *adfs_iget(struct super_block *sb, struct object_info *obj);
 int adfs_write_inode(struct inode *inode, struct writeback_control *wbc);
-int adfs_notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
+int adfs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
                       struct iattr *attr);
 
 /* map.c */
index ee22278b0cfc02f864e54029661f5bb861c69271..c3ac613d097578b2841f1aa17d04e1aff4f1ebd6 100644 (file)
@@ -294,7 +294,7 @@ out:
  * later.
  */
 int
-adfs_notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
+adfs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
                   struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -302,7 +302,7 @@ adfs_notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
        unsigned int ia_valid = attr->ia_valid;
        int error;
        
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
 
        /*
         * we can't change the UID or GID of any file -
index bfa89e131ead08cd8d1a5498268f894bf2cd7b50..8c98e2644a5e7f6cd8348d704e7955d5936812e5 100644 (file)
@@ -185,7 +185,7 @@ extern int  affs_rename2(struct user_namespace *mnt_userns,
 /* inode.c */
 
 extern struct inode            *affs_new_inode(struct inode *dir);
-extern int                      affs_notify_change(struct user_namespace *mnt_userns,
+extern int                      affs_notify_change(struct mnt_idmap *idmap,
                                        struct dentry *dentry, struct iattr *attr);
 extern void                     affs_evict_inode(struct inode *inode);
 extern struct inode            *affs_iget(struct super_block *sb,
index 2352a75bd9d6902da50cb317581ad922a7a185f3..27f77a52c5c80e4d8d6e33522d50486e31e0feba 100644 (file)
@@ -216,7 +216,7 @@ affs_write_inode(struct inode *inode, struct writeback_control *wbc)
 }
 
 int
-affs_notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
+affs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
                   struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -224,7 +224,7 @@ affs_notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
 
        pr_debug("notify_change(%lu,0x%x)\n", inode->i_ino, attr->ia_valid);
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                goto out;
 
@@ -250,7 +250,7 @@ affs_notify_change(struct user_namespace *mnt_userns, struct dentry *dentry,
                affs_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
 
        if (attr->ia_valid & ATTR_MODE)
index 6d3a3dbe4928617eb724ad5f9ee209c075c2321e..f001cf1750ecf4a27410eb92a6a61c2d621045de 100644 (file)
@@ -870,7 +870,7 @@ static const struct afs_operation_ops afs_setattr_operation = {
 /*
  * set the attributes of an inode
  */
-int afs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int afs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                struct iattr *attr)
 {
        const unsigned int supported =
index fd8567b98e2bba4d3c1dae156163a34e8cf464e6..e2a23efc91b66431bb4b826c4004d4e770b55f97 100644 (file)
@@ -1172,7 +1172,7 @@ extern bool afs_check_validity(struct afs_vnode *);
 extern int afs_validate(struct afs_vnode *, struct key *);
 extern int afs_getattr(struct user_namespace *mnt_userns, const struct path *,
                       struct kstat *, u32, unsigned int);
-extern int afs_setattr(struct user_namespace *mnt_userns, struct dentry *, struct iattr *);
+extern int afs_setattr(struct mnt_idmap *idmap, struct dentry *, struct iattr *);
 extern void afs_evict_inode(struct inode *);
 extern int afs_drop_inode(struct inode *);
 
index 023a3860568a9ce639e333feddc169e8b9b06696..39d35621e57b8975788833cf7f32a5f820b13071 100644 (file)
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -142,7 +142,7 @@ static bool chgrp_ok(struct user_namespace *mnt_userns,
 
 /**
  * setattr_prepare - check if attribute changes to a dentry are allowed
- * @mnt_userns:        user namespace of the mount the inode was found from
+ * @idmap:     idmap of the mount the inode was found from
  * @dentry:    dentry to check
  * @attr:      attributes to change
  *
@@ -152,18 +152,19 @@ static bool chgrp_ok(struct user_namespace *mnt_userns,
  * SGID bit from mode if user is not allowed to set it. Also file capabilities
  * and IMA extended attributes are cleared if ATTR_KILL_PRIV is set.
  *
- * If the inode has been found 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
+ * If the inode has been found 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. On non-idmapped mounts or if permission checking is to be
- * performed on the raw inode simply passs init_user_ns.
+ * performed on the raw inode simply passs @nop_mnt_idmap.
  *
  * Should be called as the first thing in ->setattr implementations,
  * possibly after taking additional locks.
  */
-int setattr_prepare(struct user_namespace *mnt_userns, struct dentry *dentry,
+int setattr_prepare(struct mnt_idmap *idmap, struct dentry *dentry,
                    struct iattr *attr)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode = d_inode(dentry);
        unsigned int ia_valid = attr->ia_valid;
 
@@ -276,7 +277,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
 
 /**
  * setattr_copy - copy simple metadata updates into the generic inode
- * @mnt_userns:        user namespace of the mount the inode was found from
+ * @idmap:     idmap of the mount the inode was found from
  * @inode:     the inode to be updated
  * @attr:      the new attributes
  *
@@ -289,19 +290,20 @@ EXPORT_SYMBOL(inode_newsize_ok);
  * Noticeably missing is inode size update, which is more complex
  * as it requires pagecache updates.
  *
- * If the inode has been found 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
+ * If the inode has been found 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. On non-idmapped mounts or if permission checking is to be
- * performed on the raw inode simply passs init_user_ns.
+ * performed on the raw inode simply pass @nop_mnt_idmap.
  *
  * The inode is not marked as dirty after this operation. The rationale is
  * that for "simple" filesystems, the struct inode is the inode storage.
  * The caller is free to mark the inode dirty afterwards if needed.
  */
-void setattr_copy(struct user_namespace *mnt_userns, struct inode *inode,
+void setattr_copy(struct mnt_idmap *idmap, struct inode *inode,
                  const struct iattr *attr)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        unsigned int ia_valid = attr->ia_valid;
 
        i_uid_update(mnt_userns, attr, inode);
@@ -472,7 +474,7 @@ int notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
            !vfsgid_valid(i_gid_into_vfsgid(mnt_userns, inode)))
                return -EOVERFLOW;
 
-       error = security_inode_setattr(mnt_userns, dentry, attr);
+       error = security_inode_setattr(idmap, dentry, attr);
        if (error)
                return error;
        error = try_break_deleg(inode, delegated_inode);
@@ -480,9 +482,9 @@ int notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
                return error;
 
        if (inode->i_op->setattr)
-               error = inode->i_op->setattr(mnt_userns, dentry, attr);
+               error = inode->i_op->setattr(idmap, dentry, attr);
        else
-               error = simple_setattr(mnt_userns, dentry, attr);
+               error = simple_setattr(idmap, dentry, attr);
 
        if (!error) {
                fsnotify_change(dentry, ia_valid);
index 92737166203f3e1208b79172774fb86eec5ef80b..9cb95ff99047d5ac63c4612a535b2913d6b9e06e 100644 (file)
@@ -102,7 +102,7 @@ static int bad_inode_getattr(struct user_namespace *mnt_userns,
        return -EIO;
 }
 
-static int bad_inode_setattr(struct user_namespace *mnt_userns,
+static int bad_inode_setattr(struct mnt_idmap *idmap,
                             struct dentry *direntry, struct iattr *attrs)
 {
        return -EIO;
index 8bcad994015487e9a049c7f0d99b1f685176afa8..36a897e5d8deafe8bd8d4d61f67efb5f87945951 100644 (file)
@@ -5281,7 +5281,7 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr)
        return ret;
 }
 
-static int btrfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+static int btrfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                         struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -5291,7 +5291,7 @@ static int btrfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentr
        if (btrfs_root_readonly(root))
                return -EROFS;
 
-       err = setattr_prepare(mnt_userns, dentry, attr);
+       err = setattr_prepare(idmap, dentry, attr);
        if (err)
                return err;
 
@@ -5302,12 +5302,13 @@ static int btrfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentr
        }
 
        if (attr->ia_valid) {
-               setattr_copy(mnt_userns, inode, attr);
+               setattr_copy(idmap, inode, attr);
                inode_inc_iversion(inode);
                err = btrfs_dirty_inode(BTRFS_I(inode));
 
                if (!err && attr->ia_valid & ATTR_MODE)
-                       err = posix_acl_chmod(mnt_userns, dentry, inode->i_mode);
+                       err = posix_acl_chmod(mnt_idmap_owner(idmap), dentry,
+                                             inode->i_mode);
        }
 
        return err;
index 23d05ec87fcc0ac215287fb099f7499ce240bc70..358aadd4329ab963b509076071a321e4de352ed5 100644 (file)
@@ -2227,7 +2227,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
 /*
  * setattr
  */
-int ceph_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ceph_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -2240,7 +2240,7 @@ int ceph_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if (ceph_inode_is_shutdown(inode))
                return -ESTALE;
 
-       err = setattr_prepare(&init_user_ns, dentry, attr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (err != 0)
                return err;
 
index 30bdb391a0dc088d6c72274539386228ebd3cdaa..a023a74b665094d87f563953cb26773d274f8006 100644 (file)
@@ -1043,7 +1043,7 @@ static inline int ceph_do_getattr(struct inode *inode, int mask, bool force)
 extern int ceph_permission(struct user_namespace *mnt_userns,
                           struct inode *inode, int mask);
 extern int __ceph_setattr(struct inode *inode, struct iattr *attr);
-extern int ceph_setattr(struct user_namespace *mnt_userns,
+extern int ceph_setattr(struct mnt_idmap *idmap,
                        struct dentry *dentry, struct iattr *attr);
 extern int ceph_getattr(struct user_namespace *mnt_userns,
                        const struct path *path, struct kstat *stat,
index 63a0ac2b93558a418dd20f3b64a7ac4e38867878..f93c295649df7d6be062f391962dc8eec50b4161 100644 (file)
@@ -74,7 +74,7 @@ extern int cifs_revalidate_mapping(struct inode *inode);
 extern int cifs_zap_mapping(struct inode *inode);
 extern int cifs_getattr(struct user_namespace *, const struct path *,
                        struct kstat *, u32, unsigned int);
-extern int cifs_setattr(struct user_namespace *, struct dentry *,
+extern int cifs_setattr(struct mnt_idmap *, struct dentry *,
                        struct iattr *);
 extern int cifs_fiemap(struct inode *, struct fiemap_extent_info *, u64 start,
                       u64 len);
index f145a59af89bed4c6aa2b77b76d85e67368bbf05..653f05ce287a12e25ecfbca751e7ba5c6096acc2 100644 (file)
@@ -2752,7 +2752,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
                attrs->ia_valid |= ATTR_FORCE;
 
-       rc = setattr_prepare(&init_user_ns, direntry, attrs);
+       rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
        if (rc < 0)
                goto out;
 
@@ -2859,7 +2859,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
                fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
        }
 
-       setattr_copy(&init_user_ns, inode, attrs);
+       setattr_copy(&nop_mnt_idmap, inode, attrs);
        mark_inode_dirty(inode);
 
        /* force revalidate when any of these times are set since some
@@ -2903,7 +2903,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
                attrs->ia_valid |= ATTR_FORCE;
 
-       rc = setattr_prepare(&init_user_ns, direntry, attrs);
+       rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
        if (rc < 0)
                goto cifs_setattr_exit;
 
@@ -3058,7 +3058,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
                fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
        }
 
-       setattr_copy(&init_user_ns, inode, attrs);
+       setattr_copy(&nop_mnt_idmap, inode, attrs);
        mark_inode_dirty(inode);
 
 cifs_setattr_exit:
@@ -3068,7 +3068,7 @@ cifs_setattr_exit:
 }
 
 int
-cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
+cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
             struct iattr *attrs)
 {
        struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
index 9be281bbcc066dc257ab8b5890415fcfede13519..b762525eb5a2c94e8d24b2583a4acd94c9d17357 100644 (file)
@@ -51,7 +51,7 @@ int coda_permission(struct user_namespace *mnt_userns, struct inode *inode,
 int coda_revalidate_inode(struct inode *);
 int coda_getattr(struct user_namespace *, const struct path *, struct kstat *,
                 u32, unsigned int);
-int coda_setattr(struct user_namespace *, struct dentry *, struct iattr *);
+int coda_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
 
 /* this file:  helpers */
 char *coda_f2s(struct CodaFid *f);
index 2185328b65c782aaa8649cc2d8f4116290eccdd4..8e5a431f7eb5f6b9ab3cecd38321399df9c59892 100644 (file)
@@ -260,7 +260,7 @@ int coda_getattr(struct user_namespace *mnt_userns, const struct path *path,
        return err;
 }
 
-int coda_setattr(struct user_namespace *mnt_userns, struct dentry *de,
+int coda_setattr(struct mnt_idmap *idmap, struct dentry *de,
                 struct iattr *iattr)
 {
        struct inode *inode = d_inode(de);
index c0395363eab9e86f8bbffb4e7ce5aa019d1e2f0c..a94493ed3146f06cdd7ad1db8584bafabe5e950d 100644 (file)
@@ -77,7 +77,7 @@ extern void configfs_hash_and_remove(struct dentry * dir, const char * name);
 
 extern const unsigned char * configfs_get_name(struct configfs_dirent *sd);
 extern void configfs_drop_dentry(struct configfs_dirent *sd, struct dentry *parent);
-extern int configfs_setattr(struct user_namespace *mnt_userns,
+extern int configfs_setattr(struct mnt_idmap *idmap,
                            struct dentry *dentry, struct iattr *iattr);
 
 extern struct dentry *configfs_pin_fs(void);
index b601610e99075a9cdd6151578ed2578ab00106d5..1c15edbe70ff7395ebd464452f823c7ca60dfec6 100644 (file)
@@ -32,7 +32,7 @@ static const struct inode_operations configfs_inode_operations ={
        .setattr        = configfs_setattr,
 };
 
-int configfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int configfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                     struct iattr *iattr)
 {
        struct inode * inode = d_inode(dentry);
@@ -60,7 +60,7 @@ int configfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        }
        /* attributes were changed atleast once in past */
 
-       error = simple_setattr(mnt_userns, dentry, iattr);
+       error = simple_setattr(idmap, dentry, iattr);
        if (error)
                return error;
 
index 2e8e112b19930dcfd8a308645692258d96879de9..ac76e6c6ac56aae532419031235a12c4312a56fd 100644 (file)
@@ -42,7 +42,7 @@ static unsigned int debugfs_allow __ro_after_init = DEFAULT_DEBUGFS_ALLOW_BITS;
  * so that we can use the file mode as part of a heuristic to determine whether
  * to lock down individual files.
  */
-static int debugfs_setattr(struct user_namespace *mnt_userns,
+static int debugfs_setattr(struct mnt_idmap *idmap,
                           struct dentry *dentry, struct iattr *ia)
 {
        int ret;
@@ -52,7 +52,7 @@ static int debugfs_setattr(struct user_namespace *mnt_userns,
                if (ret)
                        return ret;
        }
-       return simple_setattr(&init_user_ns, dentry, ia);
+       return simple_setattr(&nop_mnt_idmap, dentry, ia);
 }
 
 static const struct inode_operations debugfs_file_inode_operations = {
index d2c5a8c55322261858dfe545c7beeafaab7e9f36..011b03e5c9df41738403bef8b6e76b1f2d4b4efa 100644 (file)
@@ -873,7 +873,7 @@ ecryptfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
 
 /**
  * ecryptfs_setattr
- * @mnt_userns: user namespace of the target mount
+ * @idmap: idmap of the target mount
  * @dentry: dentry handle to the inode to modify
  * @ia: Structure with flags of what to change and values
  *
@@ -884,7 +884,7 @@ ecryptfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
  * All other metadata changes will be passed right to the lower filesystem,
  * and we will just update our inode to look like the lower.
  */
-static int ecryptfs_setattr(struct user_namespace *mnt_userns,
+static int ecryptfs_setattr(struct mnt_idmap *idmap,
                            struct dentry *dentry, struct iattr *ia)
 {
        int rc = 0;
@@ -939,7 +939,7 @@ static int ecryptfs_setattr(struct user_namespace *mnt_userns,
        }
        mutex_unlock(&crypt_stat->cs_mutex);
 
-       rc = setattr_prepare(&init_user_ns, dentry, ia);
+       rc = setattr_prepare(&nop_mnt_idmap, dentry, ia);
        if (rc)
                goto out;
        if (ia->ia_valid & ATTR_SIZE) {
index bc6d21d7c5adf11580e2d8a3df6fc61386ecc09e..7fd693a668c796eec2f58cd59a5fbc0d63674121 100644 (file)
@@ -450,7 +450,7 @@ int exfat_trim_fs(struct inode *inode, struct fstrim_range *range);
 extern const struct file_operations exfat_file_operations;
 int __exfat_truncate(struct inode *inode);
 void exfat_truncate(struct inode *inode);
-int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr);
 int exfat_getattr(struct user_namespace *mnt_userns, const struct path *path,
                  struct kstat *stat, unsigned int request_mask,
index f5b29072775de9221ac8e5bbf165d67abf91febc..da61838f8842b22bb6a1de2a5e4a16ebb1d31e2e 100644 (file)
@@ -242,7 +242,7 @@ int exfat_getattr(struct user_namespace *mnt_uerns, const struct path *path,
        return 0;
 }
 
-int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr)
 {
        struct exfat_sb_info *sbi = EXFAT_SB(dentry->d_sb);
@@ -266,7 +266,7 @@ int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                                ATTR_TIMES_SET);
        }
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        attr->ia_valid = ia_valid;
        if (error)
                goto out;
@@ -293,7 +293,7 @@ int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if (attr->ia_valid & ATTR_SIZE)
                inode->i_mtime = inode->i_ctime = current_time(inode);
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        exfat_truncate_atime(&inode->i_atime);
 
        if (attr->ia_valid & ATTR_SIZE) {
index 28de11a22e5f6cbc957a599e09508b8a75902175..4a3e95406ccef9681711ab809d55b8297ad41e35 100644 (file)
@@ -753,7 +753,7 @@ extern struct inode *ext2_iget (struct super_block *, unsigned long);
 extern int ext2_write_inode (struct inode *, struct writeback_control *);
 extern void ext2_evict_inode(struct inode *);
 extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int);
-extern int ext2_setattr (struct user_namespace *, struct dentry *, struct iattr *);
+extern int ext2_setattr (struct mnt_idmap *, struct dentry *, struct iattr *);
 extern int ext2_getattr (struct user_namespace *, const struct path *,
                         struct kstat *, u32, unsigned int);
 extern void ext2_set_inode_flags(struct inode *inode);
index 69aed9e2359e664d6c160d0b48ea82bea265445e..792b974a5beb5c4114cff57b6520bc4c07f7bbee 100644 (file)
@@ -1618,13 +1618,14 @@ int ext2_getattr(struct user_namespace *mnt_userns, const struct path *path,
        return 0;
 }
 
-int ext2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ext2_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *iattr)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, iattr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (error)
                return error;
 
@@ -1644,7 +1645,7 @@ int ext2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                if (error)
                        return error;
        }
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        if (iattr->ia_valid & ATTR_MODE)
                error = posix_acl_chmod(&init_user_ns, dentry, inode->i_mode);
        mark_inode_dirty(inode);
index 140e1eb300d177c22e82c84af60ba30beff0f0db..056704d4ac9ca170f88d876d43a854d521d43b48 100644 (file)
@@ -2976,7 +2976,7 @@ extern struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
        __ext4_iget((sb), (ino), (flags), __func__, __LINE__)
 
 extern int  ext4_write_inode(struct inode *, struct writeback_control *);
-extern int  ext4_setattr(struct user_namespace *, struct dentry *,
+extern int  ext4_setattr(struct mnt_idmap *, struct dentry *,
                         struct iattr *);
 extern u32  ext4_dio_alignment(struct inode *inode);
 extern int  ext4_getattr(struct user_namespace *, const struct path *,
index 9d9f414f99fec31941ca4a3efb27565156e8914e..18fed4f5108dc3c5997c15f64a62370b95372192 100644 (file)
@@ -5434,7 +5434,7 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode)
  *
  * Called with inode->i_rwsem down.
  */
-int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -5442,6 +5442,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        int orphan = 0;
        const unsigned int ia_valid = attr->ia_valid;
        bool inc_ivers = true;
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
 
        if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
                return -EIO;
@@ -5454,7 +5455,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                                  ATTR_GID | ATTR_TIMES_SET))))
                return -EPERM;
 
-       error = setattr_prepare(mnt_userns, dentry, attr);
+       error = setattr_prepare(idmap, dentry, attr);
        if (error)
                return error;
 
@@ -5630,7 +5631,7 @@ out_mmap_sem:
        if (!error) {
                if (inc_ivers)
                        inode_inc_iversion(inode);
-               setattr_copy(mnt_userns, inode, attr);
+               setattr_copy(idmap, inode, attr);
                mark_inode_dirty(inode);
        }
 
index e8953c3dc81ab465f5656fed205ee8ce88586cc7..55bd92d431e55093e73421050ead422aad3b7ed6 100644 (file)
@@ -3471,7 +3471,7 @@ int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock);
 int f2fs_truncate(struct inode *inode);
 int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
                 struct kstat *stat, u32 request_mask, unsigned int flags);
-int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr);
 int f2fs_truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end);
 void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count);
index a6c4012798860098bfab8010a8f032df6a59bcad..6ce71c9c8d46b488074b7ba60c267bcf927b3d66 100644 (file)
@@ -903,10 +903,11 @@ int f2fs_getattr(struct user_namespace *mnt_userns, const struct path *path,
 }
 
 #ifdef CONFIG_F2FS_FS_POSIX_ACL
-static void __setattr_copy(struct user_namespace *mnt_userns,
+static void __setattr_copy(struct mnt_idmap *idmap,
                           struct inode *inode, const struct iattr *attr)
 {
        unsigned int ia_valid = attr->ia_valid;
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
 
        i_uid_update(mnt_userns, attr, inode);
        i_gid_update(mnt_userns, attr, inode);
@@ -930,9 +931,10 @@ static void __setattr_copy(struct user_namespace *mnt_userns,
 #define __setattr_copy setattr_copy
 #endif
 
-int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct inode *inode = d_inode(dentry);
        int err;
 
@@ -951,7 +953,7 @@ int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                !f2fs_is_compress_backend_ready(inode))
                return -EOPNOTSUPP;
 
-       err = setattr_prepare(mnt_userns, dentry, attr);
+       err = setattr_prepare(idmap, dentry, attr);
        if (err)
                return err;
 
@@ -1023,7 +1025,7 @@ int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                spin_unlock(&F2FS_I(inode)->i_size_lock);
        }
 
-       __setattr_copy(mnt_userns, inode, attr);
+       __setattr_copy(idmap, inode, attr);
 
        if (attr->ia_valid & ATTR_MODE) {
                err = posix_acl_chmod(mnt_userns, dentry, f2fs_get_inode_mode(inode));
index a415c02ede39fa923efde29903dd97068344d0d2..e38bd3a49f4612d07622de2c2fbd90e6e74d26ff 100644 (file)
@@ -398,7 +398,7 @@ extern long fat_generic_ioctl(struct file *filp, unsigned int cmd,
                              unsigned long arg);
 extern const struct file_operations fat_file_operations;
 extern const struct inode_operations fat_file_inode_operations;
-extern int fat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+extern int fat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                       struct iattr *attr);
 extern void fat_truncate_blocks(struct inode *inode, loff_t offset);
 extern int fat_getattr(struct user_namespace *mnt_userns,
index 8a6b493b5b5f64f7c22ae54ddb92addeb1605ce8..b762109a964f57358b8152b5f479b75ddea6ca7f 100644 (file)
@@ -90,13 +90,13 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)
         * out the RO attribute for checking by the security
         * module, just because it maps to a file mode.
         */
-       err = security_inode_setattr(file_mnt_user_ns(file),
+       err = security_inode_setattr(file_mnt_idmap(file),
                                     file->f_path.dentry, &ia);
        if (err)
                goto out_unlock_inode;
 
        /* This MUST be done before doing anything irreversible... */
-       err = fat_setattr(file_mnt_user_ns(file), file->f_path.dentry, &ia);
+       err = fat_setattr(file_mnt_idmap(file), file->f_path.dentry, &ia);
        if (err)
                goto out_unlock_inode;
 
@@ -477,9 +477,10 @@ static int fat_allow_set_time(struct user_namespace *mnt_userns,
 /* valid file mode bits */
 #define FAT_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXUGO)
 
-int fat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int fat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                struct iattr *attr)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb);
        struct inode *inode = d_inode(dentry);
        unsigned int ia_valid;
@@ -492,7 +493,7 @@ int fat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                        attr->ia_valid &= ~TIMES_SET_FLAGS;
        }
 
-       error = setattr_prepare(mnt_userns, dentry, attr);
+       error = setattr_prepare(idmap, dentry, attr);
        attr->ia_valid = ia_valid;
        if (error) {
                if (sbi->options.quiet)
@@ -564,7 +565,7 @@ int fat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                fat_truncate_time(inode, &attr->ia_mtime, S_MTIME);
        attr->ia_valid &= ~(ATTR_ATIME|ATTR_CTIME|ATTR_MTIME);
 
-       setattr_copy(mnt_userns, inode, attr);
+       setattr_copy(idmap, inode, attr);
        mark_inode_dirty(inode);
 out:
        return error;
index cd1a071b625abcc24930424dfb6b0b6292455263..1633f7e9fc543ebd842b0906f10710773aa7a2b7 100644 (file)
@@ -1690,7 +1690,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
        if (!fc->default_permissions)
                attr->ia_valid |= ATTR_FORCE;
 
-       err = setattr_prepare(&init_user_ns, dentry, attr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (err)
                return err;
 
@@ -1837,7 +1837,7 @@ error:
        return err;
 }
 
-static int fuse_setattr(struct user_namespace *mnt_userns, struct dentry *entry,
+static int fuse_setattr(struct mnt_idmap *idmap, struct dentry *entry,
                        struct iattr *attr)
 {
        struct inode *inode = d_inode(entry);
index 614db3055c024f36eec6d06f87a7036eff7efe44..0c8b64921c4ca56dcb5524bd8038d2dd421fb00f 100644 (file)
@@ -1881,7 +1881,7 @@ int gfs2_permission(struct user_namespace *mnt_userns, struct inode *inode,
 
 static int __gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
 {
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
@@ -1966,7 +1966,7 @@ out:
 
 /**
  * gfs2_setattr - Change attributes on an inode
- * @mnt_userns: User namespace of the mount the inode was found from
+ * @idmap: idmap of the mount the inode was found from
  * @dentry: The dentry which is changing
  * @attr: The structure describing the change
  *
@@ -1976,7 +1976,7 @@ out:
  * Returns: errno
  */
 
-static int gfs2_setattr(struct user_namespace *mnt_userns,
+static int gfs2_setattr(struct mnt_idmap *idmap,
                        struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -1996,7 +1996,7 @@ static int gfs2_setattr(struct user_namespace *mnt_userns,
        if (error)
                goto error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                goto error;
 
index 68d0305880f7141fa0129255efd51d8e0fa3082d..49d02524e66717a0f9d0c7cd595199a8650e35e6 100644 (file)
@@ -206,7 +206,7 @@ int hfs_write_begin(struct file *file, struct address_space *mapping,
 extern struct inode *hfs_new_inode(struct inode *, const struct qstr *, umode_t);
 extern void hfs_inode_write_fork(struct inode *, struct hfs_extent *, __be32 *, __be32 *);
 extern int hfs_write_inode(struct inode *, struct writeback_control *);
-extern int hfs_inode_setattr(struct user_namespace *, struct dentry *,
+extern int hfs_inode_setattr(struct mnt_idmap *, struct dentry *,
                             struct iattr *);
 extern void hfs_inode_read_fork(struct inode *inode, struct hfs_extent *ext,
                        __be32 log_size, __be32 phys_size, u32 clump_size);
index 9c329a365e7502a1243aa013b72dafb120b6749b..7817872a85e745f3286a24412c1733bd67943939 100644 (file)
@@ -606,14 +606,14 @@ static int hfs_file_release(struct inode *inode, struct file *file)
  *     correspond to the same HFS file.
  */
 
-int hfs_inode_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int hfs_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                      struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        struct hfs_sb_info *hsb = HFS_SB(inode->i_sb);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry,
+       error = setattr_prepare(&nop_mnt_idmap, dentry,
                                attr); /* basic permission checks */
        if (error)
                return error;
@@ -653,7 +653,7 @@ int hfs_inode_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                                                  current_time(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 840577a0c1e7696de6775a4f88b601f98987e5b8..00b242f6574a0dac120dc7c12a2a86f05bd271a1 100644 (file)
@@ -246,13 +246,13 @@ static int hfsplus_file_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static int hfsplus_setattr(struct user_namespace *mnt_userns,
+static int hfsplus_setattr(struct mnt_idmap *idmap,
                           struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -270,7 +270,7 @@ static int hfsplus_setattr(struct user_namespace *mnt_userns,
                inode->i_mtime = inode->i_ctime = current_time(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
 
        return 0;
index 277468783feeecbe8199da3d4ab7df924ff3e2e6..f8742b7390b8ece3f10f46598c80a8892dcc00b8 100644 (file)
@@ -790,7 +790,7 @@ static int hostfs_permission(struct user_namespace *mnt_userns,
        return err;
 }
 
-static int hostfs_setattr(struct user_namespace *mnt_userns,
+static int hostfs_setattr(struct mnt_idmap *idmap,
                          struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -800,7 +800,7 @@ static int hostfs_setattr(struct user_namespace *mnt_userns,
 
        int fd = HOSTFS_I(inode)->fd;
 
-       err = setattr_prepare(&init_user_ns, dentry, attr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (err)
                return err;
 
@@ -857,7 +857,7 @@ static int hostfs_setattr(struct user_namespace *mnt_userns,
            attr->ia_size != i_size_read(inode))
                truncate_setsize(inode, attr->ia_size);
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 167ec68846420e6bd8e094069b79d2eef424163f..f5a2476c47bf62415b11dd421df9ba1a42b27720 100644 (file)
@@ -280,7 +280,7 @@ void hpfs_init_inode(struct inode *);
 void hpfs_read_inode(struct inode *);
 void hpfs_write_inode(struct inode *);
 void hpfs_write_inode_nolock(struct inode *);
-int hpfs_setattr(struct user_namespace *, struct dentry *, struct iattr *);
+int hpfs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
 void hpfs_write_if_changed(struct inode *);
 void hpfs_evict_inode(struct inode *);
 
index 82208cc28ebd2e7d413b18ec534f375b911f1f0e..e50e92a424327a1cf45c16e1d1fb452ee109cf73 100644 (file)
@@ -257,7 +257,7 @@ void hpfs_write_inode_nolock(struct inode *i)
        brelse(bh);
 }
 
-int hpfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int hpfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -275,7 +275,7 @@ int hpfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size)
                goto out_unlock;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                goto out_unlock;
 
@@ -289,7 +289,7 @@ int hpfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                hpfs_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
 
        hpfs_write_inode(inode);
 
index 790d2727141a85318c4619c039b1690976b48965..b2f8884ed7415eee2f26bd8d9f5f47fd2cafdd5d 100644 (file)
@@ -898,7 +898,7 @@ out:
        return error;
 }
 
-static int hugetlbfs_setattr(struct user_namespace *mnt_userns,
+static int hugetlbfs_setattr(struct mnt_idmap *idmap,
                             struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -907,7 +907,7 @@ static int hugetlbfs_setattr(struct user_namespace *mnt_userns,
        unsigned int ia_valid = attr->ia_valid;
        struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -924,7 +924,7 @@ static int hugetlbfs_setattr(struct user_namespace *mnt_userns,
                hugetlb_vmtruncate(inode, newsize);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 66af51c416195a8136af575a0558f8f683a88225..28f7eea4c46d5e5a1132c0a4620a1118e1e42989 100644 (file)
@@ -190,13 +190,13 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
        return 0;
 }
 
-int jffs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int jffs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
        int rc;
 
-       rc = setattr_prepare(&init_user_ns, dentry, iattr);
+       rc = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (rc)
                return rc;
 
index 921d782583d6feb5767363477f7fcf1ddb9c8f77..8da19766c10111c6d84442c846a8d4be22b87fb5 100644 (file)
@@ -164,7 +164,7 @@ long jffs2_ioctl(struct file *, unsigned int, unsigned long);
 extern const struct inode_operations jffs2_symlink_inode_operations;
 
 /* fs.c */
-int jffs2_setattr (struct user_namespace *, struct dentry *, struct iattr *);
+int jffs2_setattr (struct mnt_idmap *, struct dentry *, struct iattr *);
 int jffs2_do_setattr (struct inode *, struct iattr *);
 struct inode *jffs2_iget(struct super_block *, unsigned long);
 void jffs2_evict_inode (struct inode *);
index 88663465aecd410d544bce9922055fa33d4f912a..8cda5d8112650f550b3a4dbe1d11f90ce70d2e8c 100644 (file)
@@ -85,24 +85,24 @@ static int jfs_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-int jfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int jfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
        int rc;
 
-       rc = setattr_prepare(&init_user_ns, dentry, iattr);
+       rc = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (rc)
                return rc;
 
-       if (is_quota_modification(mnt_userns, inode, iattr)) {
+       if (is_quota_modification(&init_user_ns, inode, iattr)) {
                rc = dquot_initialize(inode);
                if (rc)
                        return rc;
        }
        if ((iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)) ||
            (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid))) {
-               rc = dquot_transfer(mnt_userns, inode, iattr);
+               rc = dquot_transfer(&init_user_ns, inode, iattr);
                if (rc)
                        return rc;
        }
@@ -119,7 +119,7 @@ int jfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                jfs_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        mark_inode_dirty(inode);
 
        if (iattr->ia_valid & ATTR_MODE)
index 7de961a818623cb77586ebc558b1986fcff73b87..6440935a989515cfd4bb8555d579698dccb12b3b 100644 (file)
@@ -28,7 +28,7 @@ extern struct dentry *jfs_fh_to_parent(struct super_block *sb, struct fid *fid,
        int fh_len, int fh_type);
 extern void jfs_set_inode_flags(struct inode *);
 extern int jfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
-extern int jfs_setattr(struct user_namespace *, struct dentry *, struct iattr *);
+extern int jfs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
 
 extern const struct address_space_operations jfs_aops;
 extern const struct inode_operations jfs_dir_inode_operations;
index eac0f210299a053a247f7a8eeefbf7d6664ba276..691869b1e9dd8d517ca0c5e2a28fa469cf90d0f3 100644 (file)
@@ -107,7 +107,7 @@ int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)
        return ret;
 }
 
-int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                       struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
@@ -120,7 +120,7 @@ int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
 
        root = kernfs_root(kn);
        down_write(&root->kernfs_rwsem);
-       error = setattr_prepare(&init_user_ns, dentry, iattr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (error)
                goto out;
 
@@ -129,7 +129,7 @@ int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                goto out;
 
        /* this ignores size changes */
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
 
 out:
        up_write(&root->kernfs_rwsem);
index 9046d9f39e6356abeab2ef100c40b74a0cc4d678..0ccab5c997b65c63ccc106cf3d1897ebebb7cb48 100644 (file)
@@ -129,7 +129,7 @@ extern const struct xattr_handler *kernfs_xattr_handlers[];
 void kernfs_evict_inode(struct inode *inode);
 int kernfs_iop_permission(struct user_namespace *mnt_userns,
                          struct inode *inode, int mask);
-int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                       struct iattr *iattr);
 int kernfs_iop_getattr(struct user_namespace *mnt_userns,
                       const struct path *path, struct kstat *stat,
index aada4e7c871328ab9d775a8febd771ae41c5b3cf..0933726e3b6f5f83b36d4f27936477cd15cdb44c 100644 (file)
@@ -509,7 +509,7 @@ EXPORT_SYMBOL(simple_rename);
 
 /**
  * simple_setattr - setattr for simple filesystem
- * @mnt_userns: user namespace of the target mount
+ * @idmap: idmap of the target mount
  * @dentry: dentry
  * @iattr: iattr structure
  *
@@ -522,19 +522,19 @@ EXPORT_SYMBOL(simple_rename);
  * on simple regular filesystems.  Anything that needs to change on-disk
  * or wire state on size changes needs its own setattr method.
  */
-int simple_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int simple_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                   struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = setattr_prepare(mnt_userns, dentry, iattr);
+       error = setattr_prepare(idmap, dentry, iattr);
        if (error)
                return error;
 
        if (iattr->ia_valid & ATTR_SIZE)
                truncate_setsize(inode, iattr->ia_size);
-       setattr_copy(mnt_userns, inode, iattr);
+       setattr_copy(idmap, inode, iattr);
        mark_inode_dirty(inode);
        return 0;
 }
@@ -1324,7 +1324,7 @@ static int empty_dir_getattr(struct user_namespace *mnt_userns,
        return 0;
 }
 
-static int empty_dir_setattr(struct user_namespace *mnt_userns,
+static int empty_dir_setattr(struct mnt_idmap *idmap,
                             struct dentry *dentry, struct iattr *attr)
 {
        return -EPERM;
index 6a7bd2d9eec0c750b35a6b2ad3046475f7695d17..0dd05d47724af53317f6df69a8415dd2a1d6238c 100644 (file)
@@ -22,13 +22,13 @@ const struct file_operations minix_file_operations = {
        .splice_read    = generic_file_splice_read,
 };
 
-static int minix_setattr(struct user_namespace *mnt_userns,
+static int minix_setattr(struct mnt_idmap *idmap,
                         struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -42,7 +42,7 @@ static int minix_setattr(struct user_namespace *mnt_userns,
                minix_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index e98ee7599eebacc2f31ccbfe69e0b72651d604d3..d31ea0a1ebd6085e6bff56648f19adffdc9f960e 100644 (file)
@@ -606,7 +606,7 @@ EXPORT_SYMBOL_GPL(nfs_fhget);
 #define NFS_VALID_ATTRS (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_ATIME|ATTR_ATIME_SET|ATTR_MTIME|ATTR_MTIME_SET|ATTR_FILE|ATTR_OPEN)
 
 int
-nfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+nfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
            struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
index b0ef7e7ddb30671f9171b3ca22fa2ecad0964056..971132dfc93a81befd2098977925878c2a8b2a1e 100644 (file)
@@ -220,11 +220,11 @@ nfs_namespace_getattr(struct user_namespace *mnt_userns,
 }
 
 static int
-nfs_namespace_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+nfs_namespace_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                      struct iattr *attr)
 {
        if (NFS_FH(d_inode(dentry))->size != 0)
-               return nfs_setattr(mnt_userns, dentry, attr);
+               return nfs_setattr(idmap, dentry, attr);
        return -EACCES;
 }
 
index a5570cf75f3fd550a38b6b82fffdba4039fa9503..35cab9a65c17741f8e005e11f0bd1dca4855bc50 100644 (file)
@@ -93,7 +93,7 @@ nfsd_proc_setattr(struct svc_rqst *rqstp)
                if (delta < 0)
                        delta = -delta;
                if (delta < MAX_TOUCH_TIME_ERROR &&
-                   setattr_prepare(&init_user_ns, fhp->fh_dentry, iap) != 0) {
+                   setattr_prepare(&nop_mnt_idmap, fhp->fh_dentry, iap) != 0) {
                        /*
                         * Turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME.
                         * This will cause notify_change to set these times
index 232dd7b6cca14ba973fce7351d28579801942db9..30b145ff1a8df18ed1ef7b6f6b59ceba01baefd4 100644 (file)
@@ -949,7 +949,7 @@ void nilfs_evict_inode(struct inode *inode)
         */
 }
 
-int nilfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int nilfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *iattr)
 {
        struct nilfs_transaction_info ti;
@@ -957,7 +957,7 @@ int nilfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        struct super_block *sb = inode->i_sb;
        int err;
 
-       err = setattr_prepare(&init_user_ns, dentry, iattr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (err)
                return err;
 
@@ -972,7 +972,7 @@ int nilfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                nilfs_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        mark_inode_dirty(inode);
 
        if (iattr->ia_valid & ATTR_MODE) {
index aecda4fc95f5faea7fa5d75643bfe514a3c71120..7bac8e515aceaf7c028d0b7c756befa571e658da 100644 (file)
@@ -271,7 +271,7 @@ struct inode *nilfs_iget_for_shadow(struct inode *inode);
 extern void nilfs_update_inode(struct inode *, struct buffer_head *, int);
 extern void nilfs_truncate(struct inode *);
 extern void nilfs_evict_inode(struct inode *);
-extern int nilfs_setattr(struct user_namespace *, struct dentry *,
+extern int nilfs_setattr(struct mnt_idmap *, struct dentry *,
                         struct iattr *);
 extern void nilfs_write_failed(struct address_space *mapping, loff_t to);
 int nilfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
index 08c659332e26b0214e27f7753265e481aa6ce107..e6fc5f7cb1d750885910a043a2748afe531d6968 100644 (file)
@@ -2865,7 +2865,7 @@ void ntfs_truncate_vfs(struct inode *vi) {
 
 /**
  * ntfs_setattr - called from notify_change() when an attribute is being changed
- * @mnt_userns:        user namespace of the mount the inode was found from
+ * @idmap:     idmap of the mount the inode was found from
  * @dentry:    dentry whose attributes to change
  * @attr:      structure describing the attributes and the changes
  *
@@ -2878,14 +2878,14 @@ void ntfs_truncate_vfs(struct inode *vi) {
  *
  * Called with ->i_mutex held.
  */
-int ntfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ntfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
 {
        struct inode *vi = d_inode(dentry);
        int err;
        unsigned int ia_valid = attr->ia_valid;
 
-       err = setattr_prepare(&init_user_ns, dentry, attr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (err)
                goto out;
        /* We do not support NTFS ACLs yet. */
index 6f78ee00f57fe9af969fa77bb291eb935a50be56..147ef4ddb691490344731354e5e4f0f09493b603 100644 (file)
@@ -289,7 +289,7 @@ extern int ntfs_show_options(struct seq_file *sf, struct dentry *root);
 extern int ntfs_truncate(struct inode *vi);
 extern void ntfs_truncate_vfs(struct inode *vi);
 
-extern int ntfs_setattr(struct user_namespace *mnt_userns,
+extern int ntfs_setattr(struct mnt_idmap *idmap,
                        struct dentry *dentry, struct iattr *attr);
 
 extern int __ntfs_write_inode(struct inode *vi, int sync);
index e5399ebc3a2b2d856bf5b81b392f97af2cd79814..3303b6c8868091114809b3dbe18325ff198031d5 100644 (file)
@@ -657,7 +657,7 @@ out:
 /*
  * ntfs3_setattr - inode_operations::setattr
  */
-int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ntfs3_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr)
 {
        struct super_block *sb = dentry->d_sb;
@@ -676,7 +676,7 @@ int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                ia_valid = attr->ia_valid;
        }
 
-       err = setattr_prepare(mnt_userns, dentry, attr);
+       err = setattr_prepare(idmap, dentry, attr);
        if (err)
                goto out;
 
@@ -704,10 +704,10 @@ int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                inode->i_size = newsize;
        }
 
-       setattr_copy(mnt_userns, inode, attr);
+       setattr_copy(idmap, inode, attr);
 
        if (mode != inode->i_mode) {
-               err = ntfs_acl_chmod(mnt_userns, dentry);
+               err = ntfs_acl_chmod(mnt_idmap_owner(idmap), dentry);
                if (err)
                        goto out;
 
index 0e051c5595a213a8a17981642183bd22eb2f65b2..87073329712258be4dbf4a7434088f296c84d1f8 100644 (file)
@@ -494,8 +494,10 @@ extern const struct file_operations ntfs_dir_operations;
 /* Globals from file.c */
 int ntfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
                 struct kstat *stat, u32 request_mask, u32 flags);
-int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ntfs3_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr);
+void ntfs_sparse_cluster(struct inode *inode, struct page *page0, CLST vcn,
+                        CLST len);
 int ntfs_file_open(struct inode *inode, struct file *file);
 int ntfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
                __u64 start, __u64 len);
index 8b2020f92b5f074508af11c362acb4d58a239e42..2d907ac864097047ae6df5f04383a59bfa710e83 100644 (file)
@@ -188,18 +188,18 @@ static int dlmfs_file_release(struct inode *inode,
  * We do ->setattr() just to override size changes.  Our size is the size
  * of the LVB and nothing else.
  */
-static int dlmfs_file_setattr(struct user_namespace *mnt_userns,
+static int dlmfs_file_setattr(struct mnt_idmap *idmap,
                              struct dentry *dentry, struct iattr *attr)
 {
        int error;
        struct inode *inode = d_inode(dentry);
 
        attr->ia_valid &= ~ATTR_SIZE;
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 5c60b6bc85bf853fec215b1698bda07c48edf6ad..e157deb68d38895d5f549fa0c8f74f8b4758f3f4 100644 (file)
@@ -1111,9 +1111,10 @@ out:
        return ret;
 }
 
-int ocfs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr)
 {
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        int status = 0, size_change;
        int inode_locked = 0;
        struct inode *inode = d_inode(dentry);
@@ -1142,7 +1143,7 @@ int ocfs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if (!(attr->ia_valid & OCFS2_VALID_ATTRS))
                return 0;
 
-       status = setattr_prepare(&init_user_ns, dentry, attr);
+       status = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (status)
                return status;
 
@@ -1265,7 +1266,7 @@ int ocfs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                }
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
 
        status = ocfs2_mark_inode_dirty(handle, inode, bh);
index 71db8f3aa02775e31bc35b1a61fa061ebab350b5..76020b348df2c9826c3bf457113a23f3abef8169 100644 (file)
@@ -49,7 +49,7 @@ int ocfs2_extend_no_holes(struct inode *inode, struct buffer_head *di_bh,
                          u64 new_i_size, u64 zero_to);
 int ocfs2_zero_extend(struct inode *inode, struct buffer_head *di_bh,
                      loff_t zero_to);
-int ocfs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ocfs2_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr);
 int ocfs2_getattr(struct user_namespace *mnt_userns, const struct path *path,
                  struct kstat *stat, u32 request_mask, unsigned int flags);
index 3a5b4b88a583850a4a315b4f8676f11931d45107..0101f1f87b568f7d28d67829e4da87c259a31296 100644 (file)
@@ -337,13 +337,13 @@ const struct file_operations omfs_file_operations = {
        .splice_read = generic_file_splice_read,
 };
 
-static int omfs_setattr(struct user_namespace *mnt_userns,
+static int omfs_setattr(struct mnt_idmap *idmap,
                        struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -356,7 +356,7 @@ static int omfs_setattr(struct user_namespace *mnt_userns,
                omfs_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 4df56089438664049e3eca60a9e9d780205f3dd5..011892b23b5eab5e0b12794b85fd429d9ea9f09e 100644 (file)
@@ -822,7 +822,7 @@ again:
                ORANGEFS_I(inode)->attr_uid = current_fsuid();
                ORANGEFS_I(inode)->attr_gid = current_fsgid();
        }
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        spin_unlock(&inode->i_lock);
        mark_inode_dirty(inode);
 
@@ -846,13 +846,13 @@ int __orangefs_setattr_mode(struct dentry *dentry, struct iattr *iattr)
 /*
  * Change attributes of an object referenced by dentry.
  */
-int orangefs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int orangefs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                     struct iattr *iattr)
 {
        int ret;
        gossip_debug(GOSSIP_INODE_DEBUG, "__orangefs_setattr: called on %pd\n",
            dentry);
-       ret = setattr_prepare(&init_user_ns, dentry, iattr);
+       ret = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (ret)
                goto out;
        ret = __orangefs_setattr_mode(dentry, iattr);
index 6e0cc01b3a14d2b3c5268b51e3adcad5c0fd456e..142abd37cdda4b21de28817dbd60ec010aad5fc4 100644 (file)
@@ -362,7 +362,7 @@ struct inode *orangefs_new_inode(struct super_block *sb,
 
 int __orangefs_setattr(struct inode *, struct iattr *);
 int __orangefs_setattr_mode(struct dentry *dentry, struct iattr *iattr);
-int orangefs_setattr(struct user_namespace *, struct dentry *, struct iattr *);
+int orangefs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
 
 int orangefs_getattr(struct user_namespace *mnt_userns, const struct path *path,
                     struct kstat *stat, u32 request_mask, unsigned int flags);
index ee6dfa577c93b97728618a53a977d865f9157dc2..8796a0feb34f051e85c035995833e997106163b6 100644 (file)
@@ -19,7 +19,7 @@
 #include "overlayfs.h"
 
 
-int ovl_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                struct iattr *attr)
 {
        int err;
@@ -28,7 +28,7 @@ int ovl_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        struct dentry *upperdentry;
        const struct cred *old_cred;
 
-       err = setattr_prepare(&init_user_ns, dentry, attr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (err)
                return err;
 
@@ -677,7 +677,7 @@ int ovl_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
            !capable_wrt_inode_uidgid(&init_user_ns, inode, CAP_FSETID)) {
                struct iattr iattr = { .ia_valid = ATTR_KILL_SGID };
 
-               err = ovl_setattr(&init_user_ns, dentry, &iattr);
+               err = ovl_setattr(&nop_mnt_idmap, dentry, &iattr);
                if (err)
                        return err;
        }
index ff89454b07fcfc0677f87f620ae829c884c5101d..4cd435aabbb48fc4d8a514131d906443d4fdc9b3 100644 (file)
@@ -597,7 +597,7 @@ int ovl_set_nlink_lower(struct dentry *dentry);
 unsigned int ovl_get_nlink(struct ovl_fs *ofs, struct dentry *lowerdentry,
                           struct dentry *upperdentry,
                           unsigned int fallback);
-int ovl_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ovl_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                struct iattr *attr);
 int ovl_getattr(struct user_namespace *mnt_userns, const struct path *path,
                struct kstat *stat, u32 request_mask, unsigned int flags);
index 9e479d7d202b12c0ddf53e00975858162156db8a..92166c33395db093123cd52a0ae13add8100d148 100644 (file)
@@ -685,7 +685,7 @@ static bool proc_fd_access_allowed(struct inode *inode)
        return allowed;
 }
 
-int proc_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int proc_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 struct iattr *attr)
 {
        int error;
@@ -694,11 +694,11 @@ int proc_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if (attr->ia_valid & ATTR_MODE)
                return -EPERM;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 587b91d9d998fd3495e09f272df888295309244b..4464ad6a22833049bdc431a8f14db3a736f3a9d0 100644 (file)
@@ -115,18 +115,18 @@ static bool pde_subdir_insert(struct proc_dir_entry *dir,
        return true;
 }
 
-static int proc_notify_change(struct user_namespace *mnt_userns,
+static int proc_notify_change(struct mnt_idmap *idmap,
                              struct dentry *dentry, struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
        struct proc_dir_entry *de = PDE(inode);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, iattr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (error)
                return error;
 
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        mark_inode_dirty(inode);
 
        proc_set_user(de, inode->i_uid, inode->i_gid);
index b701d0207edf098814a70400850e3675aee448f1..6eb921670fc675773180d304f7107eac2a3f0064 100644 (file)
@@ -164,7 +164,7 @@ extern int proc_pid_statm(struct seq_file *, struct pid_namespace *,
 extern const struct dentry_operations pid_dentry_operations;
 extern int pid_getattr(struct user_namespace *, const struct path *,
                       struct kstat *, u32, unsigned int);
-extern int proc_setattr(struct user_namespace *, struct dentry *,
+extern int proc_setattr(struct mnt_idmap *, struct dentry *,
                        struct iattr *);
 extern void proc_pid_evict_inode(struct proc_inode *);
 extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *, umode_t);
index 48f2d60bd78a2f998ae83975588ca292f14c5428..daba911972eca14e3f12da1c43cfd323b6845549 100644 (file)
@@ -827,7 +827,7 @@ static int proc_sys_permission(struct user_namespace *mnt_userns,
        return error;
 }
 
-static int proc_sys_setattr(struct user_namespace *mnt_userns,
+static int proc_sys_setattr(struct mnt_idmap *idmap,
                            struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -836,11 +836,11 @@ static int proc_sys_setattr(struct user_namespace *mnt_userns,
        if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
                return -EPERM;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index cb240eac50365b61098151d2df8579a8287c8e74..5bf74c2f6042fdb463e40c087745a4e2243ec9c6 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/uaccess.h>
 #include "internal.h"
 
-static int ramfs_nommu_setattr(struct user_namespace *, struct dentry *, struct iattr *);
+static int ramfs_nommu_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
 static unsigned long ramfs_nommu_get_unmapped_area(struct file *file,
                                                   unsigned long addr,
                                                   unsigned long len,
@@ -158,7 +158,7 @@ static int ramfs_nommu_resize(struct inode *inode, loff_t newsize, loff_t size)
  * handle a change of attributes
  * - we're specifically interested in a change of size
  */
-static int ramfs_nommu_setattr(struct user_namespace *mnt_userns,
+static int ramfs_nommu_setattr(struct mnt_idmap *idmap,
                               struct dentry *dentry, struct iattr *ia)
 {
        struct inode *inode = d_inode(dentry);
@@ -166,7 +166,7 @@ static int ramfs_nommu_setattr(struct user_namespace *mnt_userns,
        int ret = 0;
 
        /* POSIX UID/GID verification for setting inode attributes */
-       ret = setattr_prepare(&init_user_ns, dentry, ia);
+       ret = setattr_prepare(&nop_mnt_idmap, dentry, ia);
        if (ret)
                return ret;
 
@@ -186,7 +186,7 @@ static int ramfs_nommu_setattr(struct user_namespace *mnt_userns,
                }
        }
 
-       setattr_copy(&init_user_ns, inode, ia);
+       setattr_copy(&nop_mnt_idmap, inode, ia);
  out:
        ia->ia_valid = old_ia_valid;
        return ret;
index c7d1fa526dea7becb39f747fb8ff08e7e06832e1..35b9b8ec1cbe2da8204197af43fe7752bffafa38 100644 (file)
@@ -3262,21 +3262,21 @@ static ssize_t reiserfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
        return ret;
 }
 
-int reiserfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int reiserfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                     struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        unsigned int ia_valid;
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
        /* must be turned off for recursive notify_change calls */
        ia_valid = attr->ia_valid &= ~(ATTR_KILL_SUID|ATTR_KILL_SGID);
 
-       if (is_quota_modification(mnt_userns, inode, attr)) {
+       if (is_quota_modification(&init_user_ns, inode, attr)) {
                error = dquot_initialize(inode);
                if (error)
                        return error;
@@ -3359,7 +3359,7 @@ int reiserfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                reiserfs_write_unlock(inode->i_sb);
                if (error)
                        goto out;
-               error = dquot_transfer(mnt_userns, inode, attr);
+               error = dquot_transfer(&init_user_ns, inode, attr);
                reiserfs_write_lock(inode->i_sb);
                if (error) {
                        journal_end(&th);
@@ -3398,7 +3398,7 @@ int reiserfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        }
 
        if (!error) {
-               setattr_copy(&init_user_ns, inode, attr);
+               setattr_copy(&nop_mnt_idmap, inode, attr);
                mark_inode_dirty(inode);
        }
 
index 3aa928ec527a88d402e6ec122e24ab968c717e12..9a4a7f7897fefbcb1dd10e27cf5f63db25e6025b 100644 (file)
@@ -3100,7 +3100,7 @@ static inline void reiserfs_update_sd(struct reiserfs_transaction_handle *th,
 }
 
 void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode);
-int reiserfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int reiserfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                     struct iattr *attr);
 
 int __reiserfs_write_begin(struct page *page, unsigned from, unsigned len);
index 8b2d52443f415ca49160c7032856ed2cc7ae2023..af6137f53cf839269066a1e11f1325137ff145a1 100644 (file)
@@ -352,7 +352,7 @@ static int chown_one_xattr(struct dentry *dentry, void *data)
         * ATTR_MODE is set.
         */
        attrs->ia_valid &= (ATTR_UID|ATTR_GID);
-       err = reiserfs_setattr(&init_user_ns, dentry, attrs);
+       err = reiserfs_setattr(&nop_mnt_idmap, dentry, attrs);
        attrs->ia_valid = ia_valid;
 
        return err;
@@ -597,7 +597,7 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
                inode_lock_nested(d_inode(dentry), I_MUTEX_XATTR);
                inode_dio_wait(d_inode(dentry));
 
-               err = reiserfs_setattr(&init_user_ns, dentry, &newattrs);
+               err = reiserfs_setattr(&nop_mnt_idmap, dentry, &newattrs);
                inode_unlock(d_inode(dentry));
        } else
                update_ctime(inode);
index 90e00124ea075d8091b974cc4cbe450954d40d6c..50eb92557a0feaf12564a71dd52213a9be9d8982 100644 (file)
@@ -29,13 +29,13 @@ const struct file_operations sysv_file_operations = {
        .splice_read    = generic_file_splice_read,
 };
 
-static int sysv_setattr(struct user_namespace *mnt_userns,
+static int sysv_setattr(struct mnt_idmap *idmap,
                        struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -48,7 +48,7 @@ static int sysv_setattr(struct user_namespace *mnt_userns,
                sysv_truncate(inode);
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index f2353dd676ef0882301fd53a95483a87c0af43c2..e666337df02c3c6cf98f30fbfc6b486f5b34c6aa 100644 (file)
@@ -1258,7 +1258,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode,
        return err;
 }
 
-int ubifs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ubifs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr)
 {
        int err;
@@ -1267,7 +1267,7 @@ int ubifs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
 
        dbg_gen("ino %lu, mode %#x, ia_valid %#x",
                inode->i_ino, inode->i_mode, attr->ia_valid);
-       err = setattr_prepare(&init_user_ns, dentry, attr);
+       err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (err)
                return err;
 
index 478bbbb5382f88048bb5d5a10077a68ac7135cc6..9b66e762950b43cb23b483cdd3392fb2a850f900 100644 (file)
@@ -2020,7 +2020,7 @@ int ubifs_calc_dark(const struct ubifs_info *c, int spc);
 
 /* file.c */
 int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync);
-int ubifs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ubifs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                  struct iattr *attr);
 int ubifs_update_time(struct inode *inode, struct timespec64 *time, int flags);
 
index 5c659e23e578fa33290ad6d72aa7b7fb5ece1fad..2efbbbaa2da7516e224c54e8bb3ae95bafd90d20 100644 (file)
@@ -256,14 +256,14 @@ const struct file_operations udf_file_operations = {
        .llseek                 = generic_file_llseek,
 };
 
-static int udf_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+static int udf_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                       struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        struct super_block *sb = inode->i_sb;
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -286,7 +286,7 @@ static int udf_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
        if (attr->ia_valid & ATTR_MODE)
                udf_update_extra_perms(inode, attr->ia_mode);
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index a873de7dec1c4263c8a83008ce06a2154cb66b0f..a4246c83a8cda83f2026e0bda020923c1d15a882 100644 (file)
@@ -1212,14 +1212,14 @@ out:
        return err;
 }
 
-int ufs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int ufs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        unsigned int ia_valid = attr->ia_valid;
        int error;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -1229,7 +1229,7 @@ int ufs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                        return error;
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        mark_inode_dirty(inode);
        return 0;
 }
index 550f7c5a36369cbbba6d44234fb2a8305f474c3a..6b499180643bb947512a11f1196d27218f29ae4a 100644 (file)
@@ -123,7 +123,7 @@ extern struct inode *ufs_iget(struct super_block *, unsigned long);
 extern int ufs_write_inode (struct inode *, struct writeback_control *);
 extern int ufs_sync_inode (struct inode *);
 extern void ufs_evict_inode (struct inode *);
-extern int ufs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+extern int ufs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                       struct iattr *attr);
 
 /* namei.c */
index e1db0f3f7e5e4ce9b79fa2ba86cf3a08824d7ce1..046b5a3bf314b3b24617bc6280d2caebb1217dae 100644 (file)
@@ -256,7 +256,7 @@ int vboxsf_getattr(struct user_namespace *mnt_userns, const struct path *path,
        return 0;
 }
 
-int vboxsf_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int vboxsf_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                   struct iattr *iattr)
 {
        struct vboxsf_inode *sf_i = VBOXSF_I(d_inode(dentry));
index 9047befa66c5a8d3c8c125d5f5f66ed957c3122e..7de5a0a4e285f237c402f5687fa4da4b530b2f2d 100644 (file)
@@ -100,7 +100,7 @@ int vboxsf_inode_revalidate(struct dentry *dentry);
 int vboxsf_getattr(struct user_namespace *mnt_userns, const struct path *path,
                   struct kstat *kstat, u32 request_mask,
                   unsigned int query_flags);
-int vboxsf_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int vboxsf_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                   struct iattr *iattr);
 struct shfl_string *vboxsf_path_from_dentry(struct vboxsf_sbi *sbi,
                                            struct dentry *dentry);
index 595a5bcf46b9496a6d1aee087282f103015c861c..d06c0cc62f612103b1a882c261dadb5d8f5aaed5 100644 (file)
@@ -1047,7 +1047,7 @@ xfs_file_fallocate(
 
                iattr.ia_valid = ATTR_SIZE;
                iattr.ia_size = new_size;
-               error = xfs_vn_setattr_size(file_mnt_user_ns(file),
+               error = xfs_vn_setattr_size(file_mnt_idmap(file),
                                            file_dentry(file), &iattr);
                if (error)
                        goto out_unlock;
index 515318dfbc382d42863e2faa07dcb84491fafe29..ba764205bd3ae981b29a4e08839a067512b88949 100644 (file)
@@ -627,7 +627,7 @@ xfs_vn_getattr(
 
 static int
 xfs_vn_change_ok(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct dentry           *dentry,
        struct iattr            *iattr)
 {
@@ -639,7 +639,7 @@ xfs_vn_change_ok(
        if (xfs_is_shutdown(mp))
                return -EIO;
 
-       return setattr_prepare(mnt_userns, dentry, iattr);
+       return setattr_prepare(idmap, dentry, iattr);
 }
 
 /*
@@ -650,7 +650,7 @@ xfs_vn_change_ok(
  */
 static int
 xfs_setattr_nonsize(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct dentry           *dentry,
        struct xfs_inode        *ip,
        struct iattr            *iattr)
@@ -664,6 +664,7 @@ xfs_setattr_nonsize(
        kgid_t                  gid = GLOBAL_ROOT_GID;
        struct xfs_dquot        *udqp = NULL, *gdqp = NULL;
        struct xfs_dquot        *old_udqp = NULL, *old_gdqp = NULL;
+       struct user_namespace   *mnt_userns = mnt_idmap_owner(idmap);
 
        ASSERT((mask & ATTR_SIZE) == 0);
 
@@ -730,7 +731,7 @@ xfs_setattr_nonsize(
                old_gdqp = xfs_qm_vop_chown(tp, ip, &ip->i_gdquot, gdqp);
        }
 
-       setattr_copy(mnt_userns, inode, iattr);
+       setattr_copy(idmap, inode, iattr);
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 
        XFS_STATS_INC(mp, xs_ig_attrchg);
@@ -779,7 +780,7 @@ out_dqrele:
  */
 STATIC int
 xfs_setattr_size(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct dentry           *dentry,
        struct xfs_inode        *ip,
        struct iattr            *iattr)
@@ -812,7 +813,7 @@ xfs_setattr_size(
                 * Use the regular setattr path to update the timestamps.
                 */
                iattr->ia_valid &= ~ATTR_SIZE;
-               return xfs_setattr_nonsize(mnt_userns, dentry, ip, iattr);
+               return xfs_setattr_nonsize(idmap, dentry, ip, iattr);
        }
 
        /*
@@ -956,7 +957,7 @@ xfs_setattr_size(
        }
 
        ASSERT(!(iattr->ia_valid & (ATTR_UID | ATTR_GID)));
-       setattr_copy(mnt_userns, inode, iattr);
+       setattr_copy(idmap, inode, iattr);
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 
        XFS_STATS_INC(mp, xs_ig_attrchg);
@@ -977,7 +978,7 @@ out_trans_cancel:
 
 int
 xfs_vn_setattr_size(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct dentry           *dentry,
        struct iattr            *iattr)
 {
@@ -986,15 +987,15 @@ xfs_vn_setattr_size(
 
        trace_xfs_setattr(ip);
 
-       error = xfs_vn_change_ok(mnt_userns, dentry, iattr);
+       error = xfs_vn_change_ok(idmap, dentry, iattr);
        if (error)
                return error;
-       return xfs_setattr_size(mnt_userns, dentry, ip, iattr);
+       return xfs_setattr_size(idmap, dentry, ip, iattr);
 }
 
 STATIC int
 xfs_vn_setattr(
-       struct user_namespace   *mnt_userns,
+       struct mnt_idmap        *idmap,
        struct dentry           *dentry,
        struct iattr            *iattr)
 {
@@ -1014,14 +1015,14 @@ xfs_vn_setattr(
                        return error;
                }
 
-               error = xfs_vn_setattr_size(mnt_userns, dentry, iattr);
+               error = xfs_vn_setattr_size(idmap, dentry, iattr);
                xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
        } else {
                trace_xfs_setattr(ip);
 
-               error = xfs_vn_change_ok(mnt_userns, dentry, iattr);
+               error = xfs_vn_change_ok(idmap, dentry, iattr);
                if (!error)
-                       error = xfs_setattr_nonsize(mnt_userns, dentry, ip, iattr);
+                       error = xfs_setattr_nonsize(idmap, dentry, ip, iattr);
        }
 
        return error;
index e570dcb5df8d52efcc42607173cba782e8a36d4b..7f84a0843b2437a6559c39c2959b1ad3498cf03e 100644 (file)
@@ -13,7 +13,7 @@ extern const struct file_operations xfs_dir_file_operations;
 
 extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size);
 
-int xfs_vn_setattr_size(struct user_namespace *mnt_userns,
+int xfs_vn_setattr_size(struct mnt_idmap *idmap,
                struct dentry *dentry, struct iattr *vap);
 
 int xfs_inode_init_security(struct inode *inode, struct inode *dir,
index 38d23f0e703a8eaeb259e42a0814604003dd586d..23d16186e1a34addd3f96129ec0842a1a0375e93 100644 (file)
@@ -322,7 +322,7 @@ xfs_fs_commit_blocks(
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 
        ASSERT(!(iattr->ia_valid & (ATTR_UID | ATTR_GID)));
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
        if (update_isize) {
                i_size_write(inode, iattr->ia_size);
                ip->i_disk_size = iattr->ia_size;
index 2c53fbb8d918e5ca63ab3a620455b1f173883251..df3c139c7d0e376a0bc6d0c37e7adb772b7e72a3 100644 (file)
@@ -600,7 +600,7 @@ unlock:
        return ret;
 }
 
-static int zonefs_inode_setattr(struct user_namespace *mnt_userns,
+static int zonefs_inode_setattr(struct mnt_idmap *idmap,
                                struct dentry *dentry, struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
@@ -609,7 +609,7 @@ static int zonefs_inode_setattr(struct user_namespace *mnt_userns,
        if (unlikely(IS_IMMUTABLE(inode)))
                return -EPERM;
 
-       ret = setattr_prepare(&init_user_ns, dentry, iattr);
+       ret = setattr_prepare(&nop_mnt_idmap, dentry, iattr);
        if (ret)
                return ret;
 
@@ -626,7 +626,7 @@ static int zonefs_inode_setattr(struct user_namespace *mnt_userns,
             !uid_eq(iattr->ia_uid, inode->i_uid)) ||
            ((iattr->ia_valid & ATTR_GID) &&
             !gid_eq(iattr->ia_gid, inode->i_gid))) {
-               ret = dquot_transfer(mnt_userns, inode, iattr);
+               ret = dquot_transfer(&init_user_ns, inode, iattr);
                if (ret)
                        return ret;
        }
@@ -637,7 +637,7 @@ static int zonefs_inode_setattr(struct user_namespace *mnt_userns,
                        return ret;
        }
 
-       setattr_copy(&init_user_ns, inode, iattr);
+       setattr_copy(&nop_mnt_idmap, inode, iattr);
 
        return 0;
 }
index 7a9ee2157f69396e032ad65c67179ce52695051a..1f8f806dd0d1c13693e27b1757758f0b51aeb028 100644 (file)
@@ -21,7 +21,7 @@ extern enum integrity_status evm_verifyxattr(struct dentry *dentry,
                                             void *xattr_value,
                                             size_t xattr_value_len,
                                             struct integrity_iint_cache *iint);
-extern int evm_inode_setattr(struct user_namespace *mnt_userns,
+extern int evm_inode_setattr(struct mnt_idmap *idmap,
                             struct dentry *dentry, struct iattr *attr);
 extern void evm_inode_post_setattr(struct dentry *dentry, int ia_valid);
 extern int evm_inode_setxattr(struct user_namespace *mnt_userns,
@@ -90,7 +90,7 @@ static inline enum integrity_status evm_verifyxattr(struct dentry *dentry,
 }
 #endif
 
-static inline int evm_inode_setattr(struct user_namespace *mnt_userns,
+static inline int evm_inode_setattr(struct mnt_idmap *idmap,
                                    struct dentry *dentry, struct iattr *attr)
 {
        return 0;
index 7aa302d2ce39b0b79e700be3c3e71edfcb7b5fa9..24e378e2835f6b9f588849be9a5fc488f51575fe 100644 (file)
@@ -2152,8 +2152,7 @@ struct inode_operations {
                      umode_t,dev_t);
        int (*rename) (struct user_namespace *, struct inode *, struct dentry *,
                        struct inode *, struct dentry *, unsigned int);
-       int (*setattr) (struct user_namespace *, struct dentry *,
-                       struct iattr *);
+       int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *);
        int (*getattr) (struct user_namespace *, const struct path *,
                        struct kstat *, u32, unsigned int);
        ssize_t (*listxattr) (struct dentry *, char *, size_t);
@@ -3313,7 +3312,7 @@ extern int dcache_dir_open(struct inode *, struct file *);
 extern int dcache_dir_close(struct inode *, struct file *);
 extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
 extern int dcache_readdir(struct file *, struct dir_context *);
-extern int simple_setattr(struct user_namespace *, struct dentry *,
+extern int simple_setattr(struct mnt_idmap *, struct dentry *,
                          struct iattr *);
 extern int simple_getattr(struct user_namespace *, const struct path *,
                          struct kstat *, u32, unsigned int);
@@ -3368,9 +3367,9 @@ extern void generic_set_encrypted_ci_d_ops(struct dentry *dentry);
 
 int may_setattr(struct user_namespace *mnt_userns, struct inode *inode,
                unsigned int ia_valid);
-int setattr_prepare(struct user_namespace *, struct dentry *, struct iattr *);
+int setattr_prepare(struct mnt_idmap *, struct dentry *, struct iattr *);
 extern int inode_newsize_ok(const struct inode *, loff_t offset);
-void setattr_copy(struct user_namespace *, struct inode *inode,
+void setattr_copy(struct mnt_idmap *, struct inode *inode,
                  const struct iattr *attr);
 
 extern int file_update_time(struct file *file);
index d92fdfd2444c88e3c9d6b2d8893c8fc0d29237f3..7c9628dc61a38a5aae36beb6be55551ab5dee180 100644 (file)
@@ -405,7 +405,7 @@ extern int nfs_clear_invalid_mapping(struct address_space *mapping);
 extern bool nfs_mapping_need_revalidate_inode(struct inode *inode);
 extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
 extern int nfs_revalidate_mapping_rcu(struct inode *inode);
-extern int nfs_setattr(struct user_namespace *, struct dentry *, struct iattr *);
+extern int nfs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
 extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr, struct nfs_fattr *);
 extern void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr);
 extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
index 5b67f208f7de2698683567cb9904f24c45f1f64b..1ba1f4e70b5083b76318a93cbc51bb3ed821b379 100644 (file)
@@ -356,7 +356,7 @@ int security_inode_readlink(struct dentry *dentry);
 int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
                               bool rcu);
 int security_inode_permission(struct inode *inode, int mask);
-int security_inode_setattr(struct user_namespace *mnt_userns,
+int security_inode_setattr(struct mnt_idmap *idmap,
                           struct dentry *dentry, struct iattr *attr);
 int security_inode_getattr(const struct path *path);
 int security_inode_setxattr(struct user_namespace *mnt_userns,
@@ -862,7 +862,7 @@ static inline int security_inode_permission(struct inode *inode, int mask)
        return 0;
 }
 
-static inline int security_inode_setattr(struct user_namespace *mnt_userns,
+static inline int security_inode_setattr(struct mnt_idmap *idmap,
                                         struct dentry *dentry,
                                         struct iattr *attr)
 {
index 04c3ac9448a1883d490729a60f493c9b2caa2ac5..afcf46e99cda5ae1b58fa2b07af58542fa2b79b2 100644 (file)
@@ -162,7 +162,7 @@ const struct address_space_operations secretmem_aops = {
        .migrate_folio  = secretmem_migrate_folio,
 };
 
-static int secretmem_setattr(struct user_namespace *mnt_userns,
+static int secretmem_setattr(struct mnt_idmap *idmap,
                             struct dentry *dentry, struct iattr *iattr)
 {
        struct inode *inode = d_inode(dentry);
@@ -175,7 +175,7 @@ static int secretmem_setattr(struct user_namespace *mnt_userns,
        if ((ia_valid & ATTR_SIZE) && inode->i_size)
                ret = -EINVAL;
        else
-               ret = simple_setattr(mnt_userns, dentry, iattr);
+               ret = simple_setattr(idmap, dentry, iattr);
 
        filemap_invalidate_unlock(mapping);
 
index c301487be5fb405d2f2d12a9c497e951dbecdbe3..6976df4e78b69cc6a730a30eba699acbca84edcf 100644 (file)
@@ -1082,7 +1082,7 @@ static int shmem_getattr(struct user_namespace *mnt_userns,
        return 0;
 }
 
-static int shmem_setattr(struct user_namespace *mnt_userns,
+static int shmem_setattr(struct mnt_idmap *idmap,
                         struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
@@ -1091,7 +1091,7 @@ static int shmem_setattr(struct user_namespace *mnt_userns,
        bool update_mtime = false;
        bool update_ctime = true;
 
-       error = setattr_prepare(&init_user_ns, dentry, attr);
+       error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
        if (error)
                return error;
 
@@ -1129,7 +1129,7 @@ static int shmem_setattr(struct user_namespace *mnt_userns,
                }
        }
 
-       setattr_copy(&init_user_ns, inode, attr);
+       setattr_copy(&nop_mnt_idmap, inode, attr);
        if (attr->ia_valid & ATTR_MODE)
                error = posix_acl_chmod(&init_user_ns, dentry, inode->i_mode);
        if (!error && update_ctime) {
index 888cd618a968fe071ee76ed95cc66eb236cc87cb..6234b07a056ff3341fa088b2d232da6ed4446fe6 100644 (file)
@@ -589,10 +589,10 @@ static ssize_t sockfs_listxattr(struct dentry *dentry, char *buffer,
        return used;
 }
 
-static int sockfs_setattr(struct user_namespace *mnt_userns,
+static int sockfs_setattr(struct mnt_idmap *idmap,
                          struct dentry *dentry, struct iattr *iattr)
 {
-       int err = simple_setattr(&init_user_ns, dentry, iattr);
+       int err = simple_setattr(&nop_mnt_idmap, dentry, iattr);
 
        if (!err && (iattr->ia_valid & ATTR_UID)) {
                struct socket *sock = SOCKET_I(d_inode(dentry));
index f02e609460e2f095248dc99afc02d9bf00441dc3..e5a6a3bb120970a4208522ad091cc0b28bb3b87a 100644 (file)
@@ -779,10 +779,11 @@ void evm_inode_post_removexattr(struct dentry *dentry, const char *xattr_name)
        evm_update_evmxattr(dentry, xattr_name, NULL, 0);
 }
 
-static int evm_attr_change(struct user_namespace *mnt_userns,
+static int evm_attr_change(struct mnt_idmap *idmap,
                           struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_backing_inode(dentry);
+       struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
        unsigned int ia_valid = attr->ia_valid;
 
        if (!i_uid_needs_update(mnt_userns, attr, inode) &&
@@ -800,7 +801,7 @@ static int evm_attr_change(struct user_namespace *mnt_userns,
  * Permit update of file attributes when files have a valid EVM signature,
  * except in the case of them having an immutable portable signature.
  */
-int evm_inode_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
+int evm_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                      struct iattr *attr)
 {
        unsigned int ia_valid = attr->ia_valid;
@@ -827,7 +828,7 @@ int evm_inode_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                return 0;
 
        if (evm_status == INTEGRITY_PASS_IMMUTABLE &&
-           !evm_attr_change(mnt_userns, dentry, attr))
+           !evm_attr_change(idmap, dentry, attr))
                return 0;
 
        integrity_audit_msg(AUDIT_INTEGRITY_METADATA, d_backing_inode(dentry),
index 8a9db7dfca7efe44cabd0934326f6ce90cea4fb0..9b907c2fee60b638b9033f8315a639d409953f6e 100644 (file)
@@ -228,7 +228,7 @@ static ssize_t evm_write_xattrs(struct file *file, const char __user *buf,
                newattrs.ia_valid = ATTR_MODE;
                inode = evm_xattrs->d_inode;
                inode_lock(inode);
-               err = simple_setattr(&init_user_ns, evm_xattrs, &newattrs);
+               err = simple_setattr(&nop_mnt_idmap, evm_xattrs, &newattrs);
                inode_unlock(inode);
                if (!err)
                        err = count;
index d1571900a8c7dfe7969b79cb05980921944d228e..fceab8e0ff871f56f903f6631969b5ce8735b4be 100644 (file)
@@ -1354,7 +1354,7 @@ int security_inode_permission(struct inode *inode, int mask)
        return call_int_hook(inode_permission, 0, inode, mask);
 }
 
-int security_inode_setattr(struct user_namespace *mnt_userns,
+int security_inode_setattr(struct mnt_idmap *idmap,
                           struct dentry *dentry, struct iattr *attr)
 {
        int ret;
@@ -1364,7 +1364,7 @@ int security_inode_setattr(struct user_namespace *mnt_userns,
        ret = call_int_hook(inode_setattr, 0, dentry, attr);
        if (ret)
                return ret;
-       return evm_inode_setattr(mnt_userns, dentry, attr);
+       return evm_inode_setattr(idmap, dentry, attr);
 }
 EXPORT_SYMBOL_GPL(security_inode_setattr);