summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2022-10-31 16:14:01 -0500
committerDavid Teigland <teigland@redhat.com>2022-11-07 08:56:02 -0600
commit761b922178c8522fd9abb207ba31bd27f9fa9dc4 (patch)
treeab046fbf52366d16b248a9ff2b6b0f492e233f16 /test
parentbdab36cf3f059e597371bb504646f4dfb7a89f50 (diff)
downloadlvm2-761b922178c8522fd9abb207ba31bd27f9fa9dc4.tar.gz
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.
Diffstat (limited to 'test')
-rw-r--r--test/shell/devicesfile-serial.sh777
1 files changed, 777 insertions, 0 deletions
diff --git a/test/shell/devicesfile-serial.sh b/test/shell/devicesfile-serial.sh
new file mode 100644
index 000000000..b7bfce29e
--- /dev/null
+++ b/test/shell/devicesfile-serial.sh
@@ -0,0 +1,777 @@
+#!/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
+