From: Martin Wilck <[email protected]>

Use the same logic as map_discovery() to discard maps that
couldn't be parsed successfully. If map parsing fails,
certain vital fields of the mpp, like features or hwhandler,
will not be set, which might cause multipath to crash later on.

Signed-off-by: Martin Wilck <[email protected]>
---
 multipath/main.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/multipath/main.c b/multipath/main.c
index 80bc4b5..2d7ec74 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -193,7 +193,7 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector 
pathvec, char * refwwid)
 {
        int i;
        struct multipath * mpp;
-       char params[PARAMS_SIZE], status[PARAMS_SIZE];
+       int flags = (cmd == CMD_LIST_SHORT ? DI_NOIO : DI_ALL);
 
        if (dm_get_maps(curmp))
                return 1;
@@ -205,27 +205,22 @@ 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);
-                       free_multipath(mpp, KEEP_PATHS);
-                       vector_del_slot(curmp, i);
+                       remove_map(mpp, pathvec, curmp, PURGE_VEC);
                        i--;
                        continue;
                }
 
-               dm_get_map(mpp->alias, &mpp->size, params);
-               condlog(3, "params = %s", params);
-               dm_get_status(mpp->alias, status);
-               condlog(3, "status = %s", status);
-
-               disassemble_map(pathvec, params, mpp);
-               update_pathvec_from_dm(pathvec, mpp,
-                                      (cmd == CMD_LIST_SHORT ?
-                                       DI_NOIO : DI_ALL));
+               if (update_multipath_table(mpp, pathvec, flags) != DMP_OK ||
+                   update_multipath_status(mpp) != DMP_OK) {
+                       condlog(1, "error parsing map %s", mpp->wwid);
+                       remove_map(mpp, pathvec, curmp, PURGE_VEC);
+                       i--;
+                       continue;
+               }
 
                if (cmd == CMD_LIST_LONG)
                        mpp->bestpg = select_path_group(mpp);
 
-               disassemble_status(status, mpp);
-
                if (cmd == CMD_LIST_SHORT ||
                    cmd == CMD_LIST_LONG) {
                        struct config *conf = get_multipath_config();
-- 
2.28.0


--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to