#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2014 Filipe Manana. All Rights Reserved. # # FS QA Test No. btrfs/050 # # Regression for btrfs send when an inode only has extended references # associated to it (no regular references present). This used to cause # incorrect access to a b+tree leaf, where an extended reference item # was accessed as if it were a regular reference item, causing unexpected # and unpredictable behaviour such as producing a random/weird path string # or a crash. # # This issue is fixed by the following linux kernel btrfs patch: # # Btrfs: send, fix incorrect ref access when using extrefs # 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() { rm -fr $send_files_dir rm -fr $tmp } # get standard environment, filters and checks . ./common/rc . ./common/filter # real QA test starts here _supported_fs btrfs _require_test _require_scratch _require_fssum send_files_dir=$TEST_DIR/btrfs-test-$seq rm -f $seqres.full rm -fr $send_files_dir mkdir $send_files_dir _scratch_mkfs "-O extref" >/dev/null 2>&1 _scratch_mount # 2550 hard links is enough to cause creation of extended references # even if the leaf/node size is 64Kb (largest possible). NUM_LINKS=2550 TEST_PATH=$SCRATCH_MNT/home/john/files/series/qwerty mkdir -p $TEST_PATH touch $TEST_PATH/foobar # Create a bunch of hard links for the file, such that at least one # inode extended reference item is created. for i in `seq 1 $NUM_LINKS`; do ln $TEST_PATH/foobar $TEST_PATH/foobar_link_`printf "%04d" $i` done # The only link we'll have alive at the end. ln $TEST_PATH/foobar $TEST_PATH/final_foobar_name # Now delete all previous hard links (except the last one). This will # remove the regular inode reference item from the b+tree, and will # leave only an inode extended reference item, which is the condition # necessary to trigger the bug. rm -f $TEST_PATH/foobar for i in `seq 1 $NUM_LINKS`; do rm -f $TEST_PATH/foobar_link_`printf "%04d" $i` done _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 run_check $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 _run_btrfs_util_prog send -f $send_files_dir/1.snap $SCRATCH_MNT/mysnap1 _scratch_unmount _check_scratch_fs _scratch_mkfs >/dev/null 2>&1 _scratch_mount _run_btrfs_util_prog receive -f $send_files_dir/1.snap $SCRATCH_MNT run_check $FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 status=0 exit