reload_map() was calling select_action() with force_reload set. Since
mpp will always be a member of vecs->mpvec when reload_map() is called,
when cmpp and cmpp_by_name are looked up in select_action(), they will
just point to mpp. This means that none of the early checks related to
cmpp in select_action() will do anything, and the action will always
end up being ACT_RELOAD. So we can just set ACT_RELOAD in reload_map()
and skip the work.

Additionally, calling select_action() with force_reload set will set
force_udev_reload. This isn't necessary for any of the reload_map()
callers, and will just cause udev to do extra work. I did set
force_udev_reload in cli_reload(), so that it works like calling
"multipath -r", which does force udev to rescan the device.

Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>
---
 multipathd/cli_handlers.c | 1 +
 multipathd/main.c         | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index ec330d81..0849fe51 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -818,6 +818,7 @@ cli_reload(void *v, struct strbuf *reply, void *data)
                return 1;
        }
 
+       mpp->force_udev_reload = 1;
        return reload_and_sync_map(mpp, vecs);
 }
 
diff --git a/multipathd/main.c b/multipathd/main.c
index c1ae44f2..c0cf0d06 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2273,7 +2273,7 @@ static int reload_map(struct vectors *vecs, struct 
multipath *mpp,
                condlog(0, "%s: failed to setup map", mpp->alias);
                return 1;
        }
-       select_action(mpp, vecs->mpvec, 1);
+       mpp->action = ACT_RELOAD;
 
        r = domap(mpp, params, is_daemon);
        if (r == DOMAP_FAIL || r == DOMAP_RETRY) {
-- 
2.46.2


Reply via email to