Record BMBT blocks in the raw rmap list. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- repair/rmap.c | 32 ++++++++++++++++++++++++++++++++ repair/rmap.h | 1 + repair/scan.c | 11 +++++++++++ 3 files changed, 44 insertions(+) diff --git a/repair/rmap.c b/repair/rmap.c index f3363f7..40bdae3 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -207,6 +207,38 @@ __add_raw_rmap( } /** + * add_bmbt_rmap() -- Add an observation about a bmbt block for later + * btree reconstruction. + * + * @mp: XFS mount object. + * @ino: The inode number associated with the extent mapping. + * @whichfork: Data or attribute fork? + * @fsbno: fsblock number of the bmbt block + */ +int +add_bmbt_rmap( + struct xfs_mount *mp, + xfs_ino_t ino, + int whichfork, + xfs_fsblock_t fsbno) +{ + xfs_agnumber_t agno; + xfs_agblock_t agbno; + + if (!needs_rmap_work(mp)) + return 0; + + agno = XFS_FSB_TO_AGNO(mp, fsbno); + agbno = XFS_FSB_TO_AGBNO(mp, fsbno); + ASSERT(agno != NULLAGNUMBER); + ASSERT(agno < mp->m_sb.sb_agcount); + ASSERT(agbno + 1 <= mp->m_sb.sb_agblocks); + + return __add_raw_rmap(mp, agno, agbno, 1, ino, + whichfork == XFS_ATTR_FORK, true); +} + +/** * add_ag_rmap() -- Add an reverse mapping for a per-AG fixed metadata object. * * @mp: XFS mount object. diff --git a/repair/rmap.h b/repair/rmap.h index 51e916b..57d56a0 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -28,6 +28,7 @@ extern void free_rmaps(struct xfs_mount *); extern int add_rmap(struct xfs_mount *, xfs_ino_t, int, struct xfs_bmbt_irec *); extern int add_ag_rmap(struct xfs_mount *, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, uint64_t owner); +extern int add_bmbt_rmap(struct xfs_mount *, xfs_ino_t, int, xfs_fsblock_t); extern int fold_raw_rmaps(struct xfs_mount *mp, xfs_agnumber_t agno); #endif /* RMAP_H_ */ diff --git a/repair/scan.c b/repair/scan.c index 1ade344..db9e131 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -29,6 +29,7 @@ #include "bmap.h" #include "progress.h" #include "threads.h" +#include "rmap.h" static xfs_mount_t *mp = NULL; @@ -197,6 +198,7 @@ scan_bmapbt( xfs_agnumber_t agno; xfs_agblock_t agbno; int state; + int error; /* * unlike the ag freeblock btrees, if anything looks wrong @@ -378,6 +380,15 @@ _("bad state %d, inode %" PRIu64 " bmap block 0x%" PRIx64 "\n"), (*tot)++; numrecs = be16_to_cpu(block->bb_numrecs); + /* Record BMBT blocks in the reverse-mapping data. */ + if (check_dups && collect_rmaps) { + error = add_bmbt_rmap(mp, ino, whichfork, bno); + if (error) + do_error( +_("couldn't add inode %"PRIu64" bmbt block %"PRIu64" reverse-mapping data."), + ino, bno); + } + if (level == 0) { if (numrecs > mp->m_bmap_dmxr[0] || (isroot == 0 && numrecs < mp->m_bmap_dmnr[0])) { _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs