From: Darrick J. Wong Date: Fri, 19 Aug 2016 00:10:15 +0000 (+1000) Subject: xfs_repair: add inode bmbt block rmaps X-Git-Tag: v4.8.0-rc1~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00efc33aa17d22ccfc7ebc60822e094f877f22e2;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: add inode bmbt block rmaps Record BMBT blocks in the raw rmap list. [dchinner: remove unused lastowner/lastoffset variables from scan.c] Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- diff --git a/repair/rmap.c b/repair/rmap.c index 185174245..e30e99b35 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -229,6 +229,32 @@ __add_raw_rmap( return slab_add(ag_rmaps[agno].ar_raw_rmaps, &rmap); } +/* + * Add a reverse mapping for an inode fork's block mapping btree 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 a reverse mapping for a per-AG fixed metadata extent. */ diff --git a/repair/rmap.h b/repair/rmap.h index ca92623b1..6a3a0a43a 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -30,6 +30,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); extern bool mergeable_rmaps(struct xfs_rmap_irec *r1, struct xfs_rmap_irec *r2); diff --git a/repair/scan.c b/repair/scan.c index a54ef748a..d22dca3de 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])) { @@ -878,8 +889,6 @@ scan_rmapbt( int numrecs; int state; xfs_agblock_t lastblock = 0; - int64_t lastowner = 0; - int64_t lastoffset = 0; if (magic != XFS_RMAP_CRC_MAGIC) { name = "(unknown)"; @@ -980,8 +989,6 @@ _("%s rmap btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (i == 0) { advance: lastblock = b; - lastowner = owner; - lastoffset = offset; } else { bool bad;