mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-29 17:02:43 +00:00
btrfs-progs: tests: test mkfs.btrfs fails on small backing size thin provision device
This tests is most similar to xfstests generic/405. It calls device mapper to create a thin provision device with small backing size and big virtual size. mkfs.btrfs should fail on such devices. This test should pass after commit e805b143a4fe ("btrfs-progs: mkfs: return nozero value on thin provisioned device"). Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
42a5710aca
commit
e2eb6dc4d4
98
tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh
Executable file
98
tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh
Executable file
@ -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
|
Loading…
Reference in New Issue
Block a user