]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_repair: improve rtbitmap discrepancy reporting
authorDarrick J. Wong <djwong@kernel.org>
Mon, 19 Sep 2022 16:49:44 +0000 (09:49 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:34 +0000 (15:03 -0800)
Improve the reporting of discrepancies in the realtime bitmap and
summary files by creating a separate helper function that will pinpoint
the exact (word) locations of mismatches.  This will help developers to
diagnose problems with the rtgroups feature and users to figure out
exactly what's bad in a filesystem.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
repair/rt.c

index 5576511e7a0a76b0972fcf16f3e51c049ed6c316..f73760e9cc92db7cdacc00da4d0e8feb67076645 100644 (file)
@@ -150,6 +150,44 @@ generate_rtinfo(
        return(0);
 }
 
+static void
+check_rtwords(
+       struct xfs_mount        *mp,
+       const char              *filename,
+       unsigned long long      bno,
+       void                    *ondisk,
+       void                    *incore)
+{
+       unsigned int            wordcnt = mp->m_blockwsize;
+       union xfs_rtword_raw    *o = ondisk, *i = incore;
+       int                     badstart = -1;
+       unsigned int            j;
+
+       if (memcmp(ondisk, incore, wordcnt << XFS_WORDLOG) == 0)
+               return;
+
+       for (j = 0; j < wordcnt; j++, o++, i++) {
+               if (o->old == i->old) {
+                       /* Report a range of inconsistency that just ended. */
+                       if (badstart >= 0)
+                               do_warn(
+ _("discrepancy in %s at dblock 0x%llx words 0x%x-0x%x/0x%x\n"),
+                                       filename, bno, badstart, j - 1, wordcnt);
+                       badstart = -1;
+                       continue;
+               }
+
+               if (badstart == -1)
+                       badstart = j;
+       }
+
+       if (badstart >= 0)
+               do_warn(
+ _("discrepancy in %s at dblock 0x%llx words 0x%x-0x%x/0x%x\n"),
+                                       filename, bno, badstart, wordcnt,
+                                       wordcnt);
+}
+
 static void
 check_rtfile_contents(
        struct xfs_mount        *mp,
@@ -206,9 +244,7 @@ check_rtfile_contents(
                        break;
                }
 
-               if (memcmp(bp->b_addr, buf, mp->m_blockwsize << XFS_WORDLOG))
-                       do_warn(_("discrepancy in %s at dblock 0x%llx\n"),
-                                       filename, (unsigned long long)bno);
+               check_rtwords(mp, filename, bno, bp->b_addr, buf);
 
                buf += XFS_FSB_TO_B(mp, map.br_blockcount);
                bno += map.br_blockcount;