btrfs-progs/tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh
Marcos Paulo de Souza 656e7a839f btrfs-progs: tests: skip tests if dmsetup is not available
Move the check of dmsetup to check_dm_target_support, and adapt the only
two places checking if dmsetup is present in the system. Now we skip the
tests if dmsetup isn't available, instead of marking the test as failed.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-03-31 18:37:34 +02:00

99 lines
3.5 KiB
Bash
Executable File

#!/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_dm_target_support linear thin
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