Skip to content

Commit 4f5e304

Browse files
author
Darrick J. Wong
committed
xfs: cross-reference rmap records with refcount btrees
Strengthen the rmap btree record checker a little more by comparing OWN_REFCBT reverse mappings against the refcount btrees. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
1 parent 0abe6fc commit 4f5e304

1 file changed

Lines changed: 23 additions & 0 deletions

File tree

fs/xfs/scrub/rmap.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "xfs_alloc.h"
2020
#include "xfs_alloc_btree.h"
2121
#include "xfs_ialloc_btree.h"
22+
#include "xfs_refcount_btree.h"
2223
#include "scrub/scrub.h"
2324
#include "scrub/common.h"
2425
#include "scrub/btree.h"
@@ -58,6 +59,7 @@ struct xchk_rmap {
5859
struct xagb_bitmap log_owned;
5960
struct xagb_bitmap ag_owned;
6061
struct xagb_bitmap inobt_owned;
62+
struct xagb_bitmap refcbt_owned;
6163

6264
/* Did we complete the AG space metadata bitmaps? */
6365
bool bitmaps_complete;
@@ -304,6 +306,9 @@ xchk_rmapbt_mark_bitmap(
304306
case XFS_RMAP_OWN_INOBT:
305307
bmp = &cr->inobt_owned;
306308
break;
309+
case XFS_RMAP_OWN_REFC:
310+
bmp = &cr->refcbt_owned;
311+
break;
307312
}
308313

309314
if (!bmp)
@@ -461,6 +466,19 @@ xchk_rmapbt_walk_ag_metadata(
461466
goto out;
462467
}
463468

469+
/* OWN_REFC: refcountbt */
470+
if (xfs_has_reflink(sc->mp)) {
471+
cur = sc->sa.refc_cur;
472+
if (!cur)
473+
cur = xfs_refcountbt_init_cursor(sc->mp, sc->tp,
474+
sc->sa.agf_bp, sc->sa.pag);
475+
error = xagb_bitmap_set_btblocks(&cr->refcbt_owned, cur);
476+
if (cur != sc->sa.refc_cur)
477+
xfs_btree_del_cursor(cur, error);
478+
if (error)
479+
goto out;
480+
}
481+
464482
out:
465483
/*
466484
* If there's an error, set XFAIL and disable the bitmap
@@ -508,6 +526,9 @@ xchk_rmapbt_check_bitmaps(
508526

509527
if (xagb_bitmap_hweight(&cr->inobt_owned) != 0)
510528
xchk_btree_xref_set_corrupt(sc, cur, level);
529+
530+
if (xagb_bitmap_hweight(&cr->refcbt_owned) != 0)
531+
xchk_btree_xref_set_corrupt(sc, cur, level);
511532
}
512533

513534
/* Scrub the rmap btree for some AG. */
@@ -526,6 +547,7 @@ xchk_rmapbt(
526547
xagb_bitmap_init(&cr->log_owned);
527548
xagb_bitmap_init(&cr->ag_owned);
528549
xagb_bitmap_init(&cr->inobt_owned);
550+
xagb_bitmap_init(&cr->refcbt_owned);
529551

530552
error = xchk_rmapbt_walk_ag_metadata(sc, cr);
531553
if (error)
@@ -539,6 +561,7 @@ xchk_rmapbt(
539561
xchk_rmapbt_check_bitmaps(sc, cr);
540562

541563
out:
564+
xagb_bitmap_destroy(&cr->refcbt_owned);
542565
xagb_bitmap_destroy(&cr->inobt_owned);
543566
xagb_bitmap_destroy(&cr->ag_owned);
544567
xagb_bitmap_destroy(&cr->log_owned);

0 commit comments

Comments
 (0)