1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/test/shell/devicesfile-serial.sh
David Teigland 74feebdab7 device_id: fix handling of non-PV with duplicate serial number
Fix in the code that matches devices to system.devices entries when
the devices have the same serial number.  A non-PV device in
system.devices has no pvid value, and the code was segfaulting
when checking the null pvid value.
2023-06-08 12:24:05 -05:00

897 lines
23 KiB
Bash

#!/usr/bin/env bash
# Copyright (C) 2020 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_description='device id wwid from vpd_pg83'
SKIP_WITH_LVMPOLLD=1
. lib/inittest
test "$DM_DEV_DIR" = "/dev" || skip "Only works with /dev access -> make check LVM_TEST_DEVDIR=/dev"
aux lvmconf 'devices/use_devicesfile = 1'
# requires trailing / to match dm
aux lvmconf 'devices/device_id_sysfs_dir = "/test/sys/"'
SYS_DIR="/test/sys"
# The string format of the serial numbers
# encoded in the pg80 files
SERIAL1=003dd33a331c183c2300e1d883604609
SERIAL2=003dd33a441c183c2300e1d883604609
SERIAL3=003dd33a551c183c2300e1d883604609
SERIAL4=003dd33a661c183c2300e1d883604609
create_base() {
mkdir -p $SYS_DIR/dev/block
mkdir -p $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device
mkdir -p $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device
mkdir -p $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device
mkdir -p $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device
# Create four different pg80 serial numbers that
# can be assigned to devs
echo -n "0080 0020 3030 3364 6433 3361 3333 3163 \
3138 3363 3233 3030 6531 6438 3833 3630 3436 3039" | xxd -r -p > pg80_1
echo -n "0080 0020 3030 3364 6433 3361 3434 3163 \
3138 3363 3233 3030 6531 6438 3833 3630 3436 3039" | xxd -r -p > pg80_2
echo -n "0080 0020 3030 3364 6433 3361 3535 3163 \
3138 3363 3233 3030 6531 6438 3833 3630 3436 3039" | xxd -r -p > pg80_3
echo -n "0080 0020 3030 3364 6433 3361 3636 3163 \
3138 3363 3233 3030 6531 6438 3833 3630 3436 3039" | xxd -r -p > pg80_4
}
remove_base() {
rm -rf $SYS_DIR
}
modprobe brd
sleep 2
remove_base
dev1=/dev/ram0
dev2=/dev/ram1
dev3=/dev/ram2
dev4=/dev/ram3
DFDIR="$LVM_SYSTEM_DIR/devices"
mkdir -p "$DFDIR" || true
DF="$DFDIR/system.devices"
ORIG="$DFDIR/orig.devices"
touch $DF
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
vgcreate $vg1 "$dev1"
MAJOR1=`pvs "$dev1" --noheading -o major | tr -d - | awk '{print $1}'`
MINOR1=`pvs "$dev1" --noheading -o minor | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
vgcreate $vg2 "$dev2"
MAJOR2=`pvs "$dev2" --noheading -o major | tr -d - | awk '{print $1}'`
MINOR2=`pvs "$dev2" --noheading -o minor | tr -d - | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
vgcreate $vg3 "$dev3"
MAJOR3=`pvs "$dev3" --noheading -o major | tr -d - | awk '{print $1}'`
MINOR3=`pvs "$dev3" --noheading -o minor | tr -d - | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
vgcreate $vg4 "$dev4"
MAJOR4=`pvs "$dev4" --noheading -o major | tr -d - | awk '{print $1}'`
MINOR4=`pvs "$dev4" --noheading -o minor | tr -d - | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
create_base
# get serial number from pg80
cp pg80_1 $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/vpd_pg80
cp pg80_2 $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/vpd_pg80
cp pg80_3 $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/vpd_pg80
cp pg80_4 $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/vpd_pg80
rm $DF
lvmdevices --adddev "$dev1"
grep $SERIAL1 $DF
lvmdevices --adddev "$dev2"
grep $SERIAL2 $DF
lvmdevices --adddev "$dev3"
grep $SERIAL3 $DF
lvmdevices --adddev "$dev4"
grep $SERIAL4 $DF
cat $DF
cp $DF $ORIG
pvs
# run command to update metadata so deviceids are written to metadata
vgchange --addtag x $vg1
vgchange --addtag x $vg2
vgchange --addtag x $vg3
vgchange --addtag x $vg4
pvs -o uuid,deviceidtype,deviceid "$dev1" |tee out
grep $OPVID1 out
grep sys_serial out
grep $SERIAL1 out
pvs -o uuid,deviceidtype,deviceid "$dev2" |tee out
grep $OPVID2 out
grep sys_serial out
grep $SERIAL2 out
# get serial number from device/serial
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
rm $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/vpd_pg80
rm $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/vpd_pg80
rm $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/vpd_pg80
rm $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/vpd_pg80
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL2 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL3 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL4 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
pvcreate $dev1
pvcreate $dev2
pvcreate $dev3
pvcreate $dev4
grep $SERIAL1 $DF
grep $SERIAL2 $DF
grep $SERIAL3 $DF
grep $SERIAL4 $DF
# all pvs have the same serial number
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1
vgcreate $vg2 $dev2
vgcreate $vg3 $dev3
vgcreate $vg4 $dev4
cp $DF $ORIG
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID2 $DF |tee out
grep $SERIAL1 out
grep $dev2 out
grep $PVID3 $DF |tee out
grep $SERIAL1 out
grep $dev3 out
grep $PVID4 $DF |tee out
grep $SERIAL1 out
grep $dev4 out
pvs -o+uuid,deviceidtype,deviceid |tee out
grep $dev1 out
grep $dev2 out
grep $dev3 out
grep $dev4 out
grep $OPVID1 out
grep $OPVID2 out
grep $OPVID3 out
grep $OPVID4 out
grep $vg1 out
grep $vg2 out
grep $vg3 out
grep $vg4 out
grep sys_serial out
grep $SERIAL1 out
pvs -o+uuid,deviceid $dev1 |tee out
grep $OPVID1 out
grep $SERIAL1 out
grep $vg1 out
pvs -o+uuid,deviceid $dev2 |tee out
grep $OPVID2 out
grep $SERIAL1 out
grep $vg2 out
pvs -o+uuid,deviceid $dev3 |tee out
grep $OPVID3 out
grep $SERIAL1 out
grep $vg3 out
pvs -o+uuid,deviceid $dev4 |tee out
grep $OPVID4 out
grep $SERIAL1 out
grep $vg4 out
# all pvs have the same serial number, df devnames are stale
# edit DF to make devnames stale
cp $ORIG orig
sed -e "s|DEVNAME=$dev1|DEVNAME=tmpnm|" orig > tmp1
sed -e "s|DEVNAME=$dev2|DEVNAME=$dev1|" tmp1 > tmp2
sed -e "s|DEVNAME=tmpnm|DEVNAME=$dev2|" tmp2 > tmp3
sed -e "s|DEVNAME=$dev3|DEVNAME=tmpnm|" tmp3 > tmp4
sed -e "s|DEVNAME=$dev4|DEVNAME=$dev3|" tmp4 > tmp5
sed -e "s|DEVNAME=tmpnm|DEVNAME=$dev4|" tmp5 > "$DF"
cat "$DF"
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $dev3 out |tee out3
grep $dev4 out |tee out4
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
grep $OPVID4 out4
grep $SERIAL1 out1
grep $SERIAL1 out2
grep $SERIAL1 out3
grep $SERIAL1 out4
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID2 $DF |tee out
grep $SERIAL1 out
grep $dev2 out
grep $PVID3 $DF |tee out
grep $SERIAL1 out
grep $dev3 out
grep $PVID4 $DF |tee out
grep $SERIAL1 out
grep $dev4 out
pvs -o+uuid,deviceid "$dev1"|tee out1
pvs -o+uuid,deviceid "$dev2"|tee out2
pvs -o+uuid,deviceid "$dev3"|tee out3
pvs -o+uuid,deviceid "$dev4"|tee out4
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
grep $OPVID4 out4
# all pvs have the same serial number,
# dev1 and dev2 have devnames swapped,
# dev3 has stale PVID in the DF.
# lvm fixes the stale devnames but does not fix the stale PVID
# because of the duplicate serial numbers, so dev3 is not found
cp $ORIG orig
sed -e "s|DEVNAME=$dev1|DEVNAME=tmpnm|" orig > tmp1
sed -e "s|DEVNAME=$dev2|DEVNAME=$dev1|" tmp1 > tmp2
sed -e "s|PVID=$PVID4|PVID=4SqT4onBxSiv4dot0GRDPtrWqOlrOPH1|" tmp2 > "$DF"
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
not grep $dev4 out
not grep $OPVID4 out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $dev3 out |tee out3
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
not pvs "$dev4"
# dev1&2 have same serial, dev3&4 have same serial
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL2 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL2 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1
vgcreate $vg2 $dev2
vgcreate $vg3 $dev3
vgcreate $vg4 $dev4
cp $DF $ORIG
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID2 $DF |tee out
grep $SERIAL1 out
grep $dev2 out
grep $PVID3 $DF |tee out
grep $SERIAL2 out
grep $dev3 out
grep $PVID4 $DF |tee out
grep $SERIAL2 out
grep $dev4 out
pvs -o+uuid,deviceidtype,deviceid |tee out
grep $dev1 out
grep $dev2 out
grep $dev3 out
grep $dev4 out
grep $OPVID1 out
grep $OPVID2 out
grep $OPVID3 out
grep $OPVID4 out
grep $vg1 out
grep $vg2 out
grep $vg3 out
grep $vg4 out
grep sys_serial out
grep $SERIAL1 out
grep $SERIAL2 out
pvs -o+uuid,deviceid $dev1 |tee out
grep $OPVID1 out
grep $SERIAL1 out
grep $vg1 out
pvs -o+uuid,deviceid $dev2 |tee out
grep $OPVID2 out
grep $SERIAL1 out
grep $vg2 out
pvs -o+uuid,deviceid $dev3 |tee out
grep $OPVID3 out
grep $SERIAL2 out
grep $vg3 out
pvs -o+uuid,deviceid $dev4 |tee out
grep $OPVID4 out
grep $SERIAL2 out
grep $vg4 out
# dev1&2 have serial1 and dev3&4 have serial2, swap devnames
# edit DF to make devnames stale
cp $ORIG orig
sed -e "s|DEVNAME=$dev1|DEVNAME=tmpnm|" orig > tmp1
sed -e "s|DEVNAME=$dev3|DEVNAME=$dev1|" tmp1 > tmp2
sed -e "s|DEVNAME=tmpnm|DEVNAME=$dev3|" tmp2 > tmp3
sed -e "s|DEVNAME=$dev2|DEVNAME=tmpnm|" tmp3 > tmp4
sed -e "s|DEVNAME=$dev4|DEVNAME=$dev2|" tmp4 > tmp5
sed -e "s|DEVNAME=tmpnm|DEVNAME=$dev4|" tmp5 > "$DF"
cat "$DF"
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $dev3 out |tee out3
grep $dev4 out |tee out4
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
grep $OPVID4 out4
grep $SERIAL1 out1
grep $SERIAL1 out2
grep $SERIAL2 out3
grep $SERIAL2 out4
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID2 $DF |tee out
grep $SERIAL1 out
grep $dev2 out
grep $PVID3 $DF |tee out
grep $SERIAL2 out
grep $dev3 out
grep $PVID4 $DF |tee out
grep $SERIAL2 out
grep $dev4 out
pvs -o+uuid,deviceid "$dev1"|tee out1
pvs -o+uuid,deviceid "$dev2"|tee out2
pvs -o+uuid,deviceid "$dev3"|tee out3
pvs -o+uuid,deviceid "$dev4"|tee out4
grep $OPVID1 out1
grep $SERIAL1 out1
grep $OPVID2 out2
grep $SERIAL1 out2
grep $OPVID3 out3
grep $SERIAL2 out3
grep $OPVID4 out4
grep $SERIAL2 out4
# all devs have same serial, dev1&4 are pvs, dev2&3 are not pvs
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1
vgcreate $vg4 $dev4
cp $DF $ORIG
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID4 $DF |tee out
grep $SERIAL1 out
grep $dev4 out
pvs -o+uuid,deviceidtype,deviceid |tee out
grep $dev1 out
grep $dev4 out
grep $OPVID1 out
grep $OPVID4 out
grep $vg1 out
grep $vg4 out
grep sys_serial out
grep $SERIAL1 out
pvs -o+uuid,deviceid $dev1 |tee out
grep $OPVID1 out
grep $SERIAL1 out
grep $vg1 out
not pvs -o+uuid,deviceid $dev2
not pvs -o+uuid,deviceid $dev3
pvs -o+uuid,deviceid $dev4 |tee out
grep $OPVID4 out
grep $SERIAL1 out
grep $vg4 out
# edit DF to make devnames stale
cp $ORIG orig
sed -e "s|DEVNAME=$dev1|DEVNAME=$dev2|" orig > tmp1
sed -e "s|DEVNAME=$dev4|DEVNAME=$dev3|" tmp1 > "$DF"
cat "$DF"
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev4 out |tee out4
grep $OPVID1 out1
grep $OPVID4 out4
grep $SERIAL1 out1
grep $SERIAL1 out4
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID4 $DF |tee out
grep $SERIAL1 out
grep $dev4 out
pvs -o+uuid,deviceid "$dev1"|tee out1
pvs -o+uuid,deviceid "$dev4"|tee out4
grep $OPVID1 out1
grep $SERIAL1 out1
grep $OPVID4 out4
grep $SERIAL1 out4
# one pv with serial, three other non-pvs with same serial
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg2 $dev2
cp $DF $ORIG
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
grep $PVID2 $DF |tee out
grep $SERIAL1 out
grep $dev2 out
pvs -o+uuid,deviceidtype,deviceid |tee out
grep $dev2 out
grep sys_serial out
grep $SERIAL1 out
not grep $dev1 out
not grep $dev3 out
not grep $dev4 out
# edit DF to make devname stale
cp $ORIG orig
sed -e "s|DEVNAME=$dev2|DEVNAME=$dev3|" orig > "$DF"
cat "$DF"
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev2 out
grep $OPVID2 out
grep $SERIAL1 out
grep $dev2 "$DF"
# different serial numbers, stale pvid and devname in df,
# lvm corrects pvid in df because serial number is unique
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL2 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL3 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL4 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1
vgcreate $vg2 $dev2
vgcreate $vg3 $dev3
vgcreate $vg4 $dev4
cp $DF $ORIG
grep $SERIAL1 $DF
grep $SERIAL2 $DF
grep $SERIAL3 $DF
grep $SERIAL4 $DF
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
pvs -o+uuid,deviceid
cp $ORIG orig
sed -e "s|PVID=$PVID1|PVID=bad14onBxSiv4dot0GRDPtrWqOlr1bad|" orig > tmp1
sed -e "s|PVID=$PVID3|PVID=bad24onBxSiv4dot0GRDPtrWqOlr2bad|" tmp1 > tmp2
sed -e "s|DEVNAME=$dev1|DEVNAME=.|" tmp2 > "$DF"
cat $DF
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $dev3 out |tee out3
grep $dev4 out |tee out4
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
grep $OPVID4 out4
grep $vg1 out1
grep $vg2 out2
grep $vg3 out3
grep $vg4 out4
grep $SERIAL1 out1
grep $SERIAL2 out2
grep $SERIAL3 out3
grep $SERIAL4 out4
grep $PVID1 $DF |tee out
grep $SERIAL1 out
grep $dev1 out
grep $PVID2 $DF |tee out
grep $SERIAL2 out
grep $dev2 out
grep $PVID3 $DF |tee out
grep $SERIAL3 out
grep $dev3 out
grep $PVID4 $DF |tee out
grep $SERIAL4 out
grep $dev4 out
# duplicate serial on two pvs, two pvs with devname type, all devnames stale
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo "" > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo "" > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1
vgcreate $vg2 $dev2
vgcreate $vg3 $dev3
vgcreate $vg4 $dev4
cp $DF $ORIG
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
cat $DF
pvs -o+uuid,deviceid
cp $ORIG orig
sed -e "s|DEVNAME=$dev1|DEVNAME=tmpnm|" orig > tmp1
sed -e "s|DEVNAME=$dev3|DEVNAME=$dev1|" tmp1 > tmp2
sed -e "s|DEVNAME=tmpnm|DEVNAME=$dev3|" tmp2 > tmp3
sed -e "s|DEVNAME=$dev2|DEVNAME=tmpnm|" tmp3 > tmp4
sed -e "s|DEVNAME=$dev4|DEVNAME=$dev2|" tmp4 > tmp5
sed -e "s|DEVNAME=tmpnm|DEVNAME=$dev4|" tmp5 > "$DF"
cat $DF
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $dev3 out |tee out3
grep $dev4 out |tee out4
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
grep $OPVID4 out4
grep $vg1 out1
grep $vg2 out2
grep $vg3 out3
grep $vg4 out4
grep $SERIAL1 out1
grep $SERIAL1 out2
cat $DF
grep $PVID1 $DF |tee out1
grep $PVID2 $DF |tee out2
grep $PVID3 $DF |tee out3
grep $PVID4 $DF |tee out4
grep $dev1 out1
grep $SERIAL1 out1
grep $dev2 out2
grep $SERIAL1 out2
grep $dev3 out3
grep $dev4 out4
# two pvs with duplicate serial and stale devname, one pv with unique serial and stale pvid
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL3 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1
vgcreate $vg2 $dev2
vgcreate $vg3 $dev3
cp $DF $ORIG
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
cat $DF
pvs -o+uuid,deviceid
cp $ORIG orig
sed -e "s|DEVNAME=$dev1|DEVNAME=$dev4|" orig > tmp1
sed -e "s|DEVNAME=$dev2|DEVNAME=$dev1|" tmp1 > tmp2
sed -e "s|PVID=$dev3|PVID=bad14onBxSiv4dot0GRDPtrWqOlr1bad|" tmp2 > $DF
cat $DF
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $dev3 out |tee out3
grep $OPVID1 out1
grep $OPVID2 out2
grep $OPVID3 out3
grep $vg1 out1
grep $vg2 out2
grep $vg3 out3
grep $SERIAL1 out1
grep $SERIAL1 out2
grep $SERIAL3 out3
cat $DF
grep $PVID1 $DF |tee out1
grep $PVID2 $DF |tee out2
grep $PVID3 $DF |tee out3
grep $dev1 out1
grep $SERIAL1 out1
grep $dev2 out2
grep $SERIAL1 out2
grep $dev3 out3
grep $SERIAL3 out3
# non-PV devices
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
aux wipefs_a $dev4
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL2 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL2 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
echo $SERIAL4 > $SYS_DIR/dev/block/$MAJOR4:$MINOR4/device/serial
rm $DF
touch $DF
vgcreate $vg4 $dev4
lvmdevices --adddev "$dev1"
lvmdevices --adddev "$dev2"
lvmdevices --adddev "$dev3"
cat $DF
grep $dev1 $DF |tee out1
grep $dev2 $DF |tee out2
grep $dev3 $DF |tee out3
grep $dev4 $DF |tee out4
grep $SERIAL1 out1
grep $SERIAL2 out2
grep $SERIAL2 out3
grep $SERIAL4 out4
pvs |tee out
grep $dev4 out
not grep $dev1 out
not grep $dev2 out
not grep $dev3 out
pvcreate $dev1
pvs |tee out
grep $dev1 out
grep $dev4 out
not grep $dev2 out
not grep $dev3 out
pvcreate $dev2
pvs |tee out
grep $dev1 out
grep $dev4 out
grep $dev2 out
not grep $dev3 out
pvcreate $dev3
pvs |tee out
grep $dev1 out
grep $dev4 out
grep $dev2 out
grep $dev3 out
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID3=`pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID4=`pvs "$dev4" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
OPVID3=`pvs "$dev3" --noheading -o uuid | awk '{print $1}'`
OPVID4=`pvs "$dev4" --noheading -o uuid | awk '{print $1}'`
grep $dev1 $DF |tee out1
grep $dev2 $DF |tee out2
grep $dev3 $DF |tee out3
grep $dev4 $DF |tee out4
grep $PVID1 out1
grep $PVID2 out2
grep $PVID3 out3
grep $PVID4 out4
vgcreate $vg2 $dev2 $dev3
vgs | grep $vg2
# 3 devs with duplicate serial, 2 pvs with stale devnames, 1 non-pv device
aux wipefs_a $dev1
aux wipefs_a $dev2
aux wipefs_a $dev3
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR1:$MINOR1/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR2:$MINOR2/device/serial
echo $SERIAL1 > $SYS_DIR/dev/block/$MAJOR3:$MINOR3/device/serial
rm $DF
touch $DF
vgcreate $vg1 $dev1 $dev2
lvmdevices --adddev $dev3
cat $DF
cp $DF $ORIG
PVID1=`pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}'`
PVID2=`pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}'`
OPVID1=`pvs "$dev1" --noheading -o uuid | awk '{print $1}'`
OPVID2=`pvs "$dev2" --noheading -o uuid | awk '{print $1}'`
pvs -o+uuid,deviceid
sed -e "s|DEVNAME=$dev1|DEVNAME=tmp|" $ORIG > tmp1
sed -e "s|DEVNAME=$dev2|DEVNAME=$dev1|" tmp1 > tmp2
sed -e "s|DEVNAME=tmp|DEVNAME=$dev2|" tmp2 > $DF
cat $DF
# pvs should report the correct info and fix the DF
pvs -o+uuid,deviceid |tee out
grep $dev1 out |tee out1
grep $dev2 out |tee out2
grep $OPVID1 out1
grep $OPVID2 out2
grep $SERIAL1 out1
grep $SERIAL1 out2
remove_base
rmmod brd