diff options
Diffstat (limited to 'tests')
28 files changed, 327 insertions, 13 deletions
diff --git a/tests/convert-tests.sh b/tests/convert-tests.sh index 4d99a61..b26c069 100755 --- a/tests/convert-tests.sh +++ b/tests/convert-tests.sh @@ -26,9 +26,9 @@ convert_test() { shift if [ -z "$features" ]; then - echo " [TEST] $1, btrfs defaults" + echo " [TEST/conv] $1, btrfs defaults" else - echo " [TEST] $1, btrfs $features" + echo " [TEST/conv] $1, btrfs $features" fi nodesize=$2 shift 2 @@ -52,7 +52,7 @@ convert_test() { } if ! [ -z "$TEST" ]; then - echo " [TEST] skipped all convert tests, TEST=$TEST" + echo " [TEST/conv] skipped all convert tests, TEST=$TEST" exit 0 fi diff --git a/tests/fsck-tests.sh b/tests/fsck-tests.sh index b910e85..2aab4ff 100755 --- a/tests/fsck-tests.sh +++ b/tests/fsck-tests.sh @@ -32,7 +32,7 @@ run_one_test() { local testname testname="$1" - echo " [TEST] $(basename $testname)" + echo " [TEST/fsck] $(basename $testname)" cd $testname echo "=== Entering $testname" >> $RESULTS if [ -x test.sh ]; then diff --git a/tests/fsck-tests/006-bad-root-items/test.sh b/tests/fsck-tests/006-bad-root-items/test.sh index 421e225..8433234 100755 --- a/tests/fsck-tests/006-bad-root-items/test.sh +++ b/tests/fsck-tests/006-bad-root-items/test.sh @@ -2,6 +2,8 @@ source $TOP/tests/common +check_prereq btrfs + echo "extracting image default_case.tar.xz" >> $RESULTS tar --no-same-owner -xJf default_case.tar.xz || \ _fail "failed to extract default_case.tar.xz" diff --git a/tests/fsck-tests/012-leaf-corruption/no_data_extent.tar.xz b/tests/fsck-tests/012-leaf-corruption/no_data_extent.tar.xz Binary files differindex cc90b58..547e545 100644 --- a/tests/fsck-tests/012-leaf-corruption/no_data_extent.tar.xz +++ b/tests/fsck-tests/012-leaf-corruption/no_data_extent.tar.xz diff --git a/tests/fsck-tests/012-leaf-corruption/test.sh b/tests/fsck-tests/012-leaf-corruption/test.sh index 6e23145..a308727 100755 --- a/tests/fsck-tests/012-leaf-corruption/test.sh +++ b/tests/fsck-tests/012-leaf-corruption/test.sh @@ -2,6 +2,8 @@ source $TOP/tests/common +check_prereq btrfs-image + # Check file list for leaf corruption, no regular/preallocated # file extent case. # Corrupted leaf is 20832256, which contains inode 1862~1872 @@ -29,6 +31,7 @@ leaf_no_data_ext_list=( 1869 0 40700 "snmp" 1871 0 100700 "machine-id" 1872 0 100700 "adjtime" + 1877 0 40700 "del" ) generate_leaf_corrupt_no_data_ext() @@ -40,10 +43,12 @@ generate_leaf_corrupt_no_data_ext() $TOP/btrfs-image -r test.img.btrfs-image $dest || \ _fail "failed to extract leaf_corrupt_no_data_ext.btrfs-image" - # leaf at 20832256 contains no regular data extent, clear its csum to - # corrupt the leaf. - dd if=/dev/zero of=$dest bs=1 count=32 conv=notrunc seek=20832256 \ - 1>/dev/null 2>&1 + # leaf at 4206592 and 20905984 contains no regular data + # extent, clear its csum to corrupt the leaf. + for x in 4206592 20905984; do + dd if=/dev/zero of=$dest bs=1 count=32 conv=notrunc seek=$x \ + 1>/dev/null 2>&1 + done } check_inode() diff --git a/tests/fsck-tests/013-extent-tree-rebuild/test.sh b/tests/fsck-tests/013-extent-tree-rebuild/test.sh index 7419d6e..ff7d28e 100755 --- a/tests/fsck-tests/013-extent-tree-rebuild/test.sh +++ b/tests/fsck-tests/013-extent-tree-rebuild/test.sh @@ -2,8 +2,11 @@ source $TOP/tests/common +check_prereq btrfs-corrupt-block check_prereq btrfs-debug-tree check_prereq mkfs.btrfs +check_prereq btrfs + setup_root_helper prepare_test_dev 1G diff --git a/tests/fsck-tests/019-non-skinny-false-alert/default_case.img.xz b/tests/fsck-tests/019-non-skinny-false-alert/default_case.img.xz Binary files differnew file mode 100644 index 0000000..c35f8bc --- /dev/null +++ b/tests/fsck-tests/019-non-skinny-false-alert/default_case.img.xz diff --git a/tests/fsck-tests/019-non-skinny-false-alert/test.sh b/tests/fsck-tests/019-non-skinny-false-alert/test.sh new file mode 100755 index 0000000..a7f8e86 --- /dev/null +++ b/tests/fsck-tests/019-non-skinny-false-alert/test.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# +# $ btrfs check img +# Checking filesystem on img +# UUID: 17f2bf15-f4c2-4ebc-b1f7-39b7af26257a +# checking extents +# bad extent [29376512, 29392896), type mismatch with chunk +# bad extent [29442048, 29458432), type mismatch with chunk +# bad extent [29589504, 29605888), type mismatch with chunk +# ... +# +# a buggy check leads to the above messages + +source $TOP/tests/common + +check_prereq btrfs + +image=$(extract_image "./default_case.img.xz") +run_check_stdout $TOP/btrfs check "$image" 2>&1 | + grep -q "type mismatch with chunk" && + _fail "unexpected error message in the output" + +rm -f "$image" diff --git a/tests/fuzz-tests.sh b/tests/fuzz-tests.sh index 0e59832..204dce2 100755 --- a/tests/fuzz-tests.sh +++ b/tests/fuzz-tests.sh @@ -31,7 +31,7 @@ do cd $i if [ -x test.sh ]; then echo "=== Entering $i" >> $RESULTS - echo " [TEST] $name" + echo " [TEST/fuzz] $name" ./test.sh if [ $? -ne 0 ]; then _fail "test failed for case $(basename $i)" diff --git a/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.txt b/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.txt new file mode 100644 index 0000000..bdde4e7 --- /dev/null +++ b/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.txt @@ -0,0 +1,30 @@ +URL: http://article.gmane.org/gmane.comp.file-systems.btrfs/50230 +Vegard Nossum, 2015-11-15 + +If sys_array::num_stripes == 0, we hit a BUG_ON during mount: + +BTRFS: device fsid 9006933e-2a9a-44f0-917f-514252aeec2c devid 1 transid 7 /dev/loop0 +BTRFS info (device loop0): disk space caching is enabled +BUG: failure at fs/btrfs/ctree.h:337/btrfs_chunk_item_size()! +Kernel panic - not syncing: BUG! +CPU: 0 PID: 313 Comm: mount Not tainted 4.2.5-00657-ge047887-dirty #25 +Stack: + 637af890 60062489 602aeb2e 604192ba + 60387961 00000011 637af8a0 6038a835 + 637af9c0 6038776b 634ef32b 00000000 +Call Trace: + [<6001c86d>] show_stack+0xfe/0x15b + [<6038a835>] dump_stack+0x2a/0x2c + [<6038776b>] panic+0x13e/0x2b3 + [<6020f099>] btrfs_read_sys_array+0x25d/0x2ff + [<601cfbbe>] open_ctree+0x192d/0x27af + [<6019c2c1>] btrfs_mount+0x8f5/0xb9a + [<600bc9a7>] mount_fs+0x11/0xf3 + [<600d5167>] vfs_kern_mount+0x75/0x11a + [<6019bcb0>] btrfs_mount+0x2e4/0xb9a + [<600bc9a7>] mount_fs+0x11/0xf3 + [<600d5167>] vfs_kern_mount+0x75/0x11a + [<600d710b>] do_mount+0xa35/0xbc9 + [<600d7557>] SyS_mount+0x95/0xc8 + +Fixed by patch (kernel and btrfs-progs): btrfs: handle invalid num_stripes in sys_array diff --git a/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.xz b/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.xz Binary files differnew file mode 100644 index 0000000..d64fb30 --- /dev/null +++ b/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.xz diff --git a/tests/misc-tests.sh b/tests/misc-tests.sh index a87ece2..2a7f57c 100755 --- a/tests/misc-tests.sh +++ b/tests/misc-tests.sh @@ -34,7 +34,7 @@ check_prereq btrfs for i in $(find $TOP/tests/misc-tests -maxdepth 1 -mindepth 1 -type d \ ${TEST:+-name "$TEST"} | sort) do - echo " [TEST] $(basename $i)" + echo " [TEST/misc] $(basename $i)" cd $i echo "=== Entering $i" >> $RESULTS if [ -x test.sh ]; then diff --git a/tests/misc-tests/001-btrfstune-features/test.sh b/tests/misc-tests/001-btrfstune-features/test.sh index 836e8d3..c858d70 100755 --- a/tests/misc-tests/001-btrfstune-features/test.sh +++ b/tests/misc-tests/001-btrfstune-features/test.sh @@ -6,6 +6,9 @@ source $TOP/tests/common check_prereq btrfs-debug-tree check_prereq btrfs-show-super check_prereq mkfs.btrfs +check_prereq btrfstune +check_prereq btrfs + setup_root_helper prepare_test_dev diff --git a/tests/misc-tests/002-uuid-rewrite/test.sh b/tests/misc-tests/002-uuid-rewrite/test.sh index 9b103aa..d84ec6c 100755 --- a/tests/misc-tests/002-uuid-rewrite/test.sh +++ b/tests/misc-tests/002-uuid-rewrite/test.sh @@ -7,6 +7,8 @@ check_prereq btrfs-debug-tree check_prereq btrfs-show-super check_prereq mkfs.btrfs check_prereq btrfstune +check_prereq btrfs + prepare_test_dev get_fs_uuid() { diff --git a/tests/misc-tests/004-shrink-fs/test.sh b/tests/misc-tests/004-shrink-fs/test.sh index b132152..8874035 100755 --- a/tests/misc-tests/004-shrink-fs/test.sh +++ b/tests/misc-tests/004-shrink-fs/test.sh @@ -7,6 +7,8 @@ source $TOP/tests/common check_prereq mkfs.btrfs +check_prereq btrfs + setup_root_helper # Optionally take id of the device to shrink diff --git a/tests/misc-tests/005-convert-progress-thread-crash/test.sh b/tests/misc-tests/005-convert-progress-thread-crash/test.sh index 09ac8a3..054069c 100755 --- a/tests/misc-tests/005-convert-progress-thread-crash/test.sh +++ b/tests/misc-tests/005-convert-progress-thread-crash/test.sh @@ -3,7 +3,8 @@ source $TOP/tests/common -check_prereq btrfs +check_prereq btrfs-convert + mkfs.ext4 -V &>/dev/null || _not_run "mkfs.ext4 not found" prepare_test_dev 1G diff --git a/tests/misc-tests/009-subvolume-sync-must-wait/test.sh b/tests/misc-tests/009-subvolume-sync-must-wait/test.sh index 66d38ea..056584e 100755 --- a/tests/misc-tests/009-subvolume-sync-must-wait/test.sh +++ b/tests/misc-tests/009-subvolume-sync-must-wait/test.sh @@ -5,6 +5,8 @@ source $TOP/tests/common check_prereq mkfs.btrfs +check_prereq btrfs + setup_root_helper run_check truncate -s 2G $IMAGE diff --git a/tests/misc-tests/010-convert-delete-ext2-subvol/test.sh b/tests/misc-tests/010-convert-delete-ext2-subvol/test.sh index 4893647..451e453 100755 --- a/tests/misc-tests/010-convert-delete-ext2-subvol/test.sh +++ b/tests/misc-tests/010-convert-delete-ext2-subvol/test.sh @@ -6,7 +6,9 @@ source $TOP/tests/common check_prereq btrfs-convert +check_prereq btrfs-debug-tree check_prereq btrfs + setup_root_helper prepare_test_dev diff --git a/tests/misc-tests/011-delete-missing-device/test.sh b/tests/misc-tests/011-delete-missing-device/test.sh new file mode 100755 index 0000000..26645f1 --- /dev/null +++ b/tests/misc-tests/011-delete-missing-device/test.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# make sure that 'missing' is accepted for device deletion + +source $TOP/tests/common + +check_prereq btrfs-show-super +check_prereq mkfs.btrfs +check_prereq btrfs + +ndevs=4 +declare -a devs +dev1= +devtodel= + +setup_root_helper + +prepare_devices() +{ + for i in `seq $ndevs`; do + touch img$i + chmod a+rw img$i + truncate -s0 img$i + truncate -s2g img$i + devs[$i]=`run_check_stdout $SUDO_HELPER losetup --find --show img$i` + done +} + +cleanup_devices() +{ + for dev in ${devs[@]}; do + run_mayfail $SUDO_HELPER losetup -d $dev + done + for i in `seq $ndevs`; do + truncate -s0 img$i + done + run_check $SUDO_HELPER losetup --list +} + +test_do_mkfs() +{ + run_check $SUDO_HELPER $TOP/mkfs.btrfs -f $@ ${devs[@]} + run_check $TOP/btrfs-show-super $dev1 + run_check $SUDO_HELPER $TOP/btrfs check $dev1 + run_check $TOP/btrfs filesystem show +} + +test_wipefs() +{ + run_check wipefs -a $devtodel + run_check $SUDO_HELPER losetup -d $devtodel + run_check losetup -a + run_check $TOP/btrfs filesystem show +} +test_delete_missing() +{ + run_check_mount_test_dev -o degraded + run_check $SUDO_HELPER $TOP/btrfs filesystem show $TEST_MNT + run_check $SUDO_HELPER $TOP/btrfs device delete missing $TEST_MNT + run_check $SUDO_HELPER $TOP/btrfs filesystem show $TEST_MNT + run_check_umount_test_dev + + run_check_mount_test_dev + local out + out="$(run_check_stdout $SUDO_HELPER $TOP/btrfs filesystem show $TEST_MNT)" + if echo "$out" | grep -q -- "$devtodel"; then + _fail "device $devtodel not deleted" + fi + if echo "$out" | grep -q missing; then + _fail "missing device still present" + fi + run_check_umount_test_dev +} + +prepare_devices +dev1=${devs[1]} +devtodel=${devs[3]} +TEST_DEV=$dev1 + +test_do_mkfs +test_wipefs +test_delete_missing + +cleanup_devices diff --git a/tests/mkfs-tests.sh b/tests/mkfs-tests.sh index 4780b54..c0635ad 100755 --- a/tests/mkfs-tests.sh +++ b/tests/mkfs-tests.sh @@ -31,7 +31,7 @@ check_prereq btrfs for i in $(find $TOP/tests/mkfs-tests -maxdepth 1 -mindepth 1 -type d \ ${TEST:+-name "$TEST"} | sort) do - echo " [TEST] $(basename $i)" + echo " [TEST/mkfs] $(basename $i)" cd $i echo "=== Entering $i" >> $RESULTS if [ -x test.sh ]; then diff --git a/tests/mkfs-tests/001-basic-profiles/test.sh b/tests/mkfs-tests/001-basic-profiles/test.sh index 0861f36..2747d42 100755 --- a/tests/mkfs-tests/001-basic-profiles/test.sh +++ b/tests/mkfs-tests/001-basic-profiles/test.sh @@ -70,6 +70,8 @@ test_mkfs_single test_mkfs_single -d single -m single test_mkfs_single -d single -m single --mixed test_mkfs_single -d single -m dup +test_mkfs_single -d dup -m single +test_mkfs_single -d dup -m dup test_mkfs_single -d dup -m dup --mixed test_mkfs_multi diff --git a/tests/mkfs-tests/002-no-force-mixed-on-small-volume/test.sh b/tests/mkfs-tests/002-no-force-mixed-on-small-volume/test.sh index 007a0eb..855fbd1 100755 --- a/tests/mkfs-tests/002-no-force-mixed-on-small-volume/test.sh +++ b/tests/mkfs-tests/002-no-force-mixed-on-small-volume/test.sh @@ -4,8 +4,8 @@ source $TOP/tests/common -check_prereq btrfs-show-super check_prereq mkfs.btrfs + setup_root_helper run_check truncate -s 512M $IMAGE diff --git a/tests/mkfs-tests/004-rootdir-keeps-size/test.sh b/tests/mkfs-tests/004-rootdir-keeps-size/test.sh index a78a3de..7038c8e 100755 --- a/tests/mkfs-tests/004-rootdir-keeps-size/test.sh +++ b/tests/mkfs-tests/004-rootdir-keeps-size/test.sh @@ -4,6 +4,7 @@ source $TOP/tests/common check_prereq mkfs.btrfs + prepare_test_dev test_mkfs_with_size() { diff --git a/tests/mkfs-tests/005-long-device-name-for-ssd/test.sh b/tests/mkfs-tests/005-long-device-name-for-ssd/test.sh new file mode 100755 index 0000000..c89ee0e --- /dev/null +++ b/tests/mkfs-tests/005-long-device-name-for-ssd/test.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# a long device name must pass the SSD test + +source $TOP/tests/common + +check_prereq mkfs.btrfs +check_prereq btrfs-show-super + +setup_root_helper +prepare_test_dev + +# prep device +dmname=\ +btrfs-test-with-very-long-name-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +dmdev=/dev/mapper/$dmname + +run_check truncate -s0 img +chmod a+w img +run_check truncate -s2g img + +loopdev=`run_check_stdout $SUDO_HELPER losetup --find --show img` +run_check $SUDO_HELPER dmsetup create $dmname --table "0 1048576 linear $loopdev 0" + +base=`basename "$loopdev"` +rot=/sys/class/block/$base/queue/rotational + +# switch rotational +run_check cat $rot +echo 0 | run_check $SUDO_HELPER tee $rot +run_check cat $rot + +# test +run_check_stdout $SUDO_HELPER $TOP/mkfs.btrfs -f $@ $dmdev | + grep -q 'SSD detected:.*yes' || _fail 'SSD not detected' +run_check $TOP/btrfs-show-super $dmdev + +# cleanup +run_check $SUDO_HELPER dmsetup remove $dmname +run_mayfail $SUDO_HELPER losetup -d $loopdev +run_check truncate -s0 img diff --git a/tests/mkfs-tests/006-partitioned-loopdev/partition-1g-1g b/tests/mkfs-tests/006-partitioned-loopdev/partition-1g-1g Binary files differnew file mode 100644 index 0000000..eb05776 --- /dev/null +++ b/tests/mkfs-tests/006-partitioned-loopdev/partition-1g-1g diff --git a/tests/mkfs-tests/006-partitioned-loopdev/test.sh b/tests/mkfs-tests/006-partitioned-loopdev/test.sh new file mode 100755 index 0000000..7c9fb82 --- /dev/null +++ b/tests/mkfs-tests/006-partitioned-loopdev/test.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# recognize partitioned loop devices + +source $TOP/tests/common + +check_prereq mkfs.btrfs +check_prereq btrfs-show-super + +setup_root_helper + +run_check truncate -s0 img +chmod a+w img +cp partition-1g-1g img +run_check truncate -s2g img + +loopdev=$(run_check_stdout $SUDO_HELPER losetup --partscan --find --show img) +base=$(basename $loopdev) + +# expect partitions named like loop0p1 etc +for looppart in $(ls /dev/$base?*); do + run_check $SUDO_HELPER $TOP/mkfs.btrfs -f $looppart + run_check $TOP/btrfs-show-super $looppart +done + +# cleanup +run_check $SUDO_HELPER losetup -d $loopdev +run_check truncate -s0 img diff --git a/tests/mkfs-tests/007-mix-nodesize-sectorsize/test.sh b/tests/mkfs-tests/007-mix-nodesize-sectorsize/test.sh new file mode 100755 index 0000000..d5374cb --- /dev/null +++ b/tests/mkfs-tests/007-mix-nodesize-sectorsize/test.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# iterate over nodesize and sectorsize combinations + +source $TOP/tests/common + +check_prereq btrfs-show-super +check_prereq mkfs.btrfs +check_prereq btrfs + +setup_root_helper +prepare_test_dev + +test_mkfs_single() +{ + run_check $SUDO_HELPER $TOP/mkfs.btrfs -f "$@" $TEST_DEV + run_check $TOP/btrfs-show-super $TEST_DEV + run_check $SUDO_HELPER $TOP/btrfs check $TEST_DEV +} + +# default +test_mkfs_single + +# nodesize >= sectorsize +for nodesize in 4096 8192 16384 32768 65536; do + for sectorsize in 4096 8192 16384 32768 65536; do + [ $nodesize -lt $sectorsize ] && continue + test_mkfs_single -n $nodesize -s $sectorsize -d single -m single + test_mkfs_single -n $nodesize -s $sectorsize -d single -m dup + done +done + +# nodesize, mixed mode +for nodesize in 4k 8k 16k 32k 64k; do + test_mkfs_single -n $nodesize -s $nodesize -d single -m single --mixed + test_mkfs_single -n $nodesize -s $nodesize -d dup -m dup --mixed +done diff --git a/tests/mkfs-tests/008-secorsize-nodesize-combination/test.sh b/tests/mkfs-tests/008-secorsize-nodesize-combination/test.sh new file mode 100755 index 0000000..79cc2b2 --- /dev/null +++ b/tests/mkfs-tests/008-secorsize-nodesize-combination/test.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# test various sectorsize and node size combinations +# including valid and invalid ones +# only do mkfs and fsck check, no mounting as +# sub/multi-pagesize is not supported yet + +source $TOP/tests/common + +check_prereq mkfs.btrfs +check_prereq btrfs + +prepare_test_dev + +# disable mixed bg to avoid sectorsize == nodesize check +features="^mixed-bg" + +# caller need to check whether the combination is valid +do_test() +{ + sectorsize=$1 + nodesize=$2 + run_mayfail $TOP/mkfs.btrfs -O $features -n $nodesize -s $sectorsize \ + $TEST_DEV + ret=$? + if [ $ret == 0 ]; then + run_check $TOP/btrfs check $TEST_DEV + fi + return $ret +} + +# Invalid: Unaligned sectorsize and nodesize +do_test 8191 8191 && _fail + +# Invalid: Aligned sectorsize with unaligned nodesize +do_test 4k 16385 && _fail + +# Invalid: Ungliend sectorsize with aligned nodesize +do_test 8191 16k && _fail + +# Valid: Aligned sectorsize and nodesize +do_test 4k 16k || _fail + +# Invalid: Sectorsize larger than nodesize +do_test 8k 4k && _fail + +# Invalid: too large nodesize +do_test 16k 128k && _fail + +# Valid: large sectorsize +do_test 64k 64k || _fail |