xfs: pass per-ag references to xfs_free_extent
[ Upstream 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 <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Leah Rumancik <leah.rumancik@gmail.com> Acked-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ab3b2a70c4
commit
ec81c519e7
@ -981,10 +981,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;
|
||||||
|
|
||||||
|
@ -3447,7 +3447,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,
|
||||||
@ -3455,12 +3456,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);
|
||||||
@ -3469,10 +3467,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)) {
|
||||||
@ -3486,20 +3483,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +130,8 @@ xfs_alloc_vextent(
|
|||||||
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 */
|
||||||
@ -139,12 +140,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(
|
|||||||
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(
|
|||||||
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;
|
||||||
|
|
||||||
|
@ -582,7 +582,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(
|
|||||||
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(
|
|||||||
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:
|
||||||
|
Loading…
Reference in New Issue
Block a user