[lvm-devel] main - vgimportclone: fix when duplicates are both in the devices file

David Teigland teigland at sourceware.org
Fri Aug 20 20:08:26 UTC 2021


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=72af1cb0857afffd56f71847fcb9504d491c13e4
Commit:        72af1cb0857afffd56f71847fcb9504d491c13e4
Parent:        8b723139363a6b55e57ba4e9d599ff2efbae7d23
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Fri Aug 20 15:06:33 2021 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Fri Aug 20 15:06:33 2021 -0500

vgimportclone: fix when duplicates are both in the devices file

Fix case where duplicate PVs are created (e.g. with dd) from
devices that are both already in the devices file.
---
 test/shell/vgimportclone.sh | 21 +++++++++++++++++++++
 tools/vgimportclone.c       |  4 ++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/test/shell/vgimportclone.sh b/test/shell/vgimportclone.sh
index 2245d65eb..97d146b9e 100644
--- a/test/shell/vgimportclone.sh
+++ b/test/shell/vgimportclone.sh
@@ -43,9 +43,23 @@ vgimport $vg1
 fail vgimport $vg1
 vgchange -ay $vg1
 
+# Since the devices file is using devnames as ids,
+# it will not automatically know that dev2 is a
+# duplicate after the dd, so we need to remove dev2
+# from df, then add it again after the dd.
+if lvmdevices; then
+	lvmdevices --deldev "$dev2"
+fi
+
 # Clone the LUN
 dd if="$dev1" of="$dev2" bs=256K count=1
 
+# Requires -y to confirm prompt about adding
+# a duplicate pvid.
+if lvmdevices; then
+	lvmdevices -y --adddev "$dev2"
+fi
+
 # Verify pvs works on each device to give us vgname
 aux hide_dev "$dev2"
 check pv_field "$dev1" vg_name $vg1
@@ -55,9 +69,16 @@ aux hide_dev "$dev1"
 check pv_field "$dev2" vg_name $vg1
 aux unhide_dev "$dev1"
 
+lvmdevices || true
+pvs -a -o+uuid
+
 # Import the cloned PV to a new VG
 vgimportclone --basevgname $vg2 "$dev2"
 
+lvmdevices || true
+pvs -a -o+uuid
+vgs
+
 # Verify we can activate / deactivate the LV from both VGs
 lvchange -ay $vg1/$lv1 $vg2/$lv1
 vgchange -an $vg1 $vg2
diff --git a/tools/vgimportclone.c b/tools/vgimportclone.c
index 55a2deb4d..8aa0dbba9 100644
--- a/tools/vgimportclone.c
+++ b/tools/vgimportclone.c
@@ -160,7 +160,7 @@ static int _update_vg(struct cmd_context *cmd, struct volume_group *vg,
 	 * will be included in the metadata.  The device file is written
 	 * (with these additions) at the end of the command.
 	 */
-	if (vp->import_devices) {
+	if (vp->import_devices || cmd->enable_devices_file) {
 		dm_list_iterate_items(devl, &vp->new_devs) {
 			if (!device_id_add(cmd, devl->dev, devl->dev->pvid, NULL, NULL)) {
 				log_error("Failed to add device id for %s.", dev_name(devl->dev));
@@ -506,7 +506,7 @@ retry_name:
 	 * Should we be using device_ids_validate to check/fix other
 	 * devs in the devices file?
 	 */
-	if (vp.import_devices) {
+	if (vp.import_devices || cmd->enable_devices_file) {
 		if (!device_ids_write(cmd)) {
 			log_error("Failed to write devices file.");
 			goto out;




More information about the lvm-devel mailing list