xfs
[Top] [All Lists]

[PATCH 061/145] xfs_repair: add inode bmbt block rmaps

To: david@xxxxxxxxxxxxx, darrick.wong@xxxxxxxxxx
Subject: [PATCH 061/145] xfs_repair: add inode bmbt block rmaps
From: "Darrick J. Wong" <darrick.wong@xxxxxxxxxx>
Date: Thu, 16 Jun 2016 18:37:09 -0700
Cc: xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <146612704434.16048.12932915166928562654.stgit@xxxxxxxxxxxxxxxx>
References: <146612704434.16048.12932915166928562654.stgit@xxxxxxxxxxxxxxxx>
User-agent: StGit/0.17.1-dirty
Record BMBT blocks in the raw rmap list.

Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
---
 repair/rmap.c |   26 ++++++++++++++++++++++++++
 repair/rmap.h |    1 +
 repair/scan.c |   11 +++++++++++
 3 files changed, 38 insertions(+)


diff --git a/repair/rmap.c b/repair/rmap.c
index 1851742..e30e99b 100644
--- a/repair/rmap.c
+++ b/repair/rmap.c
@@ -230,6 +230,32 @@ __add_raw_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.
  */
 int
diff --git a/repair/rmap.h b/repair/rmap.h
index ca92623..6a3a0a4 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 eb23685..6157d71 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])) {

<Prev in Thread] Current Thread [Next in Thread>