blob: 9a285916489797e93f934693cf186c95ec59812a [file] [log] [blame]
#!/bin/sh
# Copyright (C) 2015 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# Test unaligned size of external origin and thin pool chunk size
SKIP_WITH_LVMLOCKD=1
SKIP_WITH_LVMPOLLD=1
export LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/bin/false}
. lib/inittest
which cmp || skip
#
# Main
#
# Test needs thin-pool target with unaligned ext-orig size support
aux have_thin 1 13 0 || skip
aux prepare_pvs 2 640
# Use 8K extent size
vgcreate $vg -s 8K $(cat DEVICES)
# Prepare some numeric pattern with ~64K size
seq -s ' ' -w 0 10922 > 64K
d1="$DM_DEV_DIR/$vg/$lv1"
d2="$DM_DEV_DIR/$vg/$lv2"
# Prepare external origin LV with size not being a multiple of thin pool chunk size
lvcreate -l47 -n $lv1 $vg
# Fill end with pattern
dd if=64K of="$d1" bs=8192 seek=45 count=2 conv=fdatasync
# Switch to read-only volume
lvchange -an $vg/$lv1
lvchange -pr $vg/$lv1
lvcreate -L2M -T $vg/pool -c 192K
lvcreate -s $vg/$lv1 --name $lv2 --thinpool $vg/pool
# Check the tail of $lv2 matches $lv1
dd if="$d2" of=16K bs=8192 skip=45 count=2
cmp -n 16384 -l 64K 16K
# Now extend and rewrite
lvextend -l+2 $vg/$lv2
dd if=64K of="$d2" bs=8192 seek=46 count=3 conv=fdatasync
dd if="$d2" of=24K bs=8192 skip=46 count=3 iflag=direct
cmp -n 24576 -l 64K 24K
# Consumes 2 192K chunks -> 66.67%
check lv_field $vg/$lv2 data_percent "66.67"
lvreduce -f -l-24 $vg/$lv2
dd if=64K of="$d2" bs=8192 seek=24 count=1 conv=fdatasync
dd if="$d2" of=8K bs=8192 skip=24 count=1 iflag=direct
cmp -n 8192 -l 64K 8K
# Check extension still works
lvextend -l+2 $vg/$lv2
lvremove -f $vg/pool
lvcreate -L256M -T $vg/pool -c 64M
lvcreate -s $vg/$lv1 --name $lv2 --thinpool $vg/pool
lvextend -l+2 $vg/$lv2
dd if=64K of="$d2" bs=8192 seek=45 count=4 conv=fdatasync
dd if="$d2" of=32K bs=8192 skip=45 count=4 iflag=direct
cmp -n 32768 -l 64K 32K
lvextend -L+64M $vg/$lv2
# Consumes 64M chunk -> 50%
check lv_field $vg/$lv2 data_percent "50.00"
vgremove -ff $vg