Move the removal of an mpp from the mpvec into a separate function,
remove_map_from_mpvec(). There should be no functional differences
so far.

Signed-off-by: Martin Wilck <[email protected]>
Reviewed-by: Benjamin Marzinski <[email protected]>
---
 libmultipath/configure.c          | 14 +++++++-------
 libmultipath/libmultipath.version |  1 +
 libmultipath/structs_vec.c        | 26 +++++++++++++-------------
 libmultipath/structs_vec.h        |  3 ++-
 multipath/main.c                  |  8 ++++----
 multipathd/main.c                 | 17 ++++++++++-------
 6 files changed, 37 insertions(+), 32 deletions(-)

diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index baa1357..2d324ad 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -1140,7 +1140,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, 
char *refwwid,
 
                if (!mpp->paths) {
                        condlog(0, "%s: skip coalesce (no paths)", mpp->alias);
-                       remove_map(mpp, vecs->pathvec, NULL);
+                       remove_map(mpp, vecs->pathvec);
                        continue;
                }
 
@@ -1172,7 +1172,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, 
char *refwwid,
                if (cmd == CMD_DRY_RUN && mpp->action == ACT_UNDEF)
                        mpp->action = ACT_DRY_RUN;
                if (setup_map(mpp, &params, vecs)) {
-                       remove_map(mpp, vecs->pathvec, NULL);
+                       remove_map(mpp, vecs->pathvec);
                        continue;
                }
 
@@ -1192,7 +1192,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, 
char *refwwid,
                                condlog(2, "%s: %s map",
                                        mpp->alias, (mpp->action == ACT_CREATE)?
                                        "ignoring" : "removing");
-                               remove_map(mpp, vecs->pathvec, NULL);
+                               remove_map(mpp, vecs->pathvec);
                                continue;
                        } else /* if (r == DOMAP_RETRY && !is_daemon) */ {
                                ret = CP_RETRY;
@@ -1201,7 +1201,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, 
char *refwwid,
                }
                if (r == DOMAP_DRY) {
                        if (!vector_alloc_slot(newmp)) {
-                               remove_map(mpp, vecs->pathvec, NULL);
+                               remove_map(mpp, vecs->pathvec);
                                goto out;
                        }
                        vector_set_slot(newmp, mpp);
@@ -1224,20 +1224,20 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, 
char *refwwid,
 
                if (mpp->action != ACT_REJECT) {
                        if (!vector_alloc_slot(newmp)) {
-                               remove_map(mpp, vecs->pathvec, NULL);
+                               remove_map(mpp, vecs->pathvec);
                                goto out;
                        }
                        vector_set_slot(newmp, mpp);
                }
                else
-                       remove_map(mpp, vecs->pathvec, NULL);
+                       remove_map(mpp, vecs->pathvec);
        }
        ret = CP_OK;
 out:
        free(size_mismatch_seen);
        if (!mpvec) {
                vector_foreach_slot (newmp, mpp, i)
-                       remove_map(mpp, vecs->pathvec, NULL);
+                       remove_map(mpp, vecs->pathvec);
                vector_free(newmp);
        }
        return ret;
diff --git a/libmultipath/libmultipath.version 
b/libmultipath/libmultipath.version
index 89ae2a3..30b282f 100644
--- a/libmultipath/libmultipath.version
+++ b/libmultipath/libmultipath.version
@@ -159,6 +159,7 @@ global:
        remove_map;
        remove_map_by_alias;
        remove_map_callback;
+       remove_map_from_mpvec;
        remove_maps;
        remove_wwid;
        replace_wwids;
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index f651b29..7bceeb6 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -420,11 +420,16 @@ void remove_map_callback(struct multipath *mpp 
__attribute__((unused)))
 {
 }
 
-void
-remove_map(struct multipath *mpp, vector pathvec, vector mpvec)
+void remove_map_from_mpvec(const struct multipath *mpp, vector mpvec)
 {
-       int i;
+       int i = find_slot(mpvec, mpp);
 
+       if (i != -1)
+               vector_del_slot(mpvec, i);
+}
+
+void remove_map(struct multipath *mpp, vector pathvec)
+{
        remove_map_callback(mpp);
 
        free_pathvec(mpp->paths, KEEP_PATHS);
@@ -436,13 +441,6 @@ remove_map(struct multipath *mpp, vector pathvec, vector 
mpvec)
         */
        orphan_paths(pathvec, mpp, "map removed internally");
 
-       if (mpvec &&
-           (i = find_slot(mpvec, (void *)mpp)) != -1)
-               vector_del_slot(mpvec, i);
-
-       /*
-        * final free
-        */
        free_multipath(mpp, KEEP_PATHS);
 }
 
@@ -452,7 +450,8 @@ remove_map_by_alias(const char *alias, struct vectors * 
vecs)
        struct multipath * mpp = find_mp_by_alias(vecs->mpvec, alias);
        if (mpp) {
                condlog(2, "%s: removing map by alias", alias);
-               remove_map(mpp, vecs->pathvec, vecs->mpvec);
+               remove_map_from_mpvec(mpp, vecs->mpvec);
+               remove_map(mpp, vecs->pathvec);
        }
 }
 
@@ -466,7 +465,7 @@ remove_maps(struct vectors * vecs)
                return;
 
        vector_foreach_slot (vecs->mpvec, mpp, i)
-               remove_map(mpp, vecs->pathvec, NULL);
+               remove_map(mpp, vecs->pathvec);
 
        vector_free(vecs->mpvec);
        vecs->mpvec = NULL;
@@ -832,7 +831,8 @@ struct multipath *add_map_with_path(struct vectors *vecs, 
struct path *pp,
        return mpp;
 
 out:
-       remove_map(mpp, vecs->pathvec, vecs->mpvec);
+       remove_map_from_mpvec(mpp, vecs->mpvec);
+       remove_map(mpp, vecs->pathvec);
        return NULL;
 }
 
diff --git a/libmultipath/structs_vec.h b/libmultipath/structs_vec.h
index 1188ada..1eedfc8 100644
--- a/libmultipath/structs_vec.h
+++ b/libmultipath/structs_vec.h
@@ -23,7 +23,8 @@ int update_mpp_paths(struct multipath * mpp, vector pathvec);
 int update_multipath_strings (struct multipath *mpp, vector pathvec);
 void extract_hwe_from_path(struct multipath * mpp);
 
-void remove_map (struct multipath *mpp, vector pathvec, vector mpvec);
+void remove_map_from_mpvec(const struct multipath *mpp, vector mpvec);
+void remove_map(struct multipath *mpp, vector pathvec);
 void remove_map_by_alias(const char *alias, struct vectors * vecs);
 void remove_maps (struct vectors * vecs);
 
diff --git a/multipath/main.c b/multipath/main.c
index f2adcde..58db288 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -181,15 +181,15 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector 
pathvec, char * refwwid)
                if (refwwid && strlen(refwwid) &&
                    strncmp(mpp->wwid, refwwid, WWID_SIZE)) {
                        condlog(3, "skip map %s: out of scope", mpp->alias);
-                       remove_map(mpp, pathvec, curmp);
-                       i--;
+                       vector_del_slot(curmp, i--);
+                       remove_map(mpp, pathvec);
                        continue;
                }
 
                if (update_multipath_table(mpp, pathvec, flags) != DMP_OK) {
                        condlog(1, "error parsing map %s", mpp->wwid);
-                       remove_map(mpp, pathvec, curmp);
-                       i--;
+                       vector_del_slot(curmp, i--);
+                       remove_map(mpp, pathvec);
                        continue;
                }
 
diff --git a/multipathd/main.c b/multipathd/main.c
index d3bf4d0..6c29d5e 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -480,7 +480,8 @@ remove_map_and_stop_waiter(struct multipath *mpp, struct 
vectors *vecs)
        condlog(3, "%s: removing map from internal tables", mpp->alias);
        if (!poll_dmevents)
                stop_waiter_thread(mpp);
-       remove_map(mpp, vecs->pathvec, vecs->mpvec);
+       remove_map_from_mpvec(mpp, vecs->mpvec);
+       remove_map(mpp, vecs->pathvec);
 }
 
 static void
@@ -745,7 +746,8 @@ retry:
 fail:
        if (new_map && wait_for_events(mpp, vecs)) {
                condlog(0, "%s: failed to create new map", mpp->alias);
-               remove_map(mpp, vecs->pathvec, vecs->mpvec);
+               remove_map_from_mpvec(mpp, vecs->mpvec);
+               remove_map(mpp, vecs->pathvec);
                return 1;
        }
 
@@ -1439,7 +1441,8 @@ rescan:
                goto fail;
 
 fail_map:
-       remove_map(mpp, vecs->pathvec, vecs->mpvec);
+       remove_map_from_mpvec(mpp, vecs->mpvec);
+       remove_map(mpp, vecs->pathvec);
 fail:
        orphan_path(pp, "failed to add path");
        return 1;
@@ -1837,8 +1840,8 @@ map_discovery (struct vectors * vecs)
 
        vector_foreach_slot (vecs->mpvec, mpp, i)
                if (update_multipath_table(mpp, vecs->pathvec, DI_DISCOVERY) != 
DMP_OK) {
-                       remove_map(mpp, vecs->pathvec, vecs->mpvec);
-                       i--;
+                       vector_del_slot(vecs->mpvec, i--);
+                       remove_map(mpp, vecs->pathvec);
                }
 
        return 0;
@@ -3352,8 +3355,8 @@ configure (struct vectors * vecs, enum force_reload_types 
reload_type)
         */
        vector_foreach_slot(vecs->mpvec, mpp, i) {
                if (wait_for_events(mpp, vecs)) {
-                       remove_map(mpp, vecs->pathvec, vecs->mpvec);
-                       i--;
+                       vector_del_slot(vecs->mpvec, i--);
+                       remove_map(mpp, vecs->pathvec);
                        continue;
                }
                if (setup_multipath(vecs, mpp))
-- 
2.52.0


Reply via email to