Message ID | 37a3018160b04d127ec8eef1f1ccfb3583ce0e40.1729027883.git.boris@bur.io (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: add test for cleaner thread under seed-sprout | expand |
在 2024/10/16 08:03, Boris Burkov 写道: > We have a longstanding bug that creating a seed sprout fs with the > ro->rw transition done with > > mount -o remount,rw $mnt > > instead of > > umount $mnt > mount $sprout_dev $mnt > > results in an fs without BTRFS_FS_OPEN set, which fails to ever run the > critical btrfs cleaner thread. > > This test reproduces that bug and detects it by creating and deleting a > subvolume, then triggering the cleaner thread. The expected behavior is > for the cleaner thread to delete the stale subvolume and for the list to > show no entries. Without the fix, we see a DELETED entry for the subvol. > > Signed-off-by: Boris Burkov <boris@bur.io> > --- > tests/btrfs/323 | 46 +++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/323.out | 2 ++ > 2 files changed, 48 insertions(+) > create mode 100755 tests/btrfs/323 > create mode 100644 tests/btrfs/323.out > > diff --git a/tests/btrfs/323 b/tests/btrfs/323 > new file mode 100755 > index 000000000..0aa45633b > --- /dev/null > +++ b/tests/btrfs/323 > @@ -0,0 +1,46 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (c) 2024 YOUR NAME HERE. All Rights Reserved. I guess "YOUR NAME HERE" is the new name of Meta. :) > +# > +# FS QA Test 323 > +# > +# Test that remounted seed/sprout device FS is fully functional. For example, that it can purge stale subvolumes. > +# > +. ./common/preamble > +_begin_fstest auto quick seed remount > + > +. ./common/filter > +_require_test I didn't see any usage of TEST_DEV nor TEST_MNT, you can drop this _require_test line. > +_require_command "$BTRFS_TUNE_PROG" btrfstune > +_require_scratch_dev_pool 2 > + > +_fixed_by_kernel_commit XXXXXXXX \ > + "btrfs: do not clear read-only when adding sprout device" > + > +_scratch_dev_pool_get 2 > +dev_seed=$(echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $1}') > +dev_sprout=$(echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}') > + > +# create a read-write fs based off a read-only seed device > +_mkfs_dev $dev_seed > +$BTRFS_TUNE_PROG -S 1 $dev_seed > +_mount $dev_seed $SCRATCH_MNT >>$seqres.full 2>&1 > +_btrfs device add -f $dev_sprout $SCRATCH_MNT >>$seqres.full > +_mount -o remount,rw $SCRATCH_MNT If we determine to keep the fs RO after sprouting, shouldn't we also check if the fs is still RO before the remount? Otherwise looks good to me. Thanks, Qu > + > +# do stuff in the seed/sprout fs > +_btrfs subvolume create $SCRATCH_MNT/subv > +_btrfs subvolume delete $SCRATCH_MNT/subv > + > +# trigger cleaner thread without remounting > +_btrfs filesystem sync $SCRATCH_MNT > + > +# expect no deleted subvolumes remaining > +$BTRFS_UTIL_PROG subvolume list -d $SCRATCH_MNT > + > +_scratch_dev_pool_put > + > +# success, all done > +echo "Silence is golden" > +status=0 > +exit > diff --git a/tests/btrfs/323.out b/tests/btrfs/323.out > new file mode 100644 > index 000000000..5dba9b5f0 > --- /dev/null > +++ b/tests/btrfs/323.out > @@ -0,0 +1,2 @@ > +QA output created by 323 > +Silence is golden
diff --git a/tests/btrfs/323 b/tests/btrfs/323 new file mode 100755 index 000000000..0aa45633b --- /dev/null +++ b/tests/btrfs/323 @@ -0,0 +1,46 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2024 YOUR NAME HERE. All Rights Reserved. +# +# FS QA Test 323 +# +# Test that remounted seed/sprout device FS is fully functional. For example, that it can purge stale subvolumes. +# +. ./common/preamble +_begin_fstest auto quick seed remount + +. ./common/filter +_require_test +_require_command "$BTRFS_TUNE_PROG" btrfstune +_require_scratch_dev_pool 2 + +_fixed_by_kernel_commit XXXXXXXX \ + "btrfs: do not clear read-only when adding sprout device" + +_scratch_dev_pool_get 2 +dev_seed=$(echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $1}') +dev_sprout=$(echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}') + +# create a read-write fs based off a read-only seed device +_mkfs_dev $dev_seed +$BTRFS_TUNE_PROG -S 1 $dev_seed +_mount $dev_seed $SCRATCH_MNT >>$seqres.full 2>&1 +_btrfs device add -f $dev_sprout $SCRATCH_MNT >>$seqres.full +_mount -o remount,rw $SCRATCH_MNT + +# do stuff in the seed/sprout fs +_btrfs subvolume create $SCRATCH_MNT/subv +_btrfs subvolume delete $SCRATCH_MNT/subv + +# trigger cleaner thread without remounting +_btrfs filesystem sync $SCRATCH_MNT + +# expect no deleted subvolumes remaining +$BTRFS_UTIL_PROG subvolume list -d $SCRATCH_MNT + +_scratch_dev_pool_put + +# success, all done +echo "Silence is golden" +status=0 +exit diff --git a/tests/btrfs/323.out b/tests/btrfs/323.out new file mode 100644 index 000000000..5dba9b5f0 --- /dev/null +++ b/tests/btrfs/323.out @@ -0,0 +1,2 @@ +QA output created by 323 +Silence is golden
We have a longstanding bug that creating a seed sprout fs with the ro->rw transition done with mount -o remount,rw $mnt instead of umount $mnt mount $sprout_dev $mnt results in an fs without BTRFS_FS_OPEN set, which fails to ever run the critical btrfs cleaner thread. This test reproduces that bug and detects it by creating and deleting a subvolume, then triggering the cleaner thread. The expected behavior is for the cleaner thread to delete the stale subvolume and for the list to show no entries. Without the fix, we see a DELETED entry for the subvol. Signed-off-by: Boris Burkov <boris@bur.io> --- tests/btrfs/323 | 46 +++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/323.out | 2 ++ 2 files changed, 48 insertions(+) create mode 100755 tests/btrfs/323 create mode 100644 tests/btrfs/323.out