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.fnst@xxxxxxxxxxxxxx>
>>> ---
>>> .../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.
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 majordomo@xxxxxxxxxxxxxxx
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html