]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: report ranges of invalid rt blocks
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 20 Nov 2020 22:03:29 +0000 (17:03 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 20 Nov 2020 22:03:29 +0000 (17:03 -0500)
Copy-pasta the block range reporting code from check_range into
check_rrange so that we don't flood stdout with a ton of low value
messages when a bit flips somewhere in rt metadata.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/check.c

index ce6be889c32dcf9afdd954a9d82e83ed2a958679..33736e33e833fdec8872362614973ec8671b98ec 100644 (file)
@@ -1569,19 +1569,46 @@ check_rootdir(void)
        }
 }
 
+static inline void
+report_rrange(
+       xfs_rfsblock_t  low,
+       xfs_rfsblock_t  high)
+{
+       if (low == high)
+               dbprintf(_("rtblock %llu out of range\n"), low);
+       else
+               dbprintf(_("rtblocks %llu..%llu out of range\n"), low, high);
+}
+
 static int
 check_rrange(
        xfs_rfsblock_t  bno,
        xfs_extlen_t    len)
 {
        xfs_extlen_t    i;
+       xfs_rfsblock_t  low = 0;
+       xfs_rfsblock_t  high = 0;
+       bool            valid_range = false;
+       int             cur, prev = 0;
 
        if (bno + len - 1 >= mp->m_sb.sb_rblocks) {
                for (i = 0; i < len; i++) {
-                       if (!sflag || CHECK_BLIST(bno + i))
-                               dbprintf(_("rtblock %llu out of range\n"),
-                                       bno + i);
+                       cur = !sflag || CHECK_BLIST(bno + i) ? 1 : 0;
+                       if (cur == 1 && prev == 0) {
+                               low = high = bno + i;
+                               valid_range = true;
+                       } else if (cur == 0 && prev == 0) {
+                               /* Do nothing */
+                       } else if (cur == 0 && prev == 1) {
+                               report_rrange(low, high);
+                               valid_range = false;
+                       } else if (cur == 1 && prev == 1) {
+                               high = bno + i;
+                       }
+                       prev = cur;
                }
+               if (valid_range)
+                       report_rrange(low, high);
                error++;
                return 0;
        }