diff mbox series

[v2] btrfs: test delayed subvolume deletion on mount and remount

Message ID 89df93218c94b53dd44b12daaeb65fd0e6117392.1615912196.git.fdmanana@suse.com (mailing list archive)
State New, archived
Headers show
Series [v2] btrfs: test delayed subvolume deletion on mount and remount | expand

Commit Message

Filipe Manana March 16, 2021, 4:54 p.m. UTC
From: Filipe Manana <fdmanana@suse.com>

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 <fdmanana@suse.com>
---

V2: Updated test to actually check if the subvolume's btree is deleted
    and make it not racy by calling 'btrfs subvolume sync'.

 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 mbox series

Patch

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