mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-08 14:23:19 +00:00
xfs: remove xfs_defer_agfl_block
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>
This commit is contained in:
parent
851a678189
commit
7272f77c67
@ -2509,48 +2509,6 @@ xfs_agfl_reset(
|
|||||||
clear_bit(XFS_AGSTATE_AGFL_NEEDS_RESET, &pag->pag_opstate);
|
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.
|
* Add the extent to the list of extents to be free at transaction end.
|
||||||
* The list is maintained sorted (by block number).
|
* The list is maintained sorted (by block number).
|
||||||
@ -2571,7 +2529,6 @@ xfs_defer_extent_free(
|
|||||||
ASSERT(len <= XFS_MAX_BMBT_EXTLEN);
|
ASSERT(len <= XFS_MAX_BMBT_EXTLEN);
|
||||||
ASSERT(!isnullstartblock(bno));
|
ASSERT(!isnullstartblock(bno));
|
||||||
ASSERT(!(free_flags & ~XFS_FREE_EXTENT_ALL_FLAGS));
|
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)))
|
if (XFS_IS_CORRUPT(mp, !xfs_verify_fsbext(mp, bno, len)))
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
@ -2598,7 +2555,13 @@ xfs_defer_extent_free(
|
|||||||
trace_xfs_extent_free_defer(mp, xefi);
|
trace_xfs_extent_free_defer(mp, xefi);
|
||||||
|
|
||||||
xfs_extent_free_get_group(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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2856,8 +2819,21 @@ xfs_alloc_fix_freelist(
|
|||||||
if (error)
|
if (error)
|
||||||
goto out_agbp_relse;
|
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)
|
if (error)
|
||||||
goto out_agbp_relse;
|
goto out_agbp_relse;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user