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>
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(
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: