@@ -131,6 +131,44 @@ _("couldn't allocate memory for incore realtime summary info.\n"));
}
}
+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,
@@ -203,9 +241,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;