Blame SOURCES/0061-vgimportdevices-change-result-when-devices-are-not-a.patch

f358f0
From f1d8c01dff3f8839355004e5fd77e9cd521e26cb Mon Sep 17 00:00:00 2001
f358f0
From: David Teigland <teigland@redhat.com>
f358f0
Date: Mon, 29 Aug 2022 15:17:36 -0500
f358f0
Subject: [PATCH 1/4] vgimportdevices: change result when devices are not added
f358f0
f358f0
When using --all, if one VG is skipped, continue adding
f358f0
other VGs, and do not return an error from the command
f358f0
if some VGs are added. (A VG is skipped if it's missing PVs.)
f358f0
f358f0
If the command fails during devices file setup or device
f358f0
scanning, then remove the devices file if it has been
f358f0
newly created by the command, and exit with an error.
f358f0
f358f0
If devices from a named VG are not imported (e.g. the
f358f0
VG is missing devices), then remove the devices file if
f358f0
it has been newly created by the command, and exit with
f358f0
an error.
f358f0
f358f0
If --all VGs are being imported, and no devices are found
f358f0
to include in the devices file, then remove the devices
f358f0
file if it has been newly created by the command, and
f358f0
exit with an error.
f358f0
---
f358f0
 test/shell/vgimportdevices.sh | 308 ++++++++++++++++++++++++++++++++++
f358f0
 tools/vgimportdevices.c       |  41 +++--
f358f0
 2 files changed, 336 insertions(+), 13 deletions(-)
f358f0
 create mode 100644 test/shell/vgimportdevices.sh
f358f0
f358f0
diff --git a/test/shell/vgimportdevices.sh b/test/shell/vgimportdevices.sh
f358f0
new file mode 100644
f358f0
index 000000000..47363cec3
f358f0
--- /dev/null
f358f0
+++ b/test/shell/vgimportdevices.sh
f358f0
@@ -0,0 +1,308 @@
f358f0
+
f358f0
+#!/usr/bin/env bash
f358f0
+
f358f0
+# Copyright (C) 2020 Red Hat, Inc. All rights reserved.
f358f0
+#
f358f0
+# This copyrighted material is made available to anyone wishing to use,
f358f0
+# modify, copy, or redistribute it subject to the terms and conditions
f358f0
+# of the GNU General Public License v.2.
f358f0
+#
f358f0
+# You should have received a copy of the GNU General Public License
f358f0
+# along with this program; if not, write to the Free Software Foundation,
f358f0
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
f358f0
+
f358f0
+test_description='vgimportdevices'
f358f0
+
f358f0
+. lib/inittest
f358f0
+
f358f0
+aux prepare_devs 5
f358f0
+
f358f0
+DFDIR="$LVM_SYSTEM_DIR/devices"
f358f0
+mkdir "$DFDIR" || true
f358f0
+DF="$DFDIR/system.devices"
f358f0
+
f358f0
+aux lvmconf 'devices/use_devicesfile = 1'
f358f0
+
f358f0
+not ls "$DF"
f358f0
+pvcreate "$dev1"
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+rm -f "$DF"
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+
f358f0
+#
f358f0
+# vgimportdevices -a with no prev df
f358f0
+#
f358f0
+
f358f0
+# no devs found
f358f0
+not vgimportdevices -a
f358f0
+not ls "$DF"
f358f0
+
f358f0
+# one orphan pv, no vgs
f358f0
+pvcreate "$dev1"
f358f0
+rm -f "$DF"
f358f0
+not vgimportdevices -a
f358f0
+not ls "$DF"
f358f0
+
f358f0
+# one complete vg
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+rm -f "$DF"
f358f0
+vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# two complete vgs
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgcreate $vg2 "$dev2"
f358f0
+rm -f "$DF"
f358f0
+vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# one incomplete vg
f358f0
+vgcreate $vg1 "$dev1" "$dev2"
f358f0
+lvcreate -l1 -an $vg1
f358f0
+rm -f "$DF"
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+not vgimportdevices -a
f358f0
+not ls "$DF"
f358f0
+vgs $vg1
f358f0
+pvs "$dev2"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# three complete, one incomplete vg
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgcreate $vg2 "$dev2"
f358f0
+vgcreate $vg3 "$dev3"
f358f0
+vgcreate $vg4 "$dev4" "$dev5"
f358f0
+rm -f "$DF"
f358f0
+dd if=/dev/zero of="$dev5" bs=1M count=1
f358f0
+vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+grep "$dev3" "$DF"
f358f0
+not grep "$dev4" "$DF"
f358f0
+not grep "$dev5" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev3" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev4" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+
f358f0
+#
f358f0
+# vgimportdevices -a with existing df
f358f0
+#
f358f0
+
f358f0
+# no devs found
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+grep "$dev1" "$DF"
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+not vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+
f358f0
+# one complete vg
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+vgcreate --devicesfile "" $vg2 "$dev2"
f358f0
+not grep "$dev2" "$DF"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# two complete vgs
f358f0
+vgcreate --devicesfile "" $vg1 "$dev1"
f358f0
+vgcreate --devicesfile "" $vg2 "$dev2"
f358f0
+rm -f "$DF"
f358f0
+vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# one incomplete vg
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+vgcreate --devicesfile "" $vg2 "$dev2" "$dev3"
f358f0
+not grep "$dev2" "$DF"
f358f0
+not grep "$dev3" "$DF"
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+not vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev3" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# import the same vg again
f358f0
+vgcreate --devicesfile "" $vg1 "$dev1"
f358f0
+not ls "$DF"
f358f0
+vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+vgimportdevices -a
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# import a series of vgs
f358f0
+vgcreate --devicesfile "" $vg1 "$dev1"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+vgcreate --devicesfile "" $vg2 "$dev2"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+vgcreate --devicesfile "" $vg3 "$dev3"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+grep "$dev3" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev3" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+#
f358f0
+# vgimportdevices vg with no prev df
f358f0
+#
f358f0
+
f358f0
+# no devs found
f358f0
+not vgimportdevices $vg1
f358f0
+not ls "$DF"
f358f0
+
f358f0
+# one complete vg
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+rm -f "$DF"
f358f0
+vgimportdevices $vg1
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# two complete vgs
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgcreate $vg2 "$dev2"
f358f0
+rm -f "$DF"
f358f0
+vgimportdevices $vg1
f358f0
+ls "$DF"
f358f0
+grep "$dev1" "$DF"
f358f0
+vgimportdevices $vg2
f358f0
+ls "$DF"
f358f0
+grep "$dev2" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# one incomplete vg
f358f0
+vgcreate $vg1 "$dev1" "$dev2"
f358f0
+lvcreate -l1 -an $vg1
f358f0
+rm -f "$DF"
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+not vgimportdevices $vg1
f358f0
+not ls "$DF"
f358f0
+vgs $vg1
f358f0
+pvs "$dev2"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# three complete, one incomplete vg
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgcreate $vg2 "$dev2"
f358f0
+vgcreate $vg3 "$dev3"
f358f0
+vgcreate $vg4 "$dev4" "$dev5"
f358f0
+rm -f "$DF"
f358f0
+dd if=/dev/zero of="$dev5" bs=1M count=1
f358f0
+not vgimportdevices $vg4
f358f0
+not ls "$DF"
f358f0
+vgimportdevices $vg3
f358f0
+ls "$DF"
f358f0
+grep "$dev3" "$DF"
f358f0
+not grep "$dev1" "$DF"
f358f0
+not grep "$dev2" "$DF"
f358f0
+not grep "$dev4" "$DF"
f358f0
+not grep "$dev5" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev3" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev4" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+#
f358f0
+# vgimportdevices vg with existing df
f358f0
+#
f358f0
+
f358f0
+# vg not found
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+not vgimportdevices $vg2
f358f0
+grep "$dev1" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
+# vg incomplete
f358f0
+vgcreate $vg1 "$dev1"
f358f0
+vgimportdevices -a
f358f0
+grep "$dev1" "$DF"
f358f0
+vgcreate --devicesfile "" $vg2 "$dev2" "$dev3"
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+not vgimportdevices $vg2
f358f0
+grep "$dev1" "$DF"
f358f0
+not grep "$dev2" "$DF"
f358f0
+not grep "$dev3" "$DF"
f358f0
+
f358f0
+# reset
f358f0
+dd if=/dev/zero of="$dev1" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev2" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev3" bs=1M count=1
f358f0
+dd if=/dev/zero of="$dev4" bs=1M count=1
f358f0
+rm -f "$DF"
f358f0
+
f358f0
diff --git a/tools/vgimportdevices.c b/tools/vgimportdevices.c
f358f0
index ea205d941..9ade1b9e4 100644
f358f0
--- a/tools/vgimportdevices.c
f358f0
+++ b/tools/vgimportdevices.c
f358f0
@@ -36,9 +36,9 @@ static int _vgimportdevices_single(struct cmd_context *cmd,
f358f0
 	dm_list_iterate_items(pvl, &vg->pvs) {
f358f0
 		if (is_missing_pv(pvl->pv) || !pvl->pv->dev) {
f358f0
 			memcpy(pvid, &pvl->pv->id.uuid, ID_LEN);
f358f0
-			log_error("Not importing devices for VG %s with missing PV %s.",
f358f0
-				 vg->name, pvid);
f358f0
-			goto bad;
f358f0
+			log_print("Not importing devices for VG %s with missing PV %s.",
f358f0
+				  vg->name, pvid);
f358f0
+			return ECMD_PROCESSED;
f358f0
 		}
f358f0
 	}
f358f0
 
f358f0
@@ -71,14 +71,17 @@ static int _vgimportdevices_single(struct cmd_context *cmd,
f358f0
 		updated_pvs++;
f358f0
 	}
f358f0
 
f358f0
+	/*
f358f0
+	 * Writes the device_id of each PV into the vg metadata.
f358f0
+	 * This is not a critial step and should not influence
f358f0
+	 * the result of the command.
f358f0
+	 */
f358f0
 	if (updated_pvs) {
f358f0
 		if (!vg_write(vg) || !vg_commit(vg))
f358f0
-			goto_bad;
f358f0
+			log_print("Failed to write device ids in VG metadata.");
f358f0
 	}
f358f0
 
f358f0
 	return ECMD_PROCESSED;
f358f0
-bad:
f358f0
-	return ECMD_FAILED;
f358f0
 }
f358f0
 
f358f0
 /*
f358f0
@@ -114,6 +117,7 @@ int vgimportdevices(struct cmd_context *cmd, int argc, char **argv)
f358f0
 {
f358f0
 	struct vgimportdevices_params vp = { 0 };
f358f0
 	struct processing_handle *handle;
f358f0
+	int created_file = 0;
f358f0
 	int ret = ECMD_FAILED;
f358f0
 
f358f0
 	if (arg_is_set(cmd, foreign_ARG))
f358f0
@@ -139,9 +143,12 @@ int vgimportdevices(struct cmd_context *cmd, int argc, char **argv)
f358f0
 		log_error("Devices file not enabled.");
f358f0
 		return ECMD_FAILED;
f358f0
 	}
f358f0
-	if (!devices_file_exists(cmd) && !devices_file_touch(cmd)) {
f358f0
-		log_error("Failed to create devices file.");
f358f0
-		return ECMD_FAILED;
f358f0
+	if (!devices_file_exists(cmd)) {
f358f0
+	       	if (!devices_file_touch(cmd)) {
f358f0
+			log_error("Failed to create devices file.");
f358f0
+			return ECMD_FAILED;
f358f0
+		}
f358f0
+		created_file = 1;
f358f0
 	}
f358f0
 
f358f0
 	/*
f358f0
@@ -195,22 +202,30 @@ int vgimportdevices(struct cmd_context *cmd, int argc, char **argv)
f358f0
 	 */
f358f0
 	ret = process_each_vg(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE,
f358f0
 			      0, handle, _vgimportdevices_single);
f358f0
-	if (ret == ECMD_FAILED)
f358f0
-		goto out;
f358f0
+	if (ret == ECMD_FAILED) {
f358f0
+		/*
f358f0
+		 * Error from setting up devices file or label_scan,
f358f0
+		 * _vgimportdevices_single does not return an error.
f358f0
+		 */
f358f0
+		goto_out;
f358f0
+	}
f358f0
 
f358f0
 	if (!vp.added_devices) {
f358f0
-		log_print("No devices to add.");
f358f0
+		log_error("No devices to add.");
f358f0
+		ret = ECMD_FAILED;
f358f0
 		goto out;
f358f0
 	}
f358f0
 
f358f0
 	if (!device_ids_write(cmd)) {
f358f0
-		log_print("Failed to update devices file.");
f358f0
+		log_error("Failed to write the devices file.");
f358f0
 		ret = ECMD_FAILED;
f358f0
 		goto out;
f358f0
 	}
f358f0
 
f358f0
 	log_print("Added %u devices to devices file.", vp.added_devices);
f358f0
 out:
f358f0
+	if ((ret == ECMD_FAILED) && created_file)
f358f0
+		unlink(cmd->devices_file_path);
f358f0
 	destroy_processing_handle(cmd, handle);
f358f0
 	return ret;
f358f0
 }
f358f0
-- 
f358f0
2.38.1
f358f0