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 761b922178 device_id: handle duplicate serial numbers
Handle multiple devices using the same serial number as
their device id.  After matching devices to devices file
entries, if there is a discrepency between the ondisk PVID
and the devices file PVID, then rematch devices to
devices file entries using PVID, looking at all disks
on the system with the same serial number.
2022-11-07 08:56:02 -06:00

778 lines
20 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'
. 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
remove_base
rmmod brd