2024-02-27 19:27:34 +03:00
#!/usr/bin/env bash
# Copyright (C) 2024 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 conversion to thin external origin stack
SKIP_WITH_LVMLOCKD = 1
SKIP_WITH_LVMPOLLD = 1
export LVM_TEST_THIN_REPAIR_CMD = ${ LVM_TEST_THIN_REPAIR_CMD -/bin/false }
. lib/inittest
which mkfs.ext4 || skip
which fsck || skip
_prepare( ) {
lvcreate -L10 -T -V20 -n $lv1 $vg /pool1
mkfs.ext4 " $DM_DEV_DIR / $vg / $lv1 "
mkdir -p mnt
mount " $DM_DEV_DIR / $vg / $lv1 " mnt
touch mnt/test1
sync
}
#
# Main
#
aux have_thin 1 5 0 || skip
aux prepare_vg 2
_prepare
# We can build chain of external origins with the same thin-pool
lvconvert --type thin --thinpool $vg /pool1 --originname $lv2 $vg /$lv1
lvconvert --type thin --thinpool $vg /pool1 --originname $lv3 $vg /$lv1
lvconvert --type thin --thinpool $vg /pool1 --originname $lv4 $vg /$lv1
# External origins remain inactive
# (only their -real counterparts are in DM table)
check inactive $vg $lv2
check inactive $vg $lv3
check inactive $vg $lv4
check lv_attr_bit perm $vg /$lv2 "r"
check lv_attr_bit perm $vg /$lv3 "r"
check lv_attr_bit perm $vg /$lv4 "r"
lvchange -ay $vg
touch mnt/test2
sync
umount mnt
fsck -n " $DM_DEV_DIR / $vg / $lv1 "
fsck -n " $DM_DEV_DIR / $vg / $lv2 "
fsck -n " $DM_DEV_DIR / $vg / $lv3 "
fsck -n " $DM_DEV_DIR / $vg / $lv4 "
# Check the removal works fine
lvremove -f $vg
#####################################################
#
# Now retry with origins across multiple thin pools
#
#####################################################
_prepare
# Create several more thin pools
lvcreate -L10 -T $vg /pool2
lvcreate -L10 -T $vg /pool3
lvcreate -L10 -T $vg /pool4
# thin volume chained into 3 layers, each forming a new external origin
lvconvert --type thin --thinpool $vg /pool2 --originname $lv2 $vg /$lv1
lvconvert --type thin --thinpool $vg /pool3 --originname $lv3 $vg /$lv1
lvconvert --type thin --thinpool $vg /pool4 --originname $lv4 $vg /$lv1
# ATM we are not protecting against 'self-cycling'
lvconvert --type thin --thinpool $vg /pool1 --originname $lv5 $vg /$lv1
umount mnt
fsck -n " $DM_DEV_DIR / $vg / $lv1 "
check active $vg $lv1
check inactive $vg $lv2
check inactive $vg $lv3
check inactive $vg $lv4
check inactive $vg $lv5
dm_table $vg -${ lv4 } -real | grep thin
dm_table $vg -${ lv5 } -real | grep thin
lvchange -ay $vg /$lv3
check active $vg $lv3
fsck -n " $DM_DEV_DIR / $vg / $lv3 "
lvremove -f $vg
lvcreate -L10 -T $vg /pool1
lvcreate -an -pr -L1 -n $lv1 $vg
# Use linear as oring for multiple thins
lvcreate --type thin --thinpool $vg /pool1 $vg /$lv1 -n $lv2
lvcreate --type thin --thinpool $vg /pool1 $vg /$lv1 -n $lv3
lvcreate --type thin --thinpool $vg /pool1 $vg /$lv1 -n $lv4
# Convert existing $lv1 into external origin 'eorigin'
lvconvert -T --thinpool $vg /pool1 --originname eorigin $vg /$lv1
# check $lv1-real was converted into eorigin-real
not dmsetup info $vg -${ lv1 } -real & > out
grep "not exist" out
dm_table $vg -eorigin-real | grep linear
check inactive $vg $lv1
check inactive $vg eorigin
check active $vg $lv2
check active $vg $lv3
check active $vg $lv4
check lv_field $vg /$lv1 segtype thin
check lv_attr_bit perm $vg /$lv1 "r"
check lv_field $vg /eorigin segtype linear
check lv_attr_bit perm $vg /eorigin "r"
lvs -ao+uuid,segtype $vg
lvremove -f $vg
#####################################################
#
2024-08-30 13:10:35 +03:00
# Check some prohibited conversions
2024-02-27 19:27:34 +03:00
#
#####################################################
lvcreate -L10 -T -V20 -n $lv1 $vg /pool1
#lvcreate -L10 -T -V20 -n $lv2 $vg/pool2
# Take thick/old snapshot
lvcreate -s -L10 -n snap $vg /$lv1
# Converting old-snapshot into external origin is not supported
not lvconvert -T --thinpool $vg /pool1 --originname orig $vg /snap
# Converting thin-pools LVs
not lvconvert -T --thinpool $vg /pool1 --originname orig $vg /pool2
not lvconvert -T --thinpool $vg /pool1 --originname orig $vg /pool2_tmeta
not lvconvert -T --thinpool $vg /pool1 --originname orig $vg /pool2_tdata
# However we should be able to use 'thick' snapshot origin (which is thin)
lvconvert -T --thinpool $vg /pool1 --originname orig $vg /$lv1
check active $vg $lv1
check active $vg orig
check active $vg snap
check lv_field $vg /$lv1 segtype thin
check lv_field $vg /orig segtype thin
check lv_field $vg /snap segtype linear
lvchange -an $vg /orig
lvconvert --type thin --thinpool $vg /pool1 --originname orig2 $vg /orig
check active $vg $lv1
# external origin and snapshot stay inactive
check inactive $vg orig2
check inactive $vg orig
check inactive $vg snap
dm_table $vg -orig2-real | grep thin