From: Darrick J. Wong Date: Wed, 13 Nov 2024 01:36:58 +0000 (-0800) Subject: xfs/273: check thoroughness of the mappings X-Git-Tag: v2024.11.17~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=47aa187fb226189a95d26c55c6fc7328c7ebbec2;p=xfstests-dev.git xfs/273: check thoroughness of the mappings Enhance this test to make sure that there are no gaps in the fsmap records, and (especially) that they we report all the way to the end of the device. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Reviewed-by: Zorro Lang Signed-off-by: Zorro Lang --- diff --git a/tests/xfs/273 b/tests/xfs/273 index d7fb80c4..9f11540a 100755 --- a/tests/xfs/273 +++ b/tests/xfs/273 @@ -24,6 +24,8 @@ _require_scratch _require_populate_commands _require_xfs_io_command "fsmap" +_fixed_by_kernel_commit XXXXXXXXXXXXXX "xfs: fix off-by-one error in fsmap" + rm -f "$seqres.full" echo "Format and mount" @@ -37,6 +39,51 @@ cat $TEST_DIR/a $TEST_DIR/b >> $seqres.full diff -uw $TEST_DIR/a $TEST_DIR/b +# Do we have mappings for every sector on the device? +ddev_fsblocks=$(_xfs_statfs_field "$SCRATCH_MNT" geom.datablocks) +rtdev_fsblocks=$(_xfs_statfs_field "$SCRATCH_MNT" geom.rtblocks) +fsblock_bytes=$(_xfs_statfs_field "$SCRATCH_MNT" geom.bsize) + +ddev_daddrs=$((ddev_fsblocks * fsblock_bytes / 512)) +rtdev_daddrs=$((rtdev_fsblocks * fsblock_bytes / 512)) + +ddev_devno=$(stat -c '%t:%T' $SCRATCH_DEV) +if [ "$USE_EXTERNAL" = "yes" ] && [ -n "$SCRATCH_RTDEV" ]; then + rtdev_devno=$(stat -c '%t:%T' $SCRATCH_RTDEV) +fi + +$XFS_IO_PROG -c 'fsmap -m -n 65536' $SCRATCH_MNT | awk -F ',' \ + -v data_devno=$ddev_devno \ + -v rt_devno=$rtdev_devno \ + -v data_daddrs=$ddev_daddrs \ + -v rt_daddrs=$rtdev_daddrs \ +'BEGIN { + next_daddr[data_devno] = 0; + next_daddr[rt_devno] = 0; +} +{ + if ($1 == "EXT") + next + devno = sprintf("%x:%x", $2, $3); + if (devno != data_devno && devno != rt_devno) + next + + if (next_daddr[devno] < $4) + printf("%sh: expected daddr %d, saw \"%s\"\n", devno, + next_daddr[devno], $0); + n = $5 + 1; + if (n > next_daddr[devno]) + next_daddr[devno] = n; +} +END { + if (data_daddrs != next_daddr[data_devno]) + printf("%sh: fsmap stops at %d, expected %d\n", + data_devno, next_daddr[data_devno], data_daddrs); + if (rt_devno != "" && rt_daddrs != next_daddr[rt_devno]) + printf("%sh: fsmap stops at %d, expected %d\n", + rt_devno, next_daddr[rt_devno], rt_daddrs); +}' + # success, all done status=0 exit