On 11.04.2018 10:29, Qu Wenruo wrote: > > > On 2018年04月11日 15:28, Su Yue wrote: >> >> >> On 04/11/2018 03:05 PM, Qu Wenruo wrote: >>> >>> >>> On 2018年04月11日 15:03, Su Yue wrote: >>>> 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.f...@cn.fujitsu.com> >>>> --- >>>> .../test.sh | 93 +++++++++++++++++++ >>>> 1 file changed, 93 insertions(+) >>>> create mode 100755 >>>> tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh >>>> >>>> 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 000000000000..f2e044da5d17 >>>> --- /dev/null >>>> +++ >>>> b/tests/mkfs-tests/017-small-backing-size-thin-provision-device/test.sh >>>> @@ -0,0 +1,93 @@ >>>> +#!/bin/bash >>>> +# mkfs.btrfs must failed on a thin provision device with very small >>>> +# backing size and big virtual size. >>>> + >>>> +source "$TEST_TOP/common" >>>> + >>>> +check_prereq mkfs.btrfs >>>> + >>>> +setup_root_helper >>>> +prepare_test_dev >>>> + >>>> +# Backing data dev >>>> +DMTHIN_DATA_NAME="thin-data" >>>> +DMTHIN_DATA_DEV="/dev/mapper/$DMTHIN_DATA_NAME" >>>> +# Backing metadata dev >>>> +DMTHIN_META_NAME="thin-meta" >>>> +DMTHIN_META_DEV="/dev/mapper/$DMTHIN_META_NAME" >>>> +# Backing pool dev (combination of above) >>>> +DMTHIN_POOL_NAME="thin-pool" >>>> +DMTHIN_POOL_DEV="/dev/mapper/$DMTHIN_POOL_NAME" >>>> +# Thin volume >>>> +DMTHIN_VOL_NAME="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` >>>> + >>>> +# 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" >>> >>> What about using lvm other than plain dmsetup to create thin provision >>> devices? >>> IIRC this should be much easier to implement, without all the linear >>> target hassles. >> >> Yes, doing it by LVM is more convenient. >> However, LVM seems too abstract and it's never used in btrfs-progs. >> >> I have no idea whether LVM other tools should be used or not. > > We have check_global_prereq(), so it's no a problem to use external tools.
IMHO it's a good idea to keep requirements to the bare minimum. While LVM will indeed be more user (in this case developer) friendly, I think it's abstracting too much. So I'd rather stick with plain dm-setup. > > Thanks, > Qu > >> >> Thanks, >> Su >> >>> >>> Thanks, >>> Qu >>> >>>> + >>>> +# 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 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 >>>> +run_mustfail "should fail for samll backing size thin provision >>>> device" \ >>>> + $SUDO_HELPER "$TOP/mkfs.btrfs" -f "$@" "$DMTHIN_VOL_DEV" >>>> + >>>> +#cleanup >>>> +dmthin_cleanup >>>> +run_mayfail $SUDO_HELPER losetup -d $dm_backing_dev >>>> +run_check truncate -s0 img >>>> +rm img >>>> >>> >>> >> >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in >> the body of a message to majord...@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html