summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rwxr-xr-xtests/convert-tests.sh6
-rwxr-xr-xtests/fsck-tests.sh2
-rwxr-xr-xtests/fsck-tests/006-bad-root-items/test.sh2
-rw-r--r--tests/fsck-tests/012-leaf-corruption/no_data_extent.tar.xzbin177600 -> 130260 bytes
-rwxr-xr-xtests/fsck-tests/012-leaf-corruption/test.sh13
-rwxr-xr-xtests/fsck-tests/013-extent-tree-rebuild/test.sh3
-rw-r--r--tests/fsck-tests/019-non-skinny-false-alert/default_case.img.xzbin0 -> 15236 bytes
-rwxr-xr-xtests/fsck-tests/019-non-skinny-false-alert/test.sh23
-rwxr-xr-xtests/fuzz-tests.sh2
-rw-r--r--tests/fuzz-tests/images/sys-array-num-stripes-0.raw.txt30
-rw-r--r--tests/fuzz-tests/images/sys-array-num-stripes-0.raw.xzbin0 -> 8364 bytes
-rwxr-xr-xtests/misc-tests.sh2
-rwxr-xr-xtests/misc-tests/001-btrfstune-features/test.sh3
-rwxr-xr-xtests/misc-tests/002-uuid-rewrite/test.sh2
-rwxr-xr-xtests/misc-tests/004-shrink-fs/test.sh2
-rwxr-xr-xtests/misc-tests/005-convert-progress-thread-crash/test.sh3
-rwxr-xr-xtests/misc-tests/009-subvolume-sync-must-wait/test.sh2
-rwxr-xr-xtests/misc-tests/010-convert-delete-ext2-subvol/test.sh2
-rwxr-xr-xtests/misc-tests/011-delete-missing-device/test.sh83
-rwxr-xr-xtests/mkfs-tests.sh2
-rwxr-xr-xtests/mkfs-tests/001-basic-profiles/test.sh2
-rwxr-xr-xtests/mkfs-tests/002-no-force-mixed-on-small-volume/test.sh2
-rwxr-xr-xtests/mkfs-tests/004-rootdir-keeps-size/test.sh1
-rwxr-xr-xtests/mkfs-tests/005-long-device-name-for-ssd/test.sh40
-rw-r--r--tests/mkfs-tests/006-partitioned-loopdev/partition-1g-1gbin0 -> 512 bytes
-rwxr-xr-xtests/mkfs-tests/006-partitioned-loopdev/test.sh27
-rwxr-xr-xtests/mkfs-tests/007-mix-nodesize-sectorsize/test.sh36
-rwxr-xr-xtests/mkfs-tests/008-secorsize-nodesize-combination/test.sh50
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
index 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
Binary files differ
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
new file mode 100644
index 0000000..c35f8bc
--- /dev/null
+++ b/tests/fsck-tests/019-non-skinny-false-alert/default_case.img.xz
Binary files differ
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
new file mode 100644
index 0000000..d64fb30
--- /dev/null
+++ b/tests/fuzz-tests/images/sys-array-num-stripes-0.raw.xz
Binary files differ
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
new file mode 100644
index 0000000..eb05776
--- /dev/null
+++ b/tests/mkfs-tests/006-partitioned-loopdev/partition-1g-1g
Binary files differ
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