#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # # FS QA Test 201 # # Regression test for fix "btrfs: fix invalid removal of root ref" # . ./common/preamble _begin_fstest auto quick subvol snapshot . ./common/filter _supported_fs btrfs _require_scratch _scratch_mkfs >> $seqres.full 2>&1 _scratch_mount # Create a subvol b under a and then snapshot a into c. This create's a stub # entry in c for b because c doesn't have a reference for b. # # But when we rename b c/foo it creates a ref for b in c. However if we go to # remove c/b btrfs used to depend on not finding the root ref to handle the # unlink properly, but we now have a ref for that root. We also had a bug that # would allow us to remove mis-matched refs if the keys matched, so we'd end up # removing too many entries which would cause a transaction abort. $BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/a | _filter_scratch $BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/a/b | _filter_scratch _btrfs subvolume snapshot $SCRATCH_MNT/a $SCRATCH_MNT/c # Need the dummy entry created so that we get the invalid removal when we rmdir ls $SCRATCH_MNT/c/b mkdir $SCRATCH_MNT/c/foo mv $SCRATCH_MNT/a/b $SCRATCH_MNT/c/foo rm -rf $SCRATCH_MNT/* touch $SCRATCH_MNT/blah status=0 exit