From: Qu Wenruo Date: Tue, 13 May 2025 23:03:01 +0000 (+0930) Subject: fstests: btrfs/020: use device pool to avoid busy TEST_DEV X-Git-Tag: v2025.05.25~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=22cc9e29bdf8ead5aeac4bdfa37572ae56add16c;p=xfstests-dev.git fstests: btrfs/020: use device pool to avoid busy TEST_DEV [BUG] There is an internal report about btrfs/020 failure, the 020.full looks like this: ERROR: ioctl(DEV_REPLACE_START) failed on "/opt/test/020.5968.mnt": Read-only file system Performing full device TRIM /dev/loop8 (256.00MiB) ... _check_btrfs_filesystem: filesystem on /dev/loop0 is inconsistent *** fsck.btrfs output *** ERROR: /dev/loop0 is currently mounted, use --force if you really intend to check the filesystem Opening filesystem to check... *** end fsck.btrfs output *** mount output *** [...] /dev/loop0 on /opt/test type btrfs (rw,relatime,seclabel,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/) *** end mount output [CAUSE] Unfortunately I can not reproduce the situation here, but it looks like by somehow we didn't unmount the TEST_DEV before checking it. This may or may not be caused by the fact we're using loop back devices on TEST_MNT. [FIX] For this particluar test case, we really do not need to use TEST_MNT and create complex loopback devices. We can just ask for 3 devices from the device pool, use 2 for the raid1 fs, and then use the spare one for dev replace. This should greately simplify the test case setup and cleanup, thus avoid the above busy TEST_DEV and false test failure. Furthermore use the golden output to match the error message, and since we're here also handle a bug in btrfs-progs where the error message is incorrectly split into two lines. Signed-off-by: Qu Wenruo Reviewed-by: Anand Jain Signed-off-by: Anand Jain --- diff --git a/tests/btrfs/020 b/tests/btrfs/020 index 4e3e2cc4..9c961c54 100755 --- a/tests/btrfs/020 +++ b/tests/btrfs/020 @@ -12,44 +12,29 @@ . ./common/preamble _begin_fstest auto quick replace volume raid -# Override the default cleanup function. -_cleanup() -{ - cd / - rm -f $tmp.* - $UMOUNT_PROG $loop_mnt - _destroy_loop_device $loop_dev1 - losetup -d $loop_dev2 >/dev/null 2>&1 - _destroy_loop_device $loop_dev3 - rm -rf $loop_mnt - rm -f $fs_img1 $fs_img2 $fs_img3 -} - . ./common/filter -_require_test -_require_loop - -echo "Silence is golden" +_require_scratch_dev_pool 3 -loop_mnt=$TEST_DIR/$seq.$$.mnt -fs_img1=$TEST_DIR/$seq.$$.img1 -fs_img2=$TEST_DIR/$seq.$$.img2 -fs_img3=$TEST_DIR/$seq.$$.img3 -mkdir $loop_mnt -$XFS_IO_PROG -f -c "truncate 256m" $fs_img1 >>$seqres.full 2>&1 -$XFS_IO_PROG -f -c "truncate 256m" $fs_img2 >>$seqres.full 2>&1 -$XFS_IO_PROG -f -c "truncate 256m" $fs_img3 >>$seqres.full 2>&1 +_fixed_by_kernel_commit bbb651e469d9 \ + "Btrfs: don't allow the replace procedure on read only filesystems" -loop_dev1=`_create_loop_device $fs_img1` -loop_dev2=`_create_loop_device $fs_img2` -loop_dev3=`_create_loop_device $fs_img3` +_scratch_dev_pool_get 2 +_spare_dev_get -_mkfs_dev -m raid1 -d raid1 $loop_dev1 $loop_dev2 >>$seqres.full 2>&1 -_mount -o ro $loop_dev1 $loop_mnt +_scratch_pool_mkfs -m raid1 -d raid1 >> $seqres.full 2>&1 +_scratch_mount -o ro -$BTRFS_UTIL_PROG replace start -B 2 $loop_dev3 $loop_mnt >>$seqres.full 2>&1 && \ -_fail "FAIL: Device replaced on RO btrfs" +# The replace is expected to fail. +# +# There is an unexpected newline at the middle of the error message, filter it out +# to handle older progs (unexpected new line) and newer ones (new line removed). +$BTRFS_UTIL_PROG replace start -B 2 $SPARE_DEV $SCRATCH_MNT 2>&1 >> $seqres.full | \ + sed -e "/^$/d" | _filter_scratch + +_scratch_unmount +_spare_dev_put +_scratch_dev_pool_put status=0 exit diff --git a/tests/btrfs/020.out b/tests/btrfs/020.out index 20d7944e..a3ede235 100644 --- a/tests/btrfs/020.out +++ b/tests/btrfs/020.out @@ -1,2 +1,2 @@ QA output created by 020 -Silence is golden +ERROR: ioctl(DEV_REPLACE_START) failed on "SCRATCH_MNT": Read-only file system