On Sat, Dec 11, 2021 at 02:14:41AM +0800, Anand Jain wrote: > Recreating a new filesystem or adding a device to a mounted the filesystem > should remove the device entries under its previous fsid even when > confused with different device paths to the same device. > > Fixed by the kernel patch (in the ml): > btrfs: harden identification of the stale device > > Signed-off-by: Anand Jain <anand.jain@xxxxxxxxxx> I was testing with v5.16-rc2 kernel, which should not contain the kernel fix, but test still passed for me, I was testing with three loop devices as SCRATCH_DEV_POOL, and all default mkfs & mount options SECTION -- btrfs RECREATING -- btrfs on /dev/mapper/testvg-lv1 FSTYP -- btrfs PLATFORM -- Linux/x86_64 fedoravm 5.16.0-rc2 #22 SMP PREEMPT Mon Nov 29 00:54:26 CST 2021 MKFS_OPTIONS -- /dev/loop0 MOUNT_OPTIONS -- /dev/loop0 /mnt/scratch btrfs/254 5s ... 5s Ran: btrfs/254 Passed all 1 tests Anything wrong with my setup? And if tested with lv devices as SCRATCH_DEV_POOL SCRATCH_DEV_POOL="/dev/mapper/testvg-lv2 /dev/mapper/testvg-lv3 /dev/mapper/testvg-lv4 /dev/mapper/testvg-lv5 /dev/mapper/testvg-lv6" I got the following test failure QA output created by 254 +ERROR: cannot unregister device '/dev/mapper/254-test': No such file or directory Label: none uuid: <UUID> Total devices <NUM> FS bytes used <SIZE> devid <DEVID> size <SIZE> used <SIZE> path SCRATCH_DEV Maybe we should use _require_scratch_nolvm as well? > --- > v2: Add kernel patch title in the test case > Redirect device add output to /dev/null (avoids tirm message) > Use the lv path for mkfs and the dm path for the device add > so that now path used in udev scan should match with what > we already have in the kernel memory. > > - _mkfs_dev $uuid -draid1 -mraid1 $dmdev $scratch_dev2 > + _mkfs_dev $uuid -draid1 -mraid1 $lvdev $scratch_dev2 > > # Add device should free the device under $uuid in the kernel. > - $BTRFS_UTIL_PROG device add -f $lvdev $seq_mnt > /dev/null 2>&1 > + $BTRFS_UTIL_PROG device add -f $dmdev $seq_mnt > /dev/null 2>&1 > > > tests/btrfs/254 | 113 ++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/254.out | 6 +++ > 2 files changed, 119 insertions(+) > create mode 100755 tests/btrfs/254 > create mode 100644 tests/btrfs/254.out > > diff --git a/tests/btrfs/254 b/tests/btrfs/254 > new file mode 100755 > index 000000000000..b70b9d165897 > --- /dev/null > +++ b/tests/btrfs/254 > @@ -0,0 +1,113 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (c) 2021 Anand Jain. All Rights Reserved. > +# Copyright (c) 2021 Oracle. All Rights Reserved. > +# > +# FS QA Test No. 254 > +# > +# Test if the kernel can free the stale device entries. > +# > +# Tests bug fixed by the kernel patch: > +# btrfs: harden identification of the stale device > +# > +. ./common/preamble > +_begin_fstest auto quick > + > +# Override the default cleanup function. > +node=$seq-test > +cleanup_dmdev() > +{ > + _dmsetup_remove $node > +} > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > + rm -rf $seq_mnt > /dev/null 2>&1 > + cleanup_dmdev Should wipefs in cleanup as well, otherwise test fails with non-unique UUID -Label: none uuid: <UUID> - Total devices <NUM> FS bytes used <SIZE> - devid <DEVID> size <SIZE> used <SIZE> path SCRATCH_DEV - *** Some devices missing +ERROR: non-unique UUID: 12345678-1234-1234-1234-123456789abc +btrfs-progs v5.4 +See http://btrfs.wiki.kernel.org for more information. Thanks, Eryu > +} > + > +# Import common functions. > +. ./common/filter > +. ./common/filter.btrfs > + > +# real QA test starts here > +_supported_fs btrfs > +_require_scratch_dev_pool 3 > +_require_block_device $SCRATCH_DEV > +_require_dm_target linear > +_require_btrfs_forget_or_module_loadable > +_require_scratch_nocheck > +_require_command "$WIPEFS_PROG" wipefs > + > +_scratch_dev_pool_get 3 > + > +setup_dmdev() > +{ > + # Some small size. > + size=$((1024 * 1024 * 1024)) > + size_in_sector=$((size / 512)) > + > + table="0 $size_in_sector linear $SCRATCH_DEV 0" > + _dmsetup_create $node --table "$table" || \ > + _fail "setup dm device failed" > +} > + > +# Use a known it is much easier to debug. > +uuid="--uuid 12345678-1234-1234-1234-123456789abc" > +lvdev=/dev/mapper/$node > + > +seq_mnt=$TEST_DIR/$seq.mnt > +mkdir -p $seq_mnt > + > +test_forget() > +{ > + setup_dmdev > + dmdev=$(realpath $lvdev) > + > + _mkfs_dev $uuid $dmdev > + > + # Check if we can un-scan using the mapper device path. > + $BTRFS_UTIL_PROG device scan --forget $lvdev > + > + # Cleanup > + $WIPEFS_PROG -a $lvdev > /dev/null 2>&1 > + $BTRFS_UTIL_PROG device scan --forget > + > + cleanup_dmdev > +} > + > +test_add_device() > +{ > + setup_dmdev > + dmdev=$(realpath $lvdev) > + scratch_dev2=$(echo $SCRATCH_DEV_POOL | awk '{print $2}') > + scratch_dev3=$(echo $SCRATCH_DEV_POOL | awk '{print $3}') > + > + _mkfs_dev $scratch_dev3 > + _mount $scratch_dev3 $seq_mnt > + > + _mkfs_dev $uuid -draid1 -mraid1 $lvdev $scratch_dev2 > + > + # Add device should free the device under $uuid in the kernel. > + $BTRFS_UTIL_PROG device add -f $dmdev $seq_mnt > /dev/null 2>&1 > + > + _mount -o degraded $scratch_dev2 $SCRATCH_MNT > + > + # Check if the missing device is shown. > + $BTRFS_UTIL_PROG filesystem show -m $SCRATCH_MNT | \ > + _filter_btrfs_filesystem_show > + > + $UMOUNT_PROG $seq_mnt > + _scratch_unmount > + cleanup_dmdev > +} > + > +test_forget > +test_add_device > + > +_scratch_dev_pool_put > + > +status=0 > +exit > diff --git a/tests/btrfs/254.out b/tests/btrfs/254.out > new file mode 100644 > index 000000000000..20819cf5140c > --- /dev/null > +++ b/tests/btrfs/254.out > @@ -0,0 +1,6 @@ > +QA output created by 254 > +Label: none uuid: <UUID> > + Total devices <NUM> FS bytes used <SIZE> > + devid <DEVID> size <SIZE> used <SIZE> path SCRATCH_DEV > + *** Some devices missing > + > -- > 2.27.0