| #! /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 |
| # |
| . ./common/preamble |
| _begin_fstest auto quick send |
| |
| # Override the default cleanup function. |
| _cleanup() |
| { |
| rm -fr $send_files_dir |
| rm -fr $tmp |
| } |
| |
| . ./common/filter |
| |
| _require_test |
| _require_scratch |
| _require_fssum |
| |
| send_files_dir=$TEST_DIR/btrfs-test-$seq |
| |
| 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 |
| |
| _btrfs subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 |
| run_check $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 |
| _btrfs send -f $send_files_dir/1.snap $SCRATCH_MNT/mysnap1 |
| |
| _scratch_unmount |
| _check_scratch_fs |
| |
| _scratch_mkfs >/dev/null 2>&1 |
| _scratch_mount |
| |
| _btrfs 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 |