| #!/bin/sh |
| # 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 |
| |
| SKIP_WITH_LVMLOCKD=1 |
| SKIP_WITH_LVMPOLLD=1 |
| |
| . lib/inittest |
| |
| aux prepare_devs 2 |
| |
| # PV_EXT_USED flag |
| MARKED_AS_USED_MSG="is used by a VG but its metadata is missing" |
| |
| ###################################### |
| ### 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 |
| pvremove -ff -y "$dev1" |
| dd if=dev1_backup of="$dev1" bs=1M |
| pvcreate -ff -y "$dev1" |
| 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 |
| rm -f $TESTDIR/etc/.cache |
| |
| 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 |
| pvremove -ff -y "$dev1" |
| dd if=dev1_backup of="$dev1" bs=1M |
| pvcreate -ff -y "$dev1" |
| 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 |
| rm -f $TESTDIR/etc/.cache |
| |
| 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" |