From 40f8dc416af3649fa1fe285c14f450f93e898780 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Tue, 16 Mar 2021 16:54:28 +0000 Subject: [PATCH] btrfs: test delayed subvolume deletion on mount and remount Test that subvolume deletion is resumed on RW mounts, that it is not performed on RO mounts and that after remounting a filesystem from RO to RW mode, it is also performed. This triggers a regression introduced in kernel 5.11 which is fixed by a patch that has the following subject: "btrfs: fix subvolume/snapshot deletion not triggered on mount" Signed-off-by: Filipe Manana Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- tests/btrfs/233 | 152 ++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/233.out | 5 ++ tests/btrfs/group | 1 + 3 files changed, 158 insertions(+) create mode 100755 tests/btrfs/233 create mode 100644 tests/btrfs/233.out diff --git a/tests/btrfs/233 b/tests/btrfs/233 new file mode 100755 index 00000000..10e77358 --- /dev/null +++ b/tests/btrfs/233 @@ -0,0 +1,152 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2021 SUSE Linux Products GmbH. All Rights Reserved. +# +# FSQA Test No. 233 +# +# Test that subvolume deletion is resumed on RW mounts, that it is not performed +# on RO mounts and that after remounting a filesystem from RO to RW mode, it is +# performed. +# +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + _cleanup_flakey + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmflakey + +# real QA test starts here +_supported_fs btrfs +_require_scratch +_require_dm_target flakey +_require_btrfs_command inspect-internal dump-tree + +rm -f $seqres.full + +_scratch_mkfs >>$seqres.full 2>&1 +_require_metadata_journaling $SCRATCH_DEV +_init_flakey +_mount_flakey + +check_subvol_orphan_item_exists() +{ + # Check that the orphan item for our subvolume exists in the root tree. + $BTRFS_UTIL_PROG inspect-internal dump-tree -t 1 $SCRATCH_DEV | \ + grep -q 'ORPHAN ORPHAN_ITEM 256' + [ $? -ne 0 ] && echo "subvolume orphan item is missing" +} + +check_subvol_orphan_item_not_exists() +{ + # Check that the orphan item for our subvolume does not exists in the + # root tree. + $BTRFS_UTIL_PROG inspect-internal dump-tree -t 1 $SCRATCH_DEV | \ + grep -q 'ORPHAN ORPHAN_ITEM 256' + [ $? -eq 0 ] && echo "subvolume orphan item still exists" +} + +check_subvol_btree_exists() +{ + $BTRFS_UTIL_PROG inspect-internal dump-tree $SCRATCH_DEV | \ + grep -q 'file tree key (256 ROOT_ITEM 0)' + [ $? -ne 0 ] && echo "subvolume btree is missing" +} + +check_subvol_btree_not_exists() +{ + $BTRFS_UTIL_PROG inspect-internal dump-tree $SCRATCH_DEV | \ + grep -q 'file tree key (256 ROOT_ITEM 0)' + [ $? -eq 0 ] && echo "subvolume btree still exists" +} + +create_subvol_with_orphan() +{ + $BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/testsv | _filter_scratch + + # Create a file in our subvolume and make it durably persisted. + touch $SCRATCH_MNT/testsv/foobar + sync + + # Now open a file descriptor on the file and, while holding the file + # open, delete the subvolume, then 'sync' to durably persist the orphan + # item for the subvolume. + exec 73< $SCRATCH_MNT/testsv/foobar + $BTRFS_UTIL_PROG subvolume delete $SCRATCH_MNT/testsv | _filter_scratch + sync + + # Now silently drop writes on the device, close the file descriptor and + # unmount the filesystem. After this we should have an orphan item in + # root tree for the subvolume, so that its tree is deleted on the next + # RW mount. + _load_flakey_table $FLAKEY_DROP_WRITES + exec 73>&- + _unmount_flakey + + check_subvol_orphan_item_exists + check_subvol_btree_exists + + _load_flakey_table $FLAKEY_ALLOW_WRITES +} + +create_subvol_with_orphan + +# Mount the filesystem in RW mode and unmount it. After that, the subvolume +# and its orphan item should not exist anymore. +# Use a commit interval lower than the default (30 seconds) so that the test +# is faster and we spend less time waiting for transaction commits. +MOUNT_OPTIONS="-o commit=1" +_mount_flakey +$BTRFS_UTIL_PROG subvolume sync $SCRATCH_MNT >>$seqres.full +_unmount_flakey + +check_subvol_orphan_item_not_exists +check_subvol_btree_not_exists + +# Now lets check a RO mount does not trigger subvolume deletion. +_cleanup_flakey +_scratch_mkfs >>$seqres.full 2>&1 +_init_flakey +_mount_flakey + +create_subvol_with_orphan +MOUNT_OPTIONS="-o ro,commit=1" +_mount_flakey +# The subvolume path should not be accessible anymore, even if deletion of the +# subvolume btree did not happen yet. +[ -e $SCRATCH_MNT/testsv ] && echo "subvolume path still exists" +_unmount_flakey + +# The subvolume btree should still exist, even though the path is not accessible. +check_subvol_btree_exists +# The orphan item for the subvolume should still exist, as the subvolume btree +# was not yet deleted. +check_subvol_orphan_item_exists + +# Mount the filesystem RO again. +_mount_flakey + +# Now remount RW, then unmount and then check the subvolume's orphan item, btree +# and path don't exist anymore. +MOUNT_OPTIONS="-o remount,rw" +_mount_flakey +$BTRFS_UTIL_PROG subvolume sync $SCRATCH_MNT >>$seqres.full +[ -e $SCRATCH_MNT/testsv ] && echo "subvolume path still exists" +_unmount_flakey + +check_subvol_orphan_item_not_exists +check_subvol_btree_not_exists + +status=0 +exit diff --git a/tests/btrfs/233.out b/tests/btrfs/233.out new file mode 100644 index 00000000..492e959d --- /dev/null +++ b/tests/btrfs/233.out @@ -0,0 +1,5 @@ +QA output created by 233 +Create subvolume 'SCRATCH_MNT/testsv' +Delete subvolume (no-commit): 'SCRATCH_MNT/testsv' +Create subvolume 'SCRATCH_MNT/testsv' +Delete subvolume (no-commit): 'SCRATCH_MNT/testsv' diff --git a/tests/btrfs/group b/tests/btrfs/group index c0d7a53c..5214dbdb 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -235,3 +235,4 @@ 230 auto quick qgroup limit 231 auto quick clone log replay 232 auto quick qgroup limit +233 auto quick subvolume -- 2.30.2