libmultipath: should_multipath: keep existing maps
authorMartin Wilck <mwilck@suse.com>
Fri, 13 Apr 2018 21:59:56 +0000 (23:59 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Fri, 11 May 2018 08:48:24 +0000 (10:48 +0200)
with find_multipaths "yes" and without the "-n" option to multipathd,
if a path is already multipathed, keep it. The same logic is applied by
"multipath -u -i".

To do this, we need to add a "mpvec" parameter to should_multipath().

Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/configure.c
libmultipath/wwids.c
libmultipath/wwids.h
multipathd/main.c

index 61f68f8..6df8359 100644 (file)
@@ -987,7 +987,7 @@ int coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid,
                        continue;
 
                /* If find_multipaths was selected check if the path is valid */
-               if (!refwwid && !should_multipath(pp1, pathvec)) {
+               if (!refwwid && !should_multipath(pp1, pathvec, curmp)) {
                        orphan_path(pp1, "only one path");
                        continue;
                }
index 8c21b33..d0256c2 100644 (file)
@@ -15,6 +15,7 @@
 #include "wwids.h"
 #include "defaults.h"
 #include "config.h"
+#include "devmapper.h"
 
 /*
  * Copyright (c) 2010 Benjamin Marzinski, Redhat
@@ -274,7 +275,7 @@ out:
 }
 
 int
-should_multipath(struct path *pp1, vector pathvec)
+should_multipath(struct path *pp1, vector pathvec, vector mpvec)
 {
        int i, ignore_new_devs, find_multipaths;
        struct path *pp2;
@@ -289,6 +290,15 @@ should_multipath(struct path *pp1, vector pathvec)
 
        condlog(4, "checking if %s should be multipathed", pp1->dev);
        if (!ignore_new_devs) {
+               char tmp_wwid[WWID_SIZE];
+               struct multipath *mp = find_mp_by_wwid(mpvec, pp1->wwid);
+
+               if (mp != NULL && dm_get_uuid(mp->alias, tmp_wwid) == 0 &&
+                   !strncmp(tmp_wwid, pp1->wwid, WWID_SIZE)) {
+                       condlog(3, "wwid %s is already multipathed, keeping it",
+                               pp1->wwid);
+                       return 1;
+               }
                vector_foreach_slot(pathvec, pp2, i) {
                        if (pp1->dev == pp2->dev)
                                continue;
index 9527012..d9a78b3 100644 (file)
@@ -12,7 +12,7 @@
 "#\n" \
 "# Valid WWIDs:\n"
 
-int should_multipath(struct path *pp, vector pathvec);
+int should_multipath(struct path *pp, vector pathvec, vector mpvec);
 int remember_wwid(char *wwid);
 int check_wwids_file(char *wwid, int write_wwid);
 int remove_wwid(char *wwid);
index 17175a8..20b6fe0 100644 (file)
@@ -940,7 +940,7 @@ rescan:
                mpp->action = ACT_RELOAD;
                extract_hwe_from_path(mpp);
        } else {
-               if (!should_multipath(pp, vecs->pathvec)) {
+               if (!should_multipath(pp, vecs->pathvec, vecs->mpvec)) {
                        orphan_path(pp, "only one path");
                        return 0;
                }