]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: use consistent uid/gid when grabbing dquots for inodes
authorDarrick J. Wong <djwong@kernel.org>
Wed, 11 Jun 2025 21:01:15 +0000 (14:01 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:07:19 +0000 (11:07 +0100)
[ Upstream commit  24a4e1cb322e2bf0f3a1afd1978b610a23aa8f36 ]

[ 6.1: resolved conflicts in xfs_inode.c and xfs_symlink.c due to 6.1
not having switched to idmap yet ]

I noticed that callers of xfs_qm_vop_dqalloc use the following code to
compute the anticipated uid of the new file:

mapped_fsuid(idmap, &init_user_ns);

whereas the VFS uses a slightly different computation for actually
assigning i_uid:

mapped_fsuid(idmap, i_user_ns(inode));

Technically, these are not the same things.  According to Christian
Brauner, the only time that inode->i_sb->s_user_ns != &init_user_ns is
when the filesystem was mounted in a new mount namespace by an
unpriviledged user.  XFS does not allow this, which is why we've never
seen bug reports about quotas being incorrect or the uid checks in
xfs_qm_vop_create_dqattach tripping debug assertions.

However, this /is/ a logic bomb, so let's make the code consistent.

Link: https://lore.kernel.org/linux-fsdevel/20240617-weitblick-gefertigt-4a41f37119fa@brauner/
Fixes: c14329d39f2d ("fs: port fs{g,u}id helpers to mnt_idmap")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Catherine Hoang <catherine.hoang@oracle.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Leah Rumancik <leah.rumancik@gmail.com>
Acked-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/xfs/xfs_inode.c
fs/xfs/xfs_symlink.c

index b26d26d29273dc281d22bdf0a79975f75f94cb74..88d0a088fa862067653f8e862a48882c9e6d6e16 100644 (file)
@@ -983,10 +983,12 @@ xfs_create(
        prid = xfs_get_initial_prid(dp);
 
        /*
-        * Make sure that we have allocated dquot(s) on disk.
+        * Make sure that we have allocated dquot(s) on disk.  The uid/gid
+        * computation code must match what the VFS uses to assign i_[ug]id.
+        * INHERIT adjusts the gid computation for setgid/grpid systems.
         */
-       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, &init_user_ns),
-                       mapped_fsgid(mnt_userns, &init_user_ns), prid,
+       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, i_user_ns(VFS_I(dp))),
+                       mapped_fsgid(mnt_userns, i_user_ns(VFS_I(dp))), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
                        &udqp, &gdqp, &pdqp);
        if (error)
@@ -1132,10 +1134,12 @@ xfs_create_tmpfile(
        prid = xfs_get_initial_prid(dp);
 
        /*
-        * Make sure that we have allocated dquot(s) on disk.
+        * Make sure that we have allocated dquot(s) on disk.  The uid/gid
+        * computation code must match what the VFS uses to assign i_[ug]id.
+        * INHERIT adjusts the gid computation for setgid/grpid systems.
         */
-       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, &init_user_ns),
-                       mapped_fsgid(mnt_userns, &init_user_ns), prid,
+       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, i_user_ns(VFS_I(dp))),
+                       mapped_fsgid(mnt_userns, i_user_ns(VFS_I(dp))), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
                        &udqp, &gdqp, &pdqp);
        if (error)
index 8389f3ef88ef2c2055685d1dea06b41f3d184421..78bd02a98aa53b50047238739809a2040d9ea0da 100644 (file)
@@ -191,10 +191,12 @@ xfs_symlink(
        prid = xfs_get_initial_prid(dp);
 
        /*
-        * Make sure that we have allocated dquot(s) on disk.
+        * Make sure that we have allocated dquot(s) on disk.  The uid/gid
+        * computation code must match what the VFS uses to assign i_[ug]id.
+        * INHERIT adjusts the gid computation for setgid/grpid systems.
         */
-       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, &init_user_ns),
-                       mapped_fsgid(mnt_userns, &init_user_ns), prid,
+       error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns, i_user_ns(VFS_I(dp))),
+                       mapped_fsgid(mnt_userns, i_user_ns(VFS_I(dp))), prid,
                        XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
                        &udqp, &gdqp, &pdqp);
        if (error)