mrc0mmand / rpms / lvm2

Forked from rpms/lvm2 3 years ago
Clone
Blob Blame History Raw
 lib/metadata/metadata.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index dc1b501..f7eeb52 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -3504,19 +3504,41 @@ static void _set_pv_device(struct format_instance *fid,
 			   struct physical_volume *pv)
 {
 	char buffer[64] __attribute__((aligned(8)));
+	struct cmd_context *cmd = fid->fmt->cmd;
+	struct device *dev;
 	uint64_t size;
 
-	if (!(pv->dev = lvmcache_device_from_pvid(fid->fmt->cmd, &pv->id, &pv->label_sector))) {
+	if (!(dev = lvmcache_device_from_pvid(cmd, &pv->id, &pv->label_sector))) {
 		if (!id_write_format(&pv->id, buffer, sizeof(buffer)))
 			buffer[0] = '\0';
 
-		if (fid->fmt->cmd && !fid->fmt->cmd->pvscan_cache_single)
+		if (cmd && !cmd->pvscan_cache_single)
 			log_warn("WARNING: Couldn't find device with uuid %s.", buffer);
 		else
 			log_debug_metadata("Couldn't find device with uuid %s.", buffer);
 	}
 
 	/*
+	 * If the device and PV are not the size, it's a clue that we might
+	 * be reading an MD component (but not necessarily). Skip this check:
+	 * . if md component detection is disabled
+	 * . if we are already doing full a md check in label scan
+	 * . if md_component_checks is auto, not none (full means use_full_md_check is set)
+	 */
+	if (dev && (pv->size != dev->size) && cmd &&
+	    cmd->md_component_detection &&
+	    !cmd->use_full_md_check &&
+	    !strcmp(cmd->md_component_checks, "auto")) {
+		if (dev_is_md_component(dev, NULL, 1)) {
+			log_warn("WARNING: device %s is an md component, not setting device for PV.",
+				 dev_name(dev));
+			dev = NULL;
+		}
+	}
+
+	pv->dev = dev;
+
+	/*
 	 * A previous command wrote the VG while this dev was missing, so
 	 * the MISSING flag was included in the PV.
 	 */