[lvm-devel] main - fix for md component detection changes

David Teigland teigland at sourceware.org
Mon Feb 8 17:25:00 UTC 2021


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=018bba897ca13521988eb36a89fd054e15feb231
Commit:        018bba897ca13521988eb36a89fd054e15feb231
Parent:        df4c50396bfce6586a063d04861f9d1d8b1aeb31
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Mon Feb 8 11:23:42 2021 -0600
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Mon Feb 8 11:23:42 2021 -0600

fix for md component detection changes

And some fine tuning of when the checks are applied
in "start" mode.
---
 lib/cache/lvmcache.c | 56 +++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 40 insertions(+), 16 deletions(-)

diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 5c573286d..e05530a53 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -1056,7 +1056,8 @@ void lvmcache_extra_md_component_checks(struct cmd_context *cmd)
 	struct device *dev;
 	const char *device_hint;
 	uint64_t devsize, pvsize;
-	int do_check;
+	int do_check_size, do_check_name;
+	int md_check_start;
 
 	/*
 	 * use_full_md_check: if set then no more needs to be done here,
@@ -1073,9 +1074,11 @@ void lvmcache_extra_md_component_checks(struct cmd_context *cmd)
 	 * function is looking for.
 	 */
 	if (!cmd->md_component_detection || cmd->use_full_md_check ||
-	    !strcmp(cmd->md_component_checks, "none") || !strcmp(cmd->md_component_checks, "start"))
+	    !strcmp(cmd->md_component_checks, "none"))
 		return;
 
+	md_check_start = !strcmp(cmd->md_component_checks, "start");
+
 	/*
 	 * We want to avoid extra scanning for end-of-device md superblocks
 	 * whenever possible, since it can add up to a lot of extra io if we're
@@ -1093,7 +1096,8 @@ void lvmcache_extra_md_component_checks(struct cmd_context *cmd)
 			device_hint = _get_pvsummary_device_hint(dev->pvid);
 			pvsize = _get_pvsummary_size(dev->pvid);
 			devsize = dev->size;
-			do_check = 0;
+			do_check_size = 0;
+			do_check_name = 0;
 
 			if (!devsize && !dev_get_size(dev, &devsize))
 				log_debug("No size for %s.", dev_name(dev));
@@ -1103,23 +1107,43 @@ void lvmcache_extra_md_component_checks(struct cmd_context *cmd)
 			 * can be common, but not as often as PV larger.
 			 */
 			if (pvsize && devsize && (pvsize != devsize))
-				do_check = 1;
-			else if (device_hint && !strcmp(device_hint, "/dev/md"))
-				do_check = 1;
+				do_check_size = 1;
+			if (device_hint && !strncmp(device_hint, "/dev/md", 7))
+				do_check_name = 1;
+
+			if (!do_check_size && !do_check_name)
+				continue;
 
-			if (do_check) {
-				log_debug("extra md component check %llu %llu device_hint %s dev %s",
+			/*
+			 * If only the size is different (which can be fairly
+			 * common for non-md-component devs) and the user has
+			 * set "start" to disable full md checks, then skip it.
+			 * If the size is different, *and* the device name hint
+			 * looks like an md device, then it seems very likely
+			 * to be an md component, so do a full check on it even
+			 * if the user has set "start".
+			 * 
+			 * In "auto" mode, do a full check if either the size
+			 * or the name indicates a possible md component.
+			 */
+			if (do_check_size && !do_check_name && md_check_start) {
+				log_debug("extra md component check skip %llu %llu device_hint %s dev %s",
 					  (unsigned long long)pvsize, (unsigned long long)devsize,
 					  device_hint ?: "none", dev_name(dev));
+				continue;
+			}
 
-				if (dev_is_md_component(dev, NULL, 1)) {
-					log_debug("dropping PV from md component %s", dev_name(dev));
-					dev->flags &= ~DEV_SCAN_FOUND_LABEL;
-					/* lvmcache_del will also delete vginfo if info was last one */
-					lvmcache_del(info);
-					lvmcache_del_dev_from_duplicates(dev);
-					cmd->filter->wipe(cmd, cmd->filter, dev, NULL);
-				}
+			log_debug("extra md component check %llu %llu device_hint %s dev %s",
+				  (unsigned long long)pvsize, (unsigned long long)devsize,
+				  device_hint ?: "none", dev_name(dev));
+
+			if (dev_is_md_component(dev, NULL, 1)) {
+				log_debug("dropping PV from md component %s", dev_name(dev));
+				dev->flags &= ~DEV_SCAN_FOUND_LABEL;
+				/* lvmcache_del will also delete vginfo if info was last one */
+				lvmcache_del(info);
+				lvmcache_del_dev_from_duplicates(dev);
+				cmd->filter->wipe(cmd, cmd->filter, dev, NULL);
 			}
 		}
 	}




More information about the lvm-devel mailing list