| #! /bin/bash |
| # 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 |
| # |
| #----------------------------------------------------------------------- |
| # Copyright (c) 2014 Filipe Manana. All Rights Reserved. |
| # |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation. |
| # |
| # This program is distributed in the hope that it would be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, write the Free Software Foundation, |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| #----------------------------------------------------------------------- |
| # |
| |
| 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 |
| _supported_os Linux |
| _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 |