[PATCH 3/3] multipath: get_dm_mpvec: discard broken maps

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Martin Wilck <mwilck@xxxxxxxx>

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 <mwilck@xxxxxxxx>
---
 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
dm-devel@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/dm-devel




[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux