xfs: only allow reaping of per-AG blocks in xrep_reap_extents
Now that we've refactored btree cursors to require the caller to pass in a perag structure, there are numerous problems in xrep_reap_extents if it's being called to reap extents for an inode metadata repair. We don't have any repair functions that can do that, so drop the support for now. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
8e54e06b5c
commit
a55e073088
1 changed files with 13 additions and 32 deletions
|
@ -162,40 +162,30 @@ xrep_reap_block(
|
||||||
struct xrep_reap_state *rs = priv;
|
struct xrep_reap_state *rs = priv;
|
||||||
struct xfs_scrub *sc = rs->sc;
|
struct xfs_scrub *sc = rs->sc;
|
||||||
struct xfs_btree_cur *cur;
|
struct xfs_btree_cur *cur;
|
||||||
struct xfs_buf *agf_bp = NULL;
|
xfs_agnumber_t agno;
|
||||||
xfs_agblock_t agbno;
|
xfs_agblock_t agbno;
|
||||||
bool has_other_rmap;
|
bool has_other_rmap;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
ASSERT(sc->ip != NULL ||
|
agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
|
||||||
XFS_FSB_TO_AGNO(sc->mp, fsbno) == sc->sa.pag->pag_agno);
|
|
||||||
trace_xrep_dispose_btree_extent(sc->mp,
|
|
||||||
XFS_FSB_TO_AGNO(sc->mp, fsbno),
|
|
||||||
XFS_FSB_TO_AGBNO(sc->mp, fsbno), 1);
|
|
||||||
|
|
||||||
agbno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
|
agbno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
|
||||||
ASSERT(XFS_FSB_TO_AGNO(sc->mp, fsbno) == sc->sa.pag->pag_agno);
|
|
||||||
|
|
||||||
/*
|
trace_xrep_dispose_btree_extent(sc->mp, agno, agbno, 1);
|
||||||
* If we are repairing per-inode metadata, we need to read in the AGF
|
|
||||||
* buffer. Otherwise, we're repairing a per-AG structure, so reuse
|
/* We don't support reaping file extents yet. */
|
||||||
* the AGF buffer that the setup functions already grabbed.
|
if (sc->ip != NULL || sc->sa.pag->pag_agno != agno) {
|
||||||
*/
|
ASSERT(0);
|
||||||
if (sc->ip) {
|
return -EFSCORRUPTED;
|
||||||
error = xfs_alloc_read_agf(sc->sa.pag, sc->tp, 0, &agf_bp);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
} else {
|
|
||||||
agf_bp = sc->sa.agf_bp;
|
|
||||||
}
|
}
|
||||||
cur = xfs_rmapbt_init_cursor(sc->mp, sc->tp, agf_bp, sc->sa.pag);
|
|
||||||
|
cur = xfs_rmapbt_init_cursor(sc->mp, sc->tp, sc->sa.agf_bp, sc->sa.pag);
|
||||||
|
|
||||||
/* Can we find any other rmappings? */
|
/* Can we find any other rmappings? */
|
||||||
error = xfs_rmap_has_other_keys(cur, agbno, 1, rs->oinfo,
|
error = xfs_rmap_has_other_keys(cur, agbno, 1, rs->oinfo,
|
||||||
&has_other_rmap);
|
&has_other_rmap);
|
||||||
xfs_btree_del_cursor(cur, error);
|
xfs_btree_del_cursor(cur, error);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_free;
|
return error;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there are other rmappings, this block is cross linked and must
|
* If there are other rmappings, this block is cross linked and must
|
||||||
|
@ -211,8 +201,8 @@ xrep_reap_block(
|
||||||
* to run xfs_repair.
|
* to run xfs_repair.
|
||||||
*/
|
*/
|
||||||
if (has_other_rmap) {
|
if (has_other_rmap) {
|
||||||
error = xfs_rmap_free(sc->tp, agf_bp, sc->sa.pag, agbno, 1,
|
error = xfs_rmap_free(sc->tp, sc->sa.agf_bp, sc->sa.pag, agbno,
|
||||||
rs->oinfo);
|
1, rs->oinfo);
|
||||||
} else if (rs->resv == XFS_AG_RESV_AGFL) {
|
} else if (rs->resv == XFS_AG_RESV_AGFL) {
|
||||||
xrep_block_reap_binval(sc, fsbno);
|
xrep_block_reap_binval(sc, fsbno);
|
||||||
error = xrep_put_freelist(sc, agbno);
|
error = xrep_put_freelist(sc, agbno);
|
||||||
|
@ -221,19 +211,10 @@ xrep_reap_block(
|
||||||
error = xfs_free_extent(sc->tp, sc->sa.pag, agbno, 1, rs->oinfo,
|
error = xfs_free_extent(sc->tp, sc->sa.pag, agbno, 1, rs->oinfo,
|
||||||
rs->resv);
|
rs->resv);
|
||||||
}
|
}
|
||||||
if (agf_bp != sc->sa.agf_bp)
|
|
||||||
xfs_trans_brelse(sc->tp, agf_bp);
|
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if (sc->ip)
|
|
||||||
return xfs_trans_roll_inode(&sc->tp, sc->ip);
|
|
||||||
return xrep_roll_ag_trans(sc);
|
return xrep_roll_ag_trans(sc);
|
||||||
|
|
||||||
out_free:
|
|
||||||
if (agf_bp != sc->sa.agf_bp)
|
|
||||||
xfs_trans_brelse(sc->tp, agf_bp);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dispose of every block of every extent in the bitmap. */
|
/* Dispose of every block of every extent in the bitmap. */
|
||||||
|
|
Loading…
Add table
Reference in a new issue