None of the calls to update_map_pr() outside of mpath_pr_event_handle()
add any benefit. When update_map_pr() is called without a path, it tries
to read the pr keys list on each usable path until it succeeds, and then
checks the keys to see if they include the configured key.

In all cases where update_map_pr() is called outside of
mpath_pr_event_handle(), after it is called, pr_register_active_paths()
is called if a matching key was found. pr_register_active_paths() calls
mpath_pr_event_handle() on each usable path, which calls update_map_pr()
with a path, so it only checks that path. If a matching key is found, it
registers a key on the current path. The result is that after
pr_register_active_paths() is called, update_map_pr() will be called for
each usable path, just like update_map_pr() did. So calling
update_map_pr() first doesn't change the results for multipathd, it just
adds duplicate work, so remove those calls.

Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>
---
 multipathd/main.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/multipathd/main.c b/multipathd/main.c
index ace278f1..02cfe8d1 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -637,6 +637,8 @@ pr_register_active_paths(struct multipath *mpp)
 
        vector_foreach_slot (mpp->pg, pgp, i) {
                vector_foreach_slot (pgp->paths, pp, j) {
+                       if (mpp->prflag == PRFLAG_UNSET)
+                               return;
                        if ((pp->state == PATH_UP) || (pp->state == PATH_GHOST))
                                mpath_pr_event_handle(pp);
                }
@@ -726,10 +728,7 @@ fail:
 
        sync_map_state(mpp, false);
 
-       if (mpp->prflag != PRFLAG_SET)
-               update_map_pr(mpp, NULL);
-       if (mpp->prflag == PRFLAG_SET)
-               pr_register_active_paths(mpp);
+       pr_register_active_paths(mpp);
 
        if (VECTOR_SIZE(offline_paths) != 0)
                handle_orphaned_offline_paths(offline_paths);
@@ -1402,10 +1401,9 @@ rescan:
        sync_map_state(mpp, false);
 
        if (retries >= 0) {
-               if (start_waiter)
-                       update_map_pr(mpp, NULL);
-               if (mpp->prflag == PRFLAG_SET && prflag != PRFLAG_SET)
-                               pr_register_active_paths(mpp);
+               if ((mpp->prflag == PRFLAG_SET && prflag != PRFLAG_SET) ||
+                   start_waiter)
+                       pr_register_active_paths(mpp);
                condlog(2, "%s [%s]: path added to devmap %s",
                        pp->dev, pp->dev_t, mpp->alias);
                return 0;
@@ -3312,9 +3310,7 @@ configure (struct vectors * vecs, enum force_reload_types 
reload_type)
        vector_foreach_slot(mpvec, mpp, i){
                if (remember_wwid(mpp->wwid) == 1)
                        trigger_paths_udev_change(mpp, true);
-               update_map_pr(mpp, NULL);
-               if (mpp->prflag == PRFLAG_SET)
-                       pr_register_active_paths(mpp);
+               pr_register_active_paths(mpp);
        }
 
        /*
-- 
2.48.1


Reply via email to