From: Darrick J. Wong Date: Fri, 26 May 2023 13:38:11 +0000 (+0200) Subject: xfs: pass per-ag references to xfs_free_extent X-Git-Tag: v6.4.0~60 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=42c1e5c18e5ee1547aa21eec1caa5371a958d4a7;p=thirdparty%2Fxfsprogs-dev.git xfs: pass per-ag references to xfs_free_extent Source kernel commit: b2ccab3199aa7cea9154d80ea2585312c5f6eba0 Pass a reference to the per-AG structure to xfs_free_extent. Most callers already have one, so we can eliminate unnecessary lookups. The one exception to this is the EFI code, which the next patch will fix. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Carlos Maiolino --- diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index 3dbcf1163..2ce3b1cc8 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -81,6 +81,9 @@ xfs_extent_free_finish_item( { struct xfs_owner_info oinfo = { }; struct xfs_extent_free_item *xefi; + struct xfs_perag *pag; + xfs_agnumber_t agno; + xfs_agblock_t agbno; int error; xefi = container_of(item, struct xfs_extent_free_item, xefi_list); @@ -89,8 +92,14 @@ xfs_extent_free_finish_item( oinfo.oi_flags |= XFS_OWNER_INFO_ATTR_FORK; if (xefi->xefi_flags & XFS_EFI_BMBT_BLOCK) oinfo.oi_flags |= XFS_OWNER_INFO_BMBT_BLOCK; - error = xfs_free_extent(tp, xefi->xefi_startblock, - xefi->xefi_blockcount, &oinfo, XFS_AG_RESV_NONE); + + agno = XFS_FSB_TO_AGNO(tp->t_mountp, xefi->xefi_startblock); + agbno = XFS_FSB_TO_AGBNO(tp->t_mountp, xefi->xefi_startblock); + pag = xfs_perag_get(tp->t_mountp, agno); + error = xfs_free_extent(tp, pag, agbno, xefi->xefi_blockcount, &oinfo, + XFS_AG_RESV_NONE); + xfs_perag_put(pag); + kmem_cache_free(xfs_extfree_item_cache, xefi); return error; } diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c index 224ee005c..e7801a67e 100644 --- a/libxfs/xfs_ag.c +++ b/libxfs/xfs_ag.c @@ -1041,10 +1041,8 @@ xfs_ag_extend_space( if (error) return error; - error = xfs_free_extent(tp, XFS_AGB_TO_FSB(pag->pag_mount, pag->pag_agno, - be32_to_cpu(agf->agf_length) - len), - len, &XFS_RMAP_OINFO_SKIP_UPDATE, - XFS_AG_RESV_NONE); + error = xfs_free_extent(tp, pag, be32_to_cpu(agf->agf_length) - len, + len, &XFS_RMAP_OINFO_SKIP_UPDATE, XFS_AG_RESV_NONE); if (error) return error; diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 61dad140c..e8eaa92ae 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -3592,7 +3592,8 @@ xfs_free_extent_fix_freelist( int __xfs_free_extent( struct xfs_trans *tp, - xfs_fsblock_t bno, + struct xfs_perag *pag, + xfs_agblock_t agbno, xfs_extlen_t len, const struct xfs_owner_info *oinfo, enum xfs_ag_resv_type type, @@ -3600,12 +3601,9 @@ __xfs_free_extent( { struct xfs_mount *mp = tp->t_mountp; struct xfs_buf *agbp; - xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, bno); - xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, bno); struct xfs_agf *agf; int error; unsigned int busy_flags = 0; - struct xfs_perag *pag; ASSERT(len != 0); ASSERT(type != XFS_AG_RESV_AGFL); @@ -3614,10 +3612,9 @@ __xfs_free_extent( XFS_ERRTAG_FREE_EXTENT)) return -EIO; - pag = xfs_perag_get(mp, agno); error = xfs_free_extent_fix_freelist(tp, pag, &agbp); if (error) - goto err; + return error; agf = agbp->b_addr; if (XFS_IS_CORRUPT(mp, agbno >= mp->m_sb.sb_agblocks)) { @@ -3631,20 +3628,18 @@ __xfs_free_extent( goto err_release; } - error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, type); + error = xfs_free_ag_extent(tp, agbp, pag->pag_agno, agbno, len, oinfo, + type); if (error) goto err_release; if (skip_discard) busy_flags |= XFS_EXTENT_BUSY_SKIP_DISCARD; xfs_extent_busy_insert(tp, pag, agbno, len, busy_flags); - xfs_perag_put(pag); return 0; err_release: xfs_trans_brelse(tp, agbp); -err: - xfs_perag_put(pag); return error; } diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index 2b246d74c..e12d86e3a 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -141,7 +141,8 @@ int xfs_alloc_vextent_first_ag(struct xfs_alloc_arg *args, int /* error */ __xfs_free_extent( struct xfs_trans *tp, /* transaction pointer */ - xfs_fsblock_t bno, /* starting block number of extent */ + struct xfs_perag *pag, + xfs_agblock_t agbno, xfs_extlen_t len, /* length of extent */ const struct xfs_owner_info *oinfo, /* extent owner */ enum xfs_ag_resv_type type, /* block reservation type */ @@ -150,12 +151,13 @@ __xfs_free_extent( static inline int xfs_free_extent( struct xfs_trans *tp, - xfs_fsblock_t bno, + struct xfs_perag *pag, + xfs_agblock_t agbno, xfs_extlen_t len, const struct xfs_owner_info *oinfo, enum xfs_ag_resv_type type) { - return __xfs_free_extent(tp, bno, len, oinfo, type, false); + return __xfs_free_extent(tp, pag, agbno, len, oinfo, type, false); } int /* error */ diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 2f3d1e8d0..3865a7462 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -155,9 +155,12 @@ __xfs_inobt_free_block( struct xfs_buf *bp, enum xfs_ag_resv_type resv) { + xfs_fsblock_t fsbno; + xfs_inobt_mod_blockcount(cur, -1); - return xfs_free_extent(cur->bc_tp, - XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)), 1, + fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)); + return xfs_free_extent(cur->bc_tp, cur->bc_ag.pag, + XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1, &XFS_RMAP_OINFO_INOBT, resv); } diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index 2fbf2e2a7..eb56e07db 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -111,8 +111,9 @@ xfs_refcountbt_free_block( XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1); be32_add_cpu(&agf->agf_refcount_blocks, -1); xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); - error = xfs_free_extent(cur->bc_tp, fsbno, 1, &XFS_RMAP_OINFO_REFC, - XFS_AG_RESV_METADATA); + error = xfs_free_extent(cur->bc_tp, cur->bc_ag.pag, + XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1, + &XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA); if (error) return error; diff --git a/repair/phase5.c b/repair/phase5.c index 0d14c354f..d6b8168ea 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -598,14 +598,22 @@ inject_lost_extent( { struct xfs_mount *mp = arg; struct xfs_trans *tp; + struct xfs_perag *pag; + xfs_agnumber_t agno; + xfs_agblock_t agbno; int error; error = -libxfs_trans_alloc_rollable(mp, 16, &tp); if (error) return error; - error = -libxfs_free_extent(tp, start, length, + agno = XFS_FSB_TO_AGNO(mp, start); + agbno = XFS_FSB_TO_AGBNO(mp, start); + pag = libxfs_perag_get(mp, agno); + error = -libxfs_free_extent(tp, pag, agbno, length, &XFS_RMAP_OINFO_ANY_OWNER, XFS_AG_RESV_NONE); + libxfs_perag_put(pag); + if (error) return error;