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

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