Commit b2ccab31 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: pass per-ag references to xfs_free_extent

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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 774a99b4
...@@ -1043,10 +1043,8 @@ xfs_ag_extend_space( ...@@ -1043,10 +1043,8 @@ xfs_ag_extend_space(
if (error) if (error)
return error; return error;
error = xfs_free_extent(tp, XFS_AGB_TO_FSB(pag->pag_mount, pag->pag_agno, error = xfs_free_extent(tp, pag, be32_to_cpu(agf->agf_length) - len,
be32_to_cpu(agf->agf_length) - len), len, &XFS_RMAP_OINFO_SKIP_UPDATE, XFS_AG_RESV_NONE);
len, &XFS_RMAP_OINFO_SKIP_UPDATE,
XFS_AG_RESV_NONE);
if (error) if (error)
return error; return error;
......
...@@ -3596,7 +3596,8 @@ xfs_free_extent_fix_freelist( ...@@ -3596,7 +3596,8 @@ xfs_free_extent_fix_freelist(
int int
__xfs_free_extent( __xfs_free_extent(
struct xfs_trans *tp, struct xfs_trans *tp,
xfs_fsblock_t bno, struct xfs_perag *pag,
xfs_agblock_t agbno,
xfs_extlen_t len, xfs_extlen_t len,
const struct xfs_owner_info *oinfo, const struct xfs_owner_info *oinfo,
enum xfs_ag_resv_type type, enum xfs_ag_resv_type type,
...@@ -3604,12 +3605,9 @@ __xfs_free_extent( ...@@ -3604,12 +3605,9 @@ __xfs_free_extent(
{ {
struct xfs_mount *mp = tp->t_mountp; struct xfs_mount *mp = tp->t_mountp;
struct xfs_buf *agbp; 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; struct xfs_agf *agf;
int error; int error;
unsigned int busy_flags = 0; unsigned int busy_flags = 0;
struct xfs_perag *pag;
ASSERT(len != 0); ASSERT(len != 0);
ASSERT(type != XFS_AG_RESV_AGFL); ASSERT(type != XFS_AG_RESV_AGFL);
...@@ -3618,10 +3616,9 @@ __xfs_free_extent( ...@@ -3618,10 +3616,9 @@ __xfs_free_extent(
XFS_ERRTAG_FREE_EXTENT)) XFS_ERRTAG_FREE_EXTENT))
return -EIO; return -EIO;
pag = xfs_perag_get(mp, agno);
error = xfs_free_extent_fix_freelist(tp, pag, &agbp); error = xfs_free_extent_fix_freelist(tp, pag, &agbp);
if (error) if (error)
goto err; return error;
agf = agbp->b_addr; agf = agbp->b_addr;
if (XFS_IS_CORRUPT(mp, agbno >= mp->m_sb.sb_agblocks)) { if (XFS_IS_CORRUPT(mp, agbno >= mp->m_sb.sb_agblocks)) {
...@@ -3635,20 +3632,18 @@ __xfs_free_extent( ...@@ -3635,20 +3632,18 @@ __xfs_free_extent(
goto err_release; 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) if (error)
goto err_release; goto err_release;
if (skip_discard) if (skip_discard)
busy_flags |= XFS_EXTENT_BUSY_SKIP_DISCARD; busy_flags |= XFS_EXTENT_BUSY_SKIP_DISCARD;
xfs_extent_busy_insert(tp, pag, agbno, len, busy_flags); xfs_extent_busy_insert(tp, pag, agbno, len, busy_flags);
xfs_perag_put(pag);
return 0; return 0;
err_release: err_release:
xfs_trans_brelse(tp, agbp); xfs_trans_brelse(tp, agbp);
err:
xfs_perag_put(pag);
return error; return error;
} }
......
...@@ -141,7 +141,8 @@ int xfs_alloc_vextent_first_ag(struct xfs_alloc_arg *args, ...@@ -141,7 +141,8 @@ int xfs_alloc_vextent_first_ag(struct xfs_alloc_arg *args,
int /* error */ int /* error */
__xfs_free_extent( __xfs_free_extent(
struct xfs_trans *tp, /* transaction pointer */ 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 */ xfs_extlen_t len, /* length of extent */
const struct xfs_owner_info *oinfo, /* extent owner */ const struct xfs_owner_info *oinfo, /* extent owner */
enum xfs_ag_resv_type type, /* block reservation type */ enum xfs_ag_resv_type type, /* block reservation type */
...@@ -150,12 +151,13 @@ __xfs_free_extent( ...@@ -150,12 +151,13 @@ __xfs_free_extent(
static inline int static inline int
xfs_free_extent( xfs_free_extent(
struct xfs_trans *tp, struct xfs_trans *tp,
xfs_fsblock_t bno, struct xfs_perag *pag,
xfs_agblock_t agbno,
xfs_extlen_t len, xfs_extlen_t len,
const struct xfs_owner_info *oinfo, const struct xfs_owner_info *oinfo,
enum xfs_ag_resv_type type) 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 */ int /* error */
......
...@@ -156,9 +156,12 @@ __xfs_inobt_free_block( ...@@ -156,9 +156,12 @@ __xfs_inobt_free_block(
struct xfs_buf *bp, struct xfs_buf *bp,
enum xfs_ag_resv_type resv) enum xfs_ag_resv_type resv)
{ {
xfs_fsblock_t fsbno;
xfs_inobt_mod_blockcount(cur, -1); xfs_inobt_mod_blockcount(cur, -1);
return xfs_free_extent(cur->bc_tp, fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp));
XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)), 1, 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); &XFS_RMAP_OINFO_INOBT, resv);
} }
......
...@@ -112,8 +112,9 @@ xfs_refcountbt_free_block( ...@@ -112,8 +112,9 @@ xfs_refcountbt_free_block(
XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1); XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1);
be32_add_cpu(&agf->agf_refcount_blocks, -1); be32_add_cpu(&agf->agf_refcount_blocks, -1);
xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); 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, error = xfs_free_extent(cur->bc_tp, cur->bc_ag.pag,
XFS_AG_RESV_METADATA); XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1,
&XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA);
if (error) if (error)
return error; return error;
......
...@@ -598,7 +598,8 @@ xrep_reap_block( ...@@ -598,7 +598,8 @@ xrep_reap_block(
else if (resv == XFS_AG_RESV_AGFL) else if (resv == XFS_AG_RESV_AGFL)
error = xrep_put_freelist(sc, agbno); error = xrep_put_freelist(sc, agbno);
else else
error = xfs_free_extent(sc->tp, fsbno, 1, oinfo, resv); error = xfs_free_extent(sc->tp, sc->sa.pag, agbno, 1, oinfo,
resv);
if (agf_bp != sc->sa.agf_bp) if (agf_bp != sc->sa.agf_bp)
xfs_trans_brelse(sc->tp, agf_bp); xfs_trans_brelse(sc->tp, agf_bp);
if (error) if (error)
......
...@@ -350,6 +350,7 @@ xfs_trans_free_extent( ...@@ -350,6 +350,7 @@ xfs_trans_free_extent(
struct xfs_owner_info oinfo = { }; struct xfs_owner_info oinfo = { };
struct xfs_mount *mp = tp->t_mountp; struct xfs_mount *mp = tp->t_mountp;
struct xfs_extent *extp; struct xfs_extent *extp;
struct xfs_perag *pag;
uint next_extent; uint next_extent;
xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp,
xefi->xefi_startblock); xefi->xefi_startblock);
...@@ -366,9 +367,12 @@ xfs_trans_free_extent( ...@@ -366,9 +367,12 @@ xfs_trans_free_extent(
trace_xfs_bmap_free_deferred(tp->t_mountp, agno, 0, agbno, trace_xfs_bmap_free_deferred(tp->t_mountp, agno, 0, agbno,
xefi->xefi_blockcount); xefi->xefi_blockcount);
error = __xfs_free_extent(tp, xefi->xefi_startblock, pag = xfs_perag_get(mp, agno);
xefi->xefi_blockcount, &oinfo, XFS_AG_RESV_NONE, error = __xfs_free_extent(tp, pag, agbno, xefi->xefi_blockcount,
&oinfo, XFS_AG_RESV_NONE,
xefi->xefi_flags & XFS_EFI_SKIP_DISCARD); xefi->xefi_flags & XFS_EFI_SKIP_DISCARD);
xfs_perag_put(pag);
/* /*
* Mark the transaction dirty, even on error. This ensures the * Mark the transaction dirty, even on error. This ensures the
* transaction is aborted, which: * transaction is aborted, which:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment