]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: wrap inode creation dqalloc calls
authorDarrick J. Wong <djwong@kernel.org>
Tue, 2 Jul 2024 18:22:39 +0000 (11:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 2 Jul 2024 18:36:57 +0000 (11:36 -0700)
Create a helper that calls dqalloc to allocate and grab a reference to
dquots for the user, group, and project ids listed in an icreate
structure.  This simplifies the creat-related dqalloc callsites
scattered around the code base.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/tempfile.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_symlink.c

index ee6f93e9f7cba78ceb812d86894a48e545fea21b..523971a15a72ac1a15cded5e062552ec158a7cb6 100644 (file)
@@ -47,9 +47,9 @@ xrep_tempfile_create(
        };
        struct xfs_mount        *mp = sc->mp;
        struct xfs_trans        *tp = NULL;
-       struct xfs_dquot        *udqp = NULL;
-       struct xfs_dquot        *gdqp = NULL;
-       struct xfs_dquot        *pdqp = NULL;
+       struct xfs_dquot        *udqp;
+       struct xfs_dquot        *gdqp;
+       struct xfs_dquot        *pdqp;
        struct xfs_trans_res    *tres;
        struct xfs_inode        *dp = mp->m_rootip;
        xfs_ino_t               ino;
@@ -70,8 +70,7 @@ xrep_tempfile_create(
         * inode should be completely root owned so that we don't fail due to
         * quota limits.
         */
-       error = xfs_qm_vop_dqalloc(dp, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, 0,
-                       XFS_QMOPT_QUOTALL, &udqp, &gdqp, &pdqp);
+       error = xfs_icreate_dqalloc(&args, &udqp, &gdqp, &pdqp);
        if (error)
                return error;
 
index 0b4f6cf72baea4434c335461d862c90e65b1e46e..5848f7b36cc562b79f798bf867f82a21ed982739 100644 (file)
@@ -728,6 +728,38 @@ xfs_dir_hook_setup(
 }
 #endif /* CONFIG_XFS_LIVE_HOOKS */
 
+/* Return dquots for the ids that will be assigned to a new file. */
+int
+xfs_icreate_dqalloc(
+       const struct xfs_icreate_args   *args,
+       struct xfs_dquot                **udqpp,
+       struct xfs_dquot                **gdqpp,
+       struct xfs_dquot                **pdqpp)
+{
+       struct inode                    *dir = VFS_I(args->pip);
+       kuid_t                          uid = GLOBAL_ROOT_UID;
+       kgid_t                          gid = GLOBAL_ROOT_GID;
+       prid_t                          prid = 0;
+       unsigned int                    flags = XFS_QMOPT_QUOTALL;
+
+       if (args->idmap) {
+               /*
+                * 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.
+                */
+               uid = mapped_fsuid(args->idmap, i_user_ns(dir));
+               gid = mapped_fsgid(args->idmap, i_user_ns(dir));
+               prid = xfs_get_initial_prid(args->pip);
+               flags |= XFS_QMOPT_INHERIT;
+       }
+
+       *udqpp = *gdqpp = *pdqpp = NULL;
+
+       return xfs_qm_vop_dqalloc(args->pip, uid, gid, prid, flags, udqpp,
+                       gdqpp, pdqpp);
+}
+
 int
 xfs_create(
        const struct xfs_icreate_args *args,
@@ -738,13 +770,12 @@ xfs_create(
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_inode        *ip = NULL;
        struct xfs_trans        *tp = NULL;
-       struct xfs_dquot        *udqp = NULL;
-       struct xfs_dquot        *gdqp = NULL;
-       struct xfs_dquot        *pdqp = NULL;
+       struct xfs_dquot        *udqp;
+       struct xfs_dquot        *gdqp;
+       struct xfs_dquot        *pdqp;
        struct xfs_trans_res    *tres;
        struct xfs_parent_args  *ppargs;
        xfs_ino_t               ino;
-       prid_t                  prid;
        bool                    unlock_dp_on_error = false;
        bool                    is_dir = S_ISDIR(args->mode);
        uint                    resblks;
@@ -757,18 +788,8 @@ xfs_create(
        if (xfs_ifork_zapped(dp, XFS_DATA_FORK))
                return -EIO;
 
-       prid = xfs_get_initial_prid(dp);
-
-       /*
-        * 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(args->idmap, i_user_ns(VFS_I(dp))),
-                       mapped_fsgid(args->idmap, i_user_ns(VFS_I(dp))), prid,
-                       XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
-                       &udqp, &gdqp, &pdqp);
+       /* Make sure that we have allocated dquot(s) on disk. */
+       error = xfs_icreate_dqalloc(args, &udqp, &gdqp, &pdqp);
        if (error)
                return error;
 
@@ -920,12 +941,11 @@ xfs_create_tmpfile(
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_inode        *ip = NULL;
        struct xfs_trans        *tp = NULL;
-       struct xfs_dquot        *udqp = NULL;
-       struct xfs_dquot        *gdqp = NULL;
-       struct xfs_dquot        *pdqp = NULL;
+       struct xfs_dquot        *udqp;
+       struct xfs_dquot        *gdqp;
+       struct xfs_dquot        *pdqp;
        struct xfs_trans_res    *tres;
        xfs_ino_t               ino;
-       prid_t                  prid;
        uint                    resblks;
        int                     error;
 
@@ -934,18 +954,8 @@ xfs_create_tmpfile(
        if (xfs_is_shutdown(mp))
                return -EIO;
 
-       prid = xfs_get_initial_prid(dp);
-
-       /*
-        * 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(args->idmap, i_user_ns(VFS_I(dp))),
-                       mapped_fsgid(args->idmap, i_user_ns(VFS_I(dp))), prid,
-                       XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
-                       &udqp, &gdqp, &pdqp);
+       /* Make sure that we have allocated dquot(s) on disk. */
+       error = xfs_icreate_dqalloc(args, &udqp, &gdqp, &pdqp);
        if (error)
                return error;
 
index bc48e81829b5a3f1670a6e0b4716b8373d6841ad..a905929494bd546ce05935cd26ffe371530b7dac 100644 (file)
@@ -660,4 +660,8 @@ void xfs_dir_hook_setup(struct xfs_dir_hook *hook, notifier_fn_t mod_fn);
 # define xfs_dir_update_hook(dp, ip, delta, name)      ((void)0)
 #endif /* CONFIG_XFS_LIVE_HOOKS */
 
+int xfs_icreate_dqalloc(const struct xfs_icreate_args *args,
+               struct xfs_dquot **udqpp, struct xfs_dquot **gdqpp,
+               struct xfs_dquot **pdqpp);
+
 #endif /* __XFS_INODE_H__ */
index 3b797a39950d55f36515d2fc8e133e3ec997f18b..6ff736e5c4e7f545eb8430a3afdb328942a384b4 100644 (file)
@@ -101,10 +101,9 @@ xfs_symlink(
        int                     pathlen;
        bool                    unlock_dp_on_error = false;
        xfs_filblks_t           fs_blocks;
-       prid_t                  prid;
-       struct xfs_dquot        *udqp = NULL;
-       struct xfs_dquot        *gdqp = NULL;
-       struct xfs_dquot        *pdqp = NULL;
+       struct xfs_dquot        *udqp;
+       struct xfs_dquot        *gdqp;
+       struct xfs_dquot        *pdqp;
        uint                    resblks;
        xfs_ino_t               ino;
        struct xfs_parent_args  *ppargs;
@@ -127,17 +126,8 @@ xfs_symlink(
                return -ENAMETOOLONG;
        ASSERT(pathlen > 0);
 
-       prid = xfs_get_initial_prid(dp);
-
-       /*
-        * 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(idmap, i_user_ns(VFS_I(dp))),
-                       mapped_fsgid(idmap, i_user_ns(VFS_I(dp))), prid,
-                       XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
-                       &udqp, &gdqp, &pdqp);
+       /* Make sure that we have allocated dquot(s) on disk. */
+       error = xfs_icreate_dqalloc(&args, &udqp, &gdqp, &pdqp);
        if (error)
                return error;