2017-07-02 22:38:32 +03:00
#!/usr/bin/env bash
2015-04-07 14:50:54 +03:00
# Copyright (C) 2016 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
2016-02-23 01:13:42 +03:00
SKIP_WITH_LVMLOCKD = 1
2015-04-07 14:50:54 +03:00
SKIP_WITH_LVMPOLLD = 1
. lib/inittest
aux prepare_devs 2
# PV_EXT_USED flag
2016-02-25 23:12:08 +03:00
MARKED_AS_USED_MSG = "is used by a VG but its metadata is missing"
2015-04-07 14:50:54 +03:00
######################################
### CHECK PV WITH 0 METADATA AREAS ###
######################################
pvcreate -ff -y --metadatacopies 0 " $dev1 "
pvcreate -ff -y --metadatacopies 1 " $dev2 "
# $dev1 and $dev2 not in any VG - pv_in_use field should be blank
check pv_field " $dev1 " pv_in_use ""
check pv_field " $dev2 " pv_in_use ""
# $dev1 and $dev now in a VG - pv_in_use should display "used"
vgcreate $vg1 " $dev1 " " $dev2 "
check pv_field " $dev1 " pv_in_use "used"
check pv_field " $dev2 " pv_in_use "used"
# disable $dev2 and dev1 with 0 MDAs remains, but still
# marked as used, so pvcreate/vgcreate/pvremove should fail
aux disable_dev " $dev2 "
pvscan --cache
check pv_field " $dev1 " pv_in_use "used"
not pvcreate " $dev1 " 2>err
cat err
grep " $MARKED_AS_USED_MSG " err
not pvchange -u " $dev1 " 2>err
grep " $MARKED_AS_USED_MSG " err
not vgcreate $vg2 " $dev1 " 2>err
grep " $MARKED_AS_USED " err
not pvremove " $dev1 " 2>err
grep " $MARKED_AS_USED_MSG " err
# save PV signature from dev1 for reuse later on in this
# test so we don't need to initialize all the VG stuff again
dd if = " $dev1 " of = dev1_backup bs = 1M
# pvcreate and pvremove can be forced even if the PV is marked as used
2016-02-18 16:30:14 +03:00
pvremove -ff -y " $dev1 "
2015-04-07 14:50:54 +03:00
dd if = dev1_backup of = " $dev1 " bs = 1M
2016-02-18 16:30:14 +03:00
pvcreate -ff -y " $dev1 "
2015-04-07 14:50:54 +03:00
dd if = dev1_backup of = " $dev1 " bs = 1M
# prepare a VG with $dev1 and $dev both having 1 MDA
aux enable_dev " $dev2 "
vgremove -ff $vg1
pvcreate --metadatacopies 1 " $dev1 "
vgcreate $vg1 " $dev1 " " $dev2 "
# disable $dev1, then repair the VG - $dev1 is removed from VG
aux disable_dev " $dev1 "
vgreduce --removemissing $vg1
# now, enable $dev1, automatic repair will happen on pvs call
# (or any other lvm command that does vg_read with repair inside)
aux enable_dev " $dev1 "
# FIXME: once persistent cache does not cause races with timestamps
# causing LVM tools to not see the VG inconsistency and once
# VG repair is always done, delete this line which removes
# persistent .cache as a workaround
2017-07-10 11:40:09 +03:00
rm -f " $TESTDIR /etc/.cache "
2015-04-07 14:50:54 +03:00
vgck $vg1
# check $dev1 does not contain the PV_EXT_FLAG anymore - it
# should be removed as part of the repaid during vg_read since
# $dev1 is not part of $vg1 anymore
check pv_field " $dev1 " pv_in_use ""
#############################################
### CHECK PV WITH DISABLED METADATA AREAS ###
#############################################
pvcreate -ff -y --metadatacopies 1 " $dev1 "
pvcreate -ff -y --metadatacopies 1 " $dev2 "
# $dev1 and $dev2 not in any VG - pv_in_use field should be blank
check pv_field " $dev1 " pv_in_use ""
check pv_field " $dev2 " pv_in_use ""
# $dev1 and $dev now in a VG - pv_in_use should display "used"
vgcreate $vg1 " $dev1 " " $dev2 "
check pv_field " $dev1 " pv_in_use "used"
check pv_field " $dev2 " pv_in_use "used"
pvchange --metadataignore y " $dev1 "
aux disable_dev " $dev2 "
pvscan --cache
check pv_field " $dev1 " pv_in_use "used"
not pvcreate " $dev1 " 2>err
grep " $MARKED_AS_USED_MSG " err
not pvchange -u " $dev1 " 2>err
grep " $MARKED_AS_USED_MSG " err
not vgcreate $vg2 " $dev1 " 2>err
grep " $MARKED_AS_USED " err
not pvremove " $dev1 " 2>err
grep " $MARKED_AS_USED_MSG " err
# save PV signature from dev1 for reuse later on in this
# test so we don't need to initialize all the VG stuff again
dd if = " $dev1 " of = dev1_backup bs = 1M
# pvcreate and pvremove can be forced even if the PV is marked as used
2016-02-18 16:30:14 +03:00
pvremove -ff -y " $dev1 "
2015-04-07 14:50:54 +03:00
dd if = dev1_backup of = " $dev1 " bs = 1M
2016-02-18 16:30:14 +03:00
pvcreate -ff -y " $dev1 "
2015-04-07 14:50:54 +03:00
dd if = dev1_backup of = " $dev1 " bs = 1M
# prepare a VG with $dev1 and $dev both having 1 MDA
aux enable_dev " $dev2 "
vgremove -ff $vg1
pvcreate --metadatacopies 1 " $dev1 "
vgcreate $vg1 " $dev1 " " $dev2 "
# disable $dev1, then repair the VG - $dev1 is removed from VG
aux disable_dev " $dev1 "
vgreduce --removemissing $vg1
# now, enable $dev1, automatic repair will happen on pvs call
# (or any other lvm command that does vg_read with repair inside)
aux enable_dev " $dev1 "
# FIXME: once persistent cache does not cause races with timestamps
# causing LVM tools to not see the VG inconsistency and once
# VG repair is always done, delete this line which removes
# persistent .cache as a workaround
2017-07-10 11:40:09 +03:00
rm -f " $TESTDIR /etc/.cache "
2015-04-07 14:50:54 +03:00
vgck $vg1
# check $dev1 does not contain the PV_EXT_FLAG anymore - it
# should be removed as part of the repaid during vg_read since
# $dev1 is not part of $vg1 anymore
check pv_field " $dev1 " pv_in_use ""
###########################
# OTHER PV-RELATED CHECKS #
###########################
# vgcfgrestore should also set PV_EXT_FLAG on PVs where VG is restored
vgcfgbackup -f vg_backup $vg1
check pv_field " $dev2 " pv_in_use "used"
vgremove -ff $vg1
check pv_field " $dev2 " pv_in_use ""
vgcfgrestore -f vg_backup $vg1
check pv_field " $dev2 " pv_in_use "used"