| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2015 SUSE. All Rights Reserved. |
| # |
| # FS QA Test No. btrfs/085 |
| # |
| # Tests to ensure that orphan items are properly created and cleaned up |
| # on next mount. |
| # |
| # There are three cases where orphan items may be cleaned up: |
| # 1) Default subvolume is fs tree root (mkfs default) |
| # 2) Default subvolume is explicitly created subvolume |
| # (i.e. btrfs subvol set-default) |
| # 3) Non-default subvolume lookup |
| # |
| seq=`basename $0` |
| seqres=$RESULT_DIR/$seq |
| echo "QA output created by $seq" |
| |
| here=`pwd` |
| tmp=/tmp/$$ |
| status=1 # failure is the default! |
| |
| _cleanup() |
| { |
| _cleanup_flakey |
| rm -f $tmp.* |
| } |
| |
| trap "_cleanup ; exit \$status" 0 1 2 3 15 |
| |
| # 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 |
| |
| has_orphan_item() |
| { |
| INO=$1 |
| if $BTRFS_UTIL_PROG inspect-internal dump-tree $FLAKEY_DEV | \ |
| grep -q "key (ORPHAN ORPHAN_ITEM $INO)"; then |
| return 0 |
| fi |
| return 1 |
| } |
| |
| test_orphan() |
| { |
| PRECMD=$1 |
| SUB=0 |
| |
| _scratch_mkfs >> $seqres.full 2>&1 |
| _init_flakey |
| |
| _mount_flakey |
| |
| $PRECMD |
| |
| TESTPATH=$SCRATCH_MNT/testdir/testfile |
| DIR=$(dirname $TESTPATH) |
| |
| [ -d "$DIR" ] || mkdir -p $DIR |
| |
| SIZE=$(( 1024 * 1024 )) |
| run_check dd if=/dev/zero of=$TESTPATH bs=$SIZE count=1 |
| |
| INO=$(stat -c %i $TESTPATH) |
| |
| # Orphan item won't be created if the file doesn't make it to disk |
| sync |
| |
| # Open and delete the file |
| exec 27<$TESTPATH |
| rm -f $TESTPATH |
| |
| # Ensure the unlink (and orphan item creation) hits the disk |
| sync |
| |
| # Turn off writes before closing so the orphan item will be left behind |
| _load_flakey_table $FLAKEY_DROP_WRITES |
| |
| # Close the file so we can umount |
| exec 27>&- |
| |
| # Orphan item should be on disk if operating correctly |
| _unmount_flakey |
| _load_flakey_table $FLAKEY_ALLOW_WRITES |
| if ! has_orphan_item $INO; then |
| echo "ERROR: No orphan item found after umount." |
| return |
| fi |
| _mount_flakey |
| |
| # If $DIR is a subvolume, this will cause a lookup and orphan cleanup |
| (cd $DIR; true) |
| |
| # Orphan item will be cleaned up during mount but won't be on |
| # disk until there's a sync. |
| sync |
| |
| _unmount_flakey |
| if has_orphan_item $INO; then |
| echo "ERROR: Orphan item found after successful mount/sync." |
| fi |
| _cleanup_flakey |
| } |
| |
| new_subvolume() |
| { |
| _run_btrfs_util_prog subvolume create $SCRATCH_MNT/testdir |
| } |
| |
| new_default() |
| { |
| new_subvolume |
| SUB=$($BTRFS_UTIL_PROG subvolume list $SCRATCH_MNT |awk '{print $2}') |
| _run_btrfs_util_prog subvolume set-default $SUB $SCRATCH_MNT |
| |
| _unmount_flakey |
| _mount_flakey |
| } |
| |
| echo "Testing with fs root as default subvolume" |
| test_orphan true |
| |
| echo "Testing with explicit default subvolume" |
| test_orphan new_default |
| |
| echo "Testing with orphan on non-default subvolume" |
| test_orphan new_subvolume |
| |
| status=0 |
| exit |