]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: decouple xfs_trans_alloc_empty from xfs_trans_alloc
authorChristoph Hellwig <hch@lst.de>
Wed, 16 Jul 2025 12:43:13 +0000 (14:43 +0200)
committerCarlos Maiolino <cem@kernel.org>
Thu, 24 Jul 2025 15:30:13 +0000 (17:30 +0200)
xfs_trans_alloc_empty only shares the very basic transaction structure
allocation and initialization with xfs_trans_alloc.

Split out a new __xfs_trans_alloc helper for that and otherwise decouple
xfs_trans_alloc_empty from xfs_trans_alloc.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_trans.c

index 2213cb2278d29f055b1b69a6a428f7ebe0050047..e5edb89909edde308483625045b56b495ef96f63 100644 (file)
@@ -241,6 +241,28 @@ undo_blocks:
        return error;
 }
 
+static struct xfs_trans *
+__xfs_trans_alloc(
+       struct xfs_mount        *mp,
+       uint                    flags)
+{
+       struct xfs_trans        *tp;
+
+       ASSERT(!(flags & XFS_TRANS_RES_FDBLKS) || xfs_has_lazysbcount(mp));
+
+       tp = kmem_cache_zalloc(xfs_trans_cache, GFP_KERNEL | __GFP_NOFAIL);
+       if (!(flags & XFS_TRANS_NO_WRITECOUNT))
+               sb_start_intwrite(mp->m_super);
+       xfs_trans_set_context(tp);
+       tp->t_flags = flags;
+       tp->t_mountp = mp;
+       INIT_LIST_HEAD(&tp->t_items);
+       INIT_LIST_HEAD(&tp->t_busy);
+       INIT_LIST_HEAD(&tp->t_dfops);
+       tp->t_highest_agno = NULLAGNUMBER;
+       return tp;
+}
+
 int
 xfs_trans_alloc(
        struct xfs_mount        *mp,
@@ -254,33 +276,16 @@ xfs_trans_alloc(
        bool                    want_retry = true;
        int                     error;
 
+       ASSERT(resp->tr_logres > 0);
+
        /*
         * Allocate the handle before we do our freeze accounting and setting up
         * GFP_NOFS allocation context so that we avoid lockdep false positives
         * by doing GFP_KERNEL allocations inside sb_start_intwrite().
         */
 retry:
-       tp = kmem_cache_zalloc(xfs_trans_cache, GFP_KERNEL | __GFP_NOFAIL);
-       if (!(flags & XFS_TRANS_NO_WRITECOUNT))
-               sb_start_intwrite(mp->m_super);
-       xfs_trans_set_context(tp);
-
-       /*
-        * Zero-reservation ("empty") transactions can't modify anything, so
-        * they're allowed to run while we're frozen.
-        */
-       WARN_ON(resp->tr_logres > 0 &&
-               mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE);
-       ASSERT(!(flags & XFS_TRANS_RES_FDBLKS) ||
-              xfs_has_lazysbcount(mp));
-
-       tp->t_flags = flags;
-       tp->t_mountp = mp;
-       INIT_LIST_HEAD(&tp->t_items);
-       INIT_LIST_HEAD(&tp->t_busy);
-       INIT_LIST_HEAD(&tp->t_dfops);
-       tp->t_highest_agno = NULLAGNUMBER;
-
+       WARN_ON(mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE);
+       tp = __xfs_trans_alloc(mp, flags);
        error = xfs_trans_reserve(tp, resp, blocks, rtextents);
        if (error == -ENOSPC && want_retry) {
                xfs_trans_cancel(tp);
@@ -329,9 +334,8 @@ xfs_trans_alloc_empty(
        struct xfs_mount                *mp,
        struct xfs_trans                **tpp)
 {
-       struct xfs_trans_res            resv = {0};
-
-       return xfs_trans_alloc(mp, &resv, 0, 0, XFS_TRANS_NO_WRITECOUNT, tpp);
+       *tpp = __xfs_trans_alloc(mp, XFS_TRANS_NO_WRITECOUNT);
+       return 0;
 }
 
 /*