mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
xfs: convert refcount btree cursor to use perags
Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
parent
fa9c3c1973
commit
a81a06211f
9 changed files with 50 additions and 44 deletions
|
@ -22,6 +22,7 @@
|
|||
#include "xfs_bit.h"
|
||||
#include "xfs_refcount.h"
|
||||
#include "xfs_rmap.h"
|
||||
#include "xfs_ag.h"
|
||||
|
||||
/* Allowable refcount adjustment amounts. */
|
||||
enum xfs_refc_adjust_op {
|
||||
|
@ -1142,30 +1143,30 @@ xfs_refcount_finish_one(
|
|||
struct xfs_btree_cur *rcur;
|
||||
struct xfs_buf *agbp = NULL;
|
||||
int error = 0;
|
||||
xfs_agnumber_t agno;
|
||||
xfs_agblock_t bno;
|
||||
xfs_agblock_t new_agbno;
|
||||
unsigned long nr_ops = 0;
|
||||
int shape_changes = 0;
|
||||
struct xfs_perag *pag;
|
||||
|
||||
agno = XFS_FSB_TO_AGNO(mp, startblock);
|
||||
ASSERT(agno != NULLAGNUMBER);
|
||||
pag = xfs_perag_get(mp, XFS_FSB_TO_AGNO(mp, startblock));
|
||||
bno = XFS_FSB_TO_AGBNO(mp, startblock);
|
||||
|
||||
trace_xfs_refcount_deferred(mp, XFS_FSB_TO_AGNO(mp, startblock),
|
||||
type, XFS_FSB_TO_AGBNO(mp, startblock),
|
||||
blockcount);
|
||||
|
||||
if (XFS_TEST_ERROR(false, mp,
|
||||
XFS_ERRTAG_REFCOUNT_FINISH_ONE))
|
||||
return -EIO;
|
||||
if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_REFCOUNT_FINISH_ONE)) {
|
||||
error = -EIO;
|
||||
goto out_drop;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we haven't gotten a cursor or the cursor AG doesn't match
|
||||
* the startblock, get one now.
|
||||
*/
|
||||
rcur = *pcur;
|
||||
if (rcur != NULL && rcur->bc_ag.agno != agno) {
|
||||
if (rcur != NULL && rcur->bc_ag.pag != pag) {
|
||||
nr_ops = rcur->bc_ag.refc.nr_ops;
|
||||
shape_changes = rcur->bc_ag.refc.shape_changes;
|
||||
xfs_refcount_finish_one_cleanup(tp, rcur, 0);
|
||||
|
@ -1173,12 +1174,12 @@ xfs_refcount_finish_one(
|
|||
*pcur = NULL;
|
||||
}
|
||||
if (rcur == NULL) {
|
||||
error = xfs_alloc_read_agf(tp->t_mountp, tp, agno,
|
||||
error = xfs_alloc_read_agf(tp->t_mountp, tp, pag->pag_agno,
|
||||
XFS_ALLOC_FLAG_FREEING, &agbp);
|
||||
if (error)
|
||||
return error;
|
||||
goto out_drop;
|
||||
|
||||
rcur = xfs_refcountbt_init_cursor(mp, tp, agbp, agno, NULL);
|
||||
rcur = xfs_refcountbt_init_cursor(mp, tp, agbp, pag);
|
||||
rcur->bc_ag.refc.nr_ops = nr_ops;
|
||||
rcur->bc_ag.refc.shape_changes = shape_changes;
|
||||
}
|
||||
|
@ -1188,12 +1189,12 @@ xfs_refcount_finish_one(
|
|||
case XFS_REFCOUNT_INCREASE:
|
||||
error = xfs_refcount_adjust(rcur, bno, blockcount, &new_agbno,
|
||||
new_len, XFS_REFCOUNT_ADJUST_INCREASE, NULL);
|
||||
*new_fsb = XFS_AGB_TO_FSB(mp, agno, new_agbno);
|
||||
*new_fsb = XFS_AGB_TO_FSB(mp, pag->pag_agno, new_agbno);
|
||||
break;
|
||||
case XFS_REFCOUNT_DECREASE:
|
||||
error = xfs_refcount_adjust(rcur, bno, blockcount, &new_agbno,
|
||||
new_len, XFS_REFCOUNT_ADJUST_DECREASE, NULL);
|
||||
*new_fsb = XFS_AGB_TO_FSB(mp, agno, new_agbno);
|
||||
*new_fsb = XFS_AGB_TO_FSB(mp, pag->pag_agno, new_agbno);
|
||||
break;
|
||||
case XFS_REFCOUNT_ALLOC_COW:
|
||||
*new_fsb = startblock + blockcount;
|
||||
|
@ -1210,8 +1211,10 @@ xfs_refcount_finish_one(
|
|||
error = -EFSCORRUPTED;
|
||||
}
|
||||
if (!error && *new_len > 0)
|
||||
trace_xfs_refcount_finish_one_leftover(mp, agno, type,
|
||||
trace_xfs_refcount_finish_one_leftover(mp, pag->pag_agno, type,
|
||||
bno, blockcount, new_agbno, *new_len);
|
||||
out_drop:
|
||||
xfs_perag_put(pag);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -1672,7 +1675,7 @@ xfs_refcount_recover_extent(
|
|||
int
|
||||
xfs_refcount_recover_cow_leftovers(
|
||||
struct xfs_mount *mp,
|
||||
xfs_agnumber_t agno)
|
||||
struct xfs_perag *pag)
|
||||
{
|
||||
struct xfs_trans *tp;
|
||||
struct xfs_btree_cur *cur;
|
||||
|
@ -1704,10 +1707,10 @@ xfs_refcount_recover_cow_leftovers(
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
error = xfs_alloc_read_agf(mp, tp, agno, 0, &agbp);
|
||||
error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp);
|
||||
if (error)
|
||||
goto out_trans;
|
||||
cur = xfs_refcountbt_init_cursor(mp, tp, agbp, agno, NULL);
|
||||
cur = xfs_refcountbt_init_cursor(mp, tp, agbp, pag);
|
||||
|
||||
/* Find all the leftover CoW staging extents. */
|
||||
memset(&low, 0, sizeof(low));
|
||||
|
@ -1729,11 +1732,12 @@ xfs_refcount_recover_cow_leftovers(
|
|||
if (error)
|
||||
goto out_free;
|
||||
|
||||
trace_xfs_refcount_recover_extent(mp, agno, &rr->rr_rrec);
|
||||
trace_xfs_refcount_recover_extent(mp, pag->pag_agno,
|
||||
&rr->rr_rrec);
|
||||
|
||||
/* Free the orphan record */
|
||||
agbno = rr->rr_rrec.rc_startblock - XFS_REFC_COW_START;
|
||||
fsb = XFS_AGB_TO_FSB(mp, agno, agbno);
|
||||
fsb = XFS_AGB_TO_FSB(mp, pag->pag_agno, agbno);
|
||||
xfs_refcount_free_cow_extent(tp, fsb,
|
||||
rr->rr_rrec.rc_blockcount);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue