xfs: create agfl block free helper function
Refactor the AGFL block free code into a new helper such that it can be invoked from deferred context. No functional changes. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
72c5c5f6d0
commit
4223f659dd
2 changed files with 29 additions and 10 deletions
|
@ -2060,6 +2060,30 @@ xfs_alloc_space_available(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
xfs_free_agfl_block(
|
||||||
|
struct xfs_trans *tp,
|
||||||
|
xfs_agnumber_t agno,
|
||||||
|
xfs_agblock_t agbno,
|
||||||
|
struct xfs_buf *agbp,
|
||||||
|
struct xfs_owner_info *oinfo)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
struct xfs_buf *bp;
|
||||||
|
|
||||||
|
error = xfs_free_ag_extent(tp, agbp, agno, agbno, 1, oinfo,
|
||||||
|
XFS_AG_RESV_AGFL);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
bp = xfs_btree_get_bufs(tp->t_mountp, tp, agno, agbno, 0);
|
||||||
|
if (!bp)
|
||||||
|
return -EFSCORRUPTED;
|
||||||
|
xfs_trans_binval(tp, bp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check the agfl fields of the agf for inconsistency or corruption. The purpose
|
* Check the agfl fields of the agf for inconsistency or corruption. The purpose
|
||||||
* is to detect an agfl header padding mismatch between current and early v5
|
* is to detect an agfl header padding mismatch between current and early v5
|
||||||
|
@ -2247,21 +2271,14 @@ xfs_alloc_fix_freelist(
|
||||||
else
|
else
|
||||||
xfs_rmap_ag_owner(&targs.oinfo, XFS_RMAP_OWN_AG);
|
xfs_rmap_ag_owner(&targs.oinfo, XFS_RMAP_OWN_AG);
|
||||||
while (!(flags & XFS_ALLOC_FLAG_NOSHRINK) && pag->pagf_flcount > need) {
|
while (!(flags & XFS_ALLOC_FLAG_NOSHRINK) && pag->pagf_flcount > need) {
|
||||||
struct xfs_buf *bp;
|
|
||||||
|
|
||||||
error = xfs_alloc_get_freelist(tp, agbp, &bno, 0);
|
error = xfs_alloc_get_freelist(tp, agbp, &bno, 0);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_agbp_relse;
|
goto out_agbp_relse;
|
||||||
error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1,
|
|
||||||
&targs.oinfo, XFS_AG_RESV_AGFL);
|
error = xfs_free_agfl_block(tp, args->agno, bno, agbp,
|
||||||
|
&targs.oinfo);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_agbp_relse;
|
goto out_agbp_relse;
|
||||||
bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0);
|
|
||||||
if (!bp) {
|
|
||||||
error = -EFSCORRUPTED;
|
|
||||||
goto out_agbp_relse;
|
|
||||||
}
|
|
||||||
xfs_trans_binval(tp, bp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
targs.tp = tp;
|
targs.tp = tp;
|
||||||
|
|
|
@ -223,6 +223,8 @@ int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
|
||||||
xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
|
xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
|
||||||
int xfs_alloc_read_agfl(struct xfs_mount *mp, struct xfs_trans *tp,
|
int xfs_alloc_read_agfl(struct xfs_mount *mp, struct xfs_trans *tp,
|
||||||
xfs_agnumber_t agno, struct xfs_buf **bpp);
|
xfs_agnumber_t agno, struct xfs_buf **bpp);
|
||||||
|
int xfs_free_agfl_block(struct xfs_trans *, xfs_agnumber_t, xfs_agblock_t,
|
||||||
|
struct xfs_buf *, struct xfs_owner_info *);
|
||||||
int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags);
|
int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags);
|
||||||
int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno,
|
int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno,
|
||||||
struct xfs_buf **agbp);
|
struct xfs_buf **agbp);
|
||||||
|
|
Loading…
Add table
Reference in a new issue