summaryrefslogtreecommitdiff
path: root/tests/mkfs-tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests/mkfs-tests')
-rwxr-xr-xtests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh98
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh b/tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh
new file mode 100755
index 00000000..32640ce5
--- /dev/null
+++ b/tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+# mkfs.btrfs must fail on a thin provision device with very small backing size
+# and big virtual size.
+
+source "$TEST_TOP/common"
+
+check_prereq mkfs.btrfs
+check_global_prereq udevadm
+check_global_prereq dmsetup
+
+setup_root_helper
+prepare_test_dev
+
+# Backing data dev
+DMTHIN_DATA_NAME="btrfs-progs-thin-data"
+DMTHIN_DATA_DEV="/dev/mapper/$DMTHIN_DATA_NAME"
+# Backing metadata dev
+DMTHIN_META_NAME="btrfs-progs-thin-meta"
+DMTHIN_META_DEV="/dev/mapper/$DMTHIN_META_NAME"
+# Backing pool dev (combination of above)
+DMTHIN_POOL_NAME="btrfs-progs-thin-pool"
+DMTHIN_POOL_DEV="/dev/mapper/$DMTHIN_POOL_NAME"
+# Thin volume
+DMTHIN_VOL_NAME="btrfs-progs-thin-vol"
+DMTHIN_VOL_DEV="/dev/mapper/$DMTHIN_VOL_NAME"
+
+dmthin_cleanup()
+{
+ # wait for device to be fully settled
+ run_check $SUDO_HELPER udevadm settle
+ run_check $SUDO_HELPER dmsetup remove "$DMTHIN_VOL_NAME"
+ run_check $SUDO_HELPER dmsetup remove "$DMTHIN_POOL_NAME"
+ run_check $SUDO_HELPER dmsetup remove "$DMTHIN_META_NAME"
+ run_check $SUDO_HELPER dmsetup remove "$DMTHIN_DATA_NAME"
+}
+
+sector_size=512 # in bytes
+data_dev_size=$((1 * 1024 * 1024 / $sector_size)) # 1M
+virtual_size=$((1 * 1024 * 1024 * 1024 * 1024 / $sector_size)) # 1T
+cluster_size=1024 # 512k in sectors
+low_water=$((104857600 / $cluster_size/ $sector_size)) # 100M / $cluster_size, in sectors
+
+# Need to make linear metadata and data devs. From kernel docs:
+# As a guide, we suggest you calculate the number of bytes to use in the
+# metadata device as 48 * $data_dev_size / $data_block_size but round it up
+# to 2MB (4096 sectors) if the answer is smaller.
+# So do that:
+meta_dev_size=$((48 * $data_dev_size / $cluster_size))
+if [ "$meta_dev_size" -lt "4096" ]; then
+ meta_dev_size=4096 # 2MB
+fi
+
+meta_dev_offset=0
+total_data_dev_size=$(($meta_dev_offset + $meta_dev_size + $data_dev_size))
+
+run_check truncate -s0 img
+chmod a+w img
+run_check truncate -s"$(($total_data_dev_size * $sector_size))" img
+
+dm_backing_dev=`run_check_stdout $SUDO_HELPER losetup --find --show img`
+
+if ! [ -b "$dm_backing_dev" ]; then
+ _fail "cannot create backing device"
+fi
+
+# Metadata device
+DMTHIN_META_TABLE="0 $meta_dev_size linear $dm_backing_dev $meta_dev_offset"
+run_check $SUDO_HELPER dmsetup create "$DMTHIN_META_NAME" --table "$DMTHIN_META_TABLE"
+
+# Data device
+data_dev_offset=$((meta_dev_offset + $meta_dev_size))
+DMTHIN_DATA_TABLE="0 $data_dev_size linear $dm_backing_dev $data_dev_offset"
+run_check $SUDO_HELPER dmsetup create "$DMTHIN_DATA_NAME" --table "$DMTHIN_DATA_TABLE"
+
+# Zap the pool metadata dev
+run_check $SUDO_HELPER dd if=/dev/zero of="$DMTHIN_META_DEV" bs=4096 count=1
+
+# Thin pool
+# "start length thin-pool metadata_dev data_dev data_block_size low_water_mark"
+DMTHIN_POOL_TABLE="0 $data_dev_size thin-pool $DMTHIN_META_DEV $DMTHIN_DATA_DEV $cluster_size $low_water"
+run_check $SUDO_HELPER dmsetup create "$DMTHIN_POOL_NAME" --table "$DMTHIN_POOL_TABLE"
+
+# Thin volume
+pool_id=$RANDOM
+run_check $SUDO_HELPER dmsetup message "$DMTHIN_POOL_DEV" 0 "create_thin $pool_id"
+
+# start length thin pool_dev dev_id [external_origin_dev]
+DMTHIN_VOL_TABLE="0 $virtual_size thin $DMTHIN_POOL_DEV $pool_id"
+run_check $SUDO_HELPER dmsetup create "$DMTHIN_VOL_NAME" --table "$DMTHIN_VOL_TABLE"
+
+# mkfs.btrfs should fail due to the small backing device, the initial discard
+# is disabled
+run_mustfail "should fail for small backing size thin provision device" \
+ $SUDO_HELPER "$TOP/mkfs.btrfs" -K -f "$DMTHIN_VOL_DEV"
+
+dmthin_cleanup
+run_mayfail $SUDO_HELPER losetup -d "$dm_backing_dev"
+rm -- img