]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: remove xfs_defer_agfl_block
authorChristoph Hellwig <hch@lst.de>
Tue, 2 Jul 2024 18:22:56 +0000 (11:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 2 Jul 2024 18:37:02 +0000 (11:37 -0700)
xfs_free_extent_later can handle the extra AGFL special casing with
very little extra logic.

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

index adae37eb3d881250e8a521f98c0763c757cb6297..fecfd61f5de84dfce98f98da74ed0a6e61ee7e77 100644 (file)
@@ -2509,48 +2509,6 @@ xfs_agfl_reset(
        clear_bit(XFS_AGSTATE_AGFL_NEEDS_RESET, &pag->pag_opstate);
 }
 
-/*
- * Defer an AGFL block free. This is effectively equivalent to
- * xfs_free_extent_later() with some special handling particular to AGFL blocks.
- *
- * Deferring AGFL frees helps prevent log reservation overruns due to too many
- * allocation operations in a transaction. AGFL frees are prone to this problem
- * because for one they are always freed one at a time. Further, an immediate
- * AGFL block free can cause a btree join and require another block free before
- * the real allocation can proceed. Deferring the free disconnects freeing up
- * the AGFL slot from freeing the block.
- */
-static int
-xfs_defer_agfl_block(
-       struct xfs_trans                *tp,
-       xfs_agnumber_t                  agno,
-       xfs_agblock_t                   agbno,
-       struct xfs_owner_info           *oinfo)
-{
-       struct xfs_mount                *mp = tp->t_mountp;
-       struct xfs_extent_free_item     *xefi;
-       xfs_fsblock_t                   fsbno = XFS_AGB_TO_FSB(mp, agno, agbno);
-
-       ASSERT(xfs_extfree_item_cache != NULL);
-       ASSERT(oinfo != NULL);
-
-       if (XFS_IS_CORRUPT(mp, !xfs_verify_fsbno(mp, fsbno)))
-               return -EFSCORRUPTED;
-
-       xefi = kmem_cache_zalloc(xfs_extfree_item_cache,
-                              GFP_KERNEL | __GFP_NOFAIL);
-       xefi->xefi_startblock = fsbno;
-       xefi->xefi_blockcount = 1;
-       xefi->xefi_owner = oinfo->oi_owner;
-       xefi->xefi_agresv = XFS_AG_RESV_AGFL;
-
-       trace_xfs_agfl_free_defer(mp, xefi);
-
-       xfs_extent_free_get_group(mp, xefi);
-       xfs_defer_add(tp, &xefi->xefi_list, &xfs_agfl_free_defer_type);
-       return 0;
-}
-
 /*
  * Add the extent to the list of extents to be free at transaction end.
  * The list is maintained sorted (by block number).
@@ -2571,7 +2529,6 @@ xfs_defer_extent_free(
        ASSERT(len <= XFS_MAX_BMBT_EXTLEN);
        ASSERT(!isnullstartblock(bno));
        ASSERT(!(free_flags & ~XFS_FREE_EXTENT_ALL_FLAGS));
-       ASSERT(type != XFS_AG_RESV_AGFL);
 
        if (XFS_IS_CORRUPT(mp, !xfs_verify_fsbext(mp, bno, len)))
                return -EFSCORRUPTED;
@@ -2598,7 +2555,13 @@ xfs_defer_extent_free(
        trace_xfs_extent_free_defer(mp, xefi);
 
        xfs_extent_free_get_group(mp, xefi);
-       *dfpp = xfs_defer_add(tp, &xefi->xefi_list, &xfs_extent_free_defer_type);
+
+       if (xefi->xefi_agresv == XFS_AG_RESV_AGFL)
+               *dfpp = xfs_defer_add(tp, &xefi->xefi_list,
+                               &xfs_agfl_free_defer_type);
+       else
+               *dfpp = xfs_defer_add(tp, &xefi->xefi_list,
+                               &xfs_extent_free_defer_type);
        return 0;
 }
 
@@ -2856,8 +2819,21 @@ xfs_alloc_fix_freelist(
                if (error)
                        goto out_agbp_relse;
 
-               /* defer agfl frees */
-               error = xfs_defer_agfl_block(tp, args->agno, bno, &targs.oinfo);
+               /*
+                * Defer the AGFL block free.
+                *
+                * This helps to prevent log reservation overruns due to too
+                * many allocation operations in a transaction. AGFL frees are
+                * prone to this problem because for one they are always freed
+                * one at a time.  Further, an immediate AGFL block free can
+                * cause a btree join and require another block free before the
+                * real allocation can proceed.
+                * Deferring the free disconnects freeing up the AGFL slot from
+                * freeing the block.
+                */
+               error = xfs_free_extent_later(tp,
+                               XFS_AGB_TO_FSB(mp, args->agno, bno), 1,
+                               &targs.oinfo, XFS_AG_RESV_AGFL, 0);
                if (error)
                        goto out_agbp_relse;
        }