]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: complain about free space only seen by one btree
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 10 Jul 2020 19:35:45 +0000 (15:35 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 10 Jul 2020 19:35:45 +0000 (15:35 -0400)
During the free space btree walk, scan_allocbt claims in a comment that
we'll catch FREE1 blocks (i.e. blocks that were seen by only one free
space btree) later.  This never happens, with the result that xfs_repair
in dry-run mode can return 0 on a filesystem with corrupt free space
btrees.

Found by fuzzing xfs/358 with numrecs = middlebit (or sub).

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
repair/phase4.c

index 8197db06c60af1713782882bd80cf3e72298ce4f..a43413c7442e5a0e5c3d5921f3c8750e256cdb1b 100644 (file)
@@ -306,6 +306,12 @@ phase4(xfs_mount_t *mp)
                for (j = ag_hdr_block; j < ag_end; j += blen)  {
                        bstate = get_bmap_ext(i, j, ag_end, &blen);
                        switch (bstate) {
+                       case XR_E_FREE1:
+                               if (no_modify)
+                                       do_warn(
+       _("free space (%u,%u-%u) only seen by one free space btree\n"),
+                                               i, j, j + blen - 1);
+                               break;
                        case XR_E_BAD_STATE:
                        default:
                                do_warn(
@@ -313,7 +319,6 @@ phase4(xfs_mount_t *mp)
                                        i, j);
                                /* fall through .. */
                        case XR_E_UNKNOWN:
-                       case XR_E_FREE1:
                        case XR_E_FREE:
                        case XR_E_INUSE:
                        case XR_E_INUSE_FS: