]> Git Repo - linux.git/commitdiff
fs: port higher-level mapping helpers
authorChristian Brauner <[email protected]>
Fri, 3 Dec 2021 11:17:05 +0000 (12:17 +0100)
committerChristian Brauner <[email protected]>
Sun, 5 Dec 2021 09:28:57 +0000 (10:28 +0100)
Enable the mapped_fs{g,u}id() helpers to support filesystems mounted
with an idmapping. Apart from core mapping helpers that use
mapped_fs{g,u}id() to initialize struct inode's i_{g,u}id fields xfs is
the only place that uses these low-level helpers directly.

The patch only extends the helpers to be able to take the filesystem
idmapping into account. Since we don't actually yet pass the
filesystem's idmapping in no functional changes happen. This will happen
in a final patch.

Link: https://lore.kernel.org/r/[email protected]
Link: https://lore.kernel.org/r/[email protected]
Link: https://lore.kernel.org/r/[email protected]
Cc: Seth Forshee <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Al Viro <[email protected]>
CC: [email protected]
Reviewed-by: Amir Goldstein <[email protected]>
Reviewed-by: Seth Forshee <[email protected]>
Signed-off-by: Christian Brauner <[email protected]>
fs/xfs/xfs_inode.c
fs/xfs/xfs_symlink.c
include/linux/fs.h
include/linux/mnt_idmapping.h

index 64b9bf33480659fcbaa0a5c8c5ad259c9a44cd55..5ca689459bed4fce92002b3d289692207da8a3fc 100644 (file)
@@ -988,8 +988,8 @@ xfs_create(
        /*
         * Make sure that we have allocated dquot(s) on disk.
         */
-       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns),
-                       mapped_fsgid(mnt_userns), prid,
+       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, &init_user_ns),
+                       mapped_fsgid(mnt_userns, &init_user_ns), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
                        &udqp, &gdqp, &pdqp);
        if (error)
@@ -1142,8 +1142,8 @@ xfs_create_tmpfile(
        /*
         * Make sure that we have allocated dquot(s) on disk.
         */
-       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns),
-                       mapped_fsgid(mnt_userns), prid,
+       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, &init_user_ns),
+                       mapped_fsgid(mnt_userns, &init_user_ns), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
                        &udqp, &gdqp, &pdqp);
        if (error)
index fc2c6a404647122c755361e65a41cf738e585d5a..a31d2e5d03214dd4b7d5cc31a6f036e415465645 100644 (file)
@@ -184,8 +184,8 @@ xfs_symlink(
        /*
         * Make sure that we have allocated dquot(s) on disk.
         */
-       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns),
-                       mapped_fsgid(mnt_userns), prid,
+       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, &init_user_ns),
+                       mapped_fsgid(mnt_userns, &init_user_ns), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
                        &udqp, &gdqp, &pdqp);
        if (error)
index 57aee6ebba7292cb6abc23c7458b5709297d7459..e1f28f757f1bfa601482b62c67f4a0d470175d36 100644 (file)
@@ -1664,7 +1664,7 @@ static inline kgid_t i_gid_into_mnt(struct user_namespace *mnt_userns,
 static inline void inode_fsuid_set(struct inode *inode,
                                   struct user_namespace *mnt_userns)
 {
-       inode->i_uid = mapped_fsuid(mnt_userns);
+       inode->i_uid = mapped_fsuid(mnt_userns, &init_user_ns);
 }
 
 /**
@@ -1678,7 +1678,7 @@ static inline void inode_fsuid_set(struct inode *inode,
 static inline void inode_fsgid_set(struct inode *inode,
                                   struct user_namespace *mnt_userns)
 {
-       inode->i_gid = mapped_fsgid(mnt_userns);
+       inode->i_gid = mapped_fsgid(mnt_userns, &init_user_ns);
 }
 
 /**
@@ -1699,10 +1699,10 @@ static inline bool fsuidgid_has_mapping(struct super_block *sb,
        kuid_t kuid;
        kgid_t kgid;
 
-       kuid = mapped_fsuid(mnt_userns);
+       kuid = mapped_fsuid(mnt_userns, &init_user_ns);
        if (!uid_valid(kuid))
                return false;
-       kgid = mapped_fsgid(mnt_userns);
+       kgid = mapped_fsgid(mnt_userns, &init_user_ns);
        if (!gid_valid(kgid))
                return false;
        return kuid_has_mapping(fs_userns, kuid) &&
index 0c6ab3f4c9527524784d406df9dc598cbd4e6131..ee5a217de2a8808cecd0f0f605d38aab88f39fdf 100644 (file)
@@ -196,6 +196,7 @@ static inline kgid_t mapped_kgid_user(struct user_namespace *mnt_userns,
 /**
  * mapped_fsuid - return caller's fsuid mapped up into a mnt_userns
  * @mnt_userns: the mount's idmapping
+ * @fs_userns: the filesystem's idmapping
  *
  * Use this helper to initialize a new vfs or filesystem object based on
  * the caller's fsuid. A common example is initializing the i_uid field of
@@ -205,14 +206,16 @@ static inline kgid_t mapped_kgid_user(struct user_namespace *mnt_userns,
  *
  * Return: the caller's current fsuid mapped up according to @mnt_userns.
  */
-static inline kuid_t mapped_fsuid(struct user_namespace *mnt_userns)
+static inline kuid_t mapped_fsuid(struct user_namespace *mnt_userns,
+                                 struct user_namespace *fs_userns)
 {
-       return mapped_kuid_user(mnt_userns, &init_user_ns, current_fsuid());
+       return mapped_kuid_user(mnt_userns, fs_userns, current_fsuid());
 }
 
 /**
  * mapped_fsgid - return caller's fsgid mapped up into a mnt_userns
  * @mnt_userns: the mount's idmapping
+ * @fs_userns: the filesystem's idmapping
  *
  * Use this helper to initialize a new vfs or filesystem object based on
  * the caller's fsgid. A common example is initializing the i_gid field of
@@ -222,9 +225,10 @@ static inline kuid_t mapped_fsuid(struct user_namespace *mnt_userns)
  *
  * Return: the caller's current fsgid mapped up according to @mnt_userns.
  */
-static inline kgid_t mapped_fsgid(struct user_namespace *mnt_userns)
+static inline kgid_t mapped_fsgid(struct user_namespace *mnt_userns,
+                                 struct user_namespace *fs_userns)
 {
-       return mapped_kgid_user(mnt_userns, &init_user_ns, current_fsgid());
+       return mapped_kgid_user(mnt_userns, fs_userns, current_fsgid());
 }
 
 #endif /* _LINUX_MNT_IDMAPPING_H */
This page took 0.109554 seconds and 4 git commands to generate.