#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2014 Filipe Manana. All Rights Reserved. # # FS QA Test No. btrfs/041 # # Test that btrfs-progs' restore command is able to correctly recover files # that have compressed extents, specially when the respective file extent # items have a non-zero data offset field. # # This issue is fixed by the following btrfs-progs patch: # # Btrfs-progs: fix restore of files with compressed extents # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 restore_dir=$TEST_DIR/btrfs-test-$seq _cleanup() { rm -fr $tmp rm -fr $restore_dir } # 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 rm -f $seqres.full mkdir $restore_dir test_btrfs_restore() { if [ -z $1 ] then OPTIONS="" else OPTIONS="-o compress-force=$1" fi _scratch_mkfs >/dev/null 2>&1 _scratch_mount $OPTIONS # Create first file extent item, then fsync to make sure the next write # won't end up in the same file extent item, so that we have 2 distinct # file extent items. $XFS_IO_PROG -f -c "pwrite -S 0xff -b 100000 0 100000" -c "fsync" \ $SCRATCH_MNT/foo | _filter_xfs_io # This creates a second file extent item. $XFS_IO_PROG -c "pwrite -S 0xaa -b 100000 100000 100000" -c "fsync" \ $SCRATCH_MNT/foo | _filter_xfs_io # Now do a few writes that will cause the first extent item to be split, # with some of the new smaller file extent items getting a data offset # field different from 0. $XFS_IO_PROG -c "pwrite -S 0x1e -b 2 10000 2" $SCRATCH_MNT/foo \ | _filter_xfs_io $XFS_IO_PROG -c "pwrite -S 0xd0 -b 11 33000 11" $SCRATCH_MNT/foo \ | _filter_xfs_io $XFS_IO_PROG -c "pwrite -S 0xbc -b 100 99000 100" $SCRATCH_MNT/foo \ | _filter_xfs_io md5sum $SCRATCH_MNT/foo | _filter_scratch _scratch_unmount rm -f $restore_dir/foo # Now that the fs is unmounted, call btrfs restore to read the file # from disk and save it in the test directory. It used to incorrectly # read compressed file extents that have a non-zero data offset field, # resulting either in decompression failure or reading a wrong section # of the extent. _run_btrfs_util_prog restore $SCRATCH_DEV $restore_dir md5sum $restore_dir/foo | cut -d ' ' -f 1 } echo "Testing restore of file compressed with lzo" test_btrfs_restore "lzo" echo "Testing restore of file compressed with zlib" test_btrfs_restore "zlib" echo "Testing restore of file without any compression" test_btrfs_restore status=0 exit