Blame SOURCES/0003-libmultipath-allow-force-reload-with-no-active-paths.patch

96a22b
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
96a22b
From: Benjamin Marzinski <bmarzins@redhat.com>
96a22b
Date: Thu, 19 Mar 2020 22:17:51 -0500
96a22b
Subject: [PATCH] libmultipath: allow force reload with no active paths
96a22b
96a22b
If the partition information has changed on multipath devices (say,
96a22b
because it was updated on another node that has access to the same
96a22b
storage), users expect that running "multipathd reconfigure" will update
96a22b
that.  However, if the checkers for the multipath device are pending for
96a22b
too long when the the device is reconfigured, multipathd will give up
96a22b
waiting for them, and refuse to reload the device, since there are no
96a22b
active paths. This means that no kpartx update will be triggered.
96a22b
96a22b
Multipath is fully capable of reloading a multipath device that has no
96a22b
active paths. This has been possible for years. If multipath is supposed
96a22b
to reload the device, it should do so, even if there are no active paths.
96a22b
96a22b
Generally, when multipath is force reloaded, kpartx will be updated.
96a22b
However when a device is reloaded with no paths, the udev rules won't
96a22b
run kpartx.  But they also weren't running kpartx when the first valid
96a22b
path appeared, even though the dm activation rules get run in this case.
96a22b
This changes 11-dm-mpath.rules to run kpartx when a device goes from no
96a22b
usable paths to having usable paths.
96a22b
96a22b
Reviewed-by: Martin Wilck <mwilck@suse.com>
96a22b
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
96a22b
---
96a22b
 libmultipath/configure.c    | 6 ------
96a22b
 multipath/11-dm-mpath.rules | 2 +-
96a22b
 2 files changed, 1 insertion(+), 7 deletions(-)
96a22b
96a22b
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
96a22b
index c95848a0..96c79610 100644
96a22b
--- a/libmultipath/configure.c
96a22b
+++ b/libmultipath/configure.c
96a22b
@@ -710,12 +710,6 @@ select_action (struct multipath * mpp, vector curmp, int force_reload)
96a22b
 		return;
96a22b
 	}
96a22b
 
96a22b
-	if (pathcount(mpp, PATH_UP) == 0) {
96a22b
-		mpp->action = ACT_IMPOSSIBLE;
96a22b
-		condlog(3, "%s: set ACT_IMPOSSIBLE (no usable path)",
96a22b
-			mpp->alias);
96a22b
-		return;
96a22b
-	}
96a22b
 	if (force_reload) {
96a22b
 		mpp->force_udev_reload = 1;
96a22b
 		mpp->action = ACT_RELOAD;
96a22b
diff --git a/multipath/11-dm-mpath.rules b/multipath/11-dm-mpath.rules
96a22b
index 07320a14..cd522e8c 100644
96a22b
--- a/multipath/11-dm-mpath.rules
96a22b
+++ b/multipath/11-dm-mpath.rules
96a22b
@@ -75,7 +75,7 @@ ENV{MPATH_DEVICE_READY}=="0", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1"
96a22b
 ENV{MPATH_DEVICE_READY}!="0", ENV{.MPATH_DEVICE_READY_OLD}=="0",\
96a22b
 	ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="$env{DM_DISABLE_OTHER_RULES_FLAG_OLD}",\
96a22b
 	ENV{DM_DISABLE_OTHER_RULES_FLAG_OLD}="",\
96a22b
-	ENV{DM_ACTIVATION}="1"
96a22b
+	ENV{DM_ACTIVATION}="1", ENV{MPATH_UNCHANGED}="0"
96a22b
 
96a22b
 # The code to check multipath state ends here. We need to set
96a22b
 # properties and symlinks regardless whether the map is usable or
96a22b
-- 
96a22b
2.17.2
96a22b