multipathd: Fixing add map functionality
authorTejaswini Poluri <tpoluri@mvista.com>
Tue, 28 Jul 2015 09:56:56 +0000 (15:26 +0530)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 6 Aug 2015 07:20:48 +0000 (09:20 +0200)
Add map feature of multipathd tools fails as the device
is also been completely removed along with removing the map
in the remove map code(ev_remove_map()).
So when add map is called we are creating the device again
in cli_add_map() using the coloasce_paths code.

Signed-off-by:Tejaswini Poluri <tpoluri@mvista.com>

multipathd/cli_handlers.c

index dc96c45..a5aba52 100644 (file)
@@ -535,8 +535,8 @@ cli_add_map (void * v, char ** reply, int * len, void * data)
        char * param = get_keyparam(v, MAP);
        int major, minor;
        char dev_path[PATH_SIZE];
-       char *alias;
-       int rc;
+       char *alias, *refwwid;
+       int rc, count = 0;
 
        param = convert_dev(param, 0);
        condlog(2, "%s: add map (operator)", param);
@@ -545,27 +545,40 @@ cli_add_map (void * v, char ** reply, int * len, void * data)
                *reply = strdup("blacklisted\n");
                *len = strlen(*reply) + 1;
                condlog(2, "%s: map blacklisted", param);
-               return 0;
-       }
-       minor = dm_get_minor(param);
-       if (minor < 0) {
-               condlog(2, "%s: not a device mapper table", param);
-               return 0;
-       }
-       major = dm_get_major(param);
-       if (major < 0) {
-               condlog(2, "%s: not a device mapper table", param);
-               return 0;
+               return 1;
        }
-       sprintf(dev_path,"dm-%d", minor);
-       alias = dm_mapname(major, minor);
+       do {
+               minor = dm_get_minor(param);
+               if (minor < 0)
+                       condlog(2, "%s: not a device mapper table", param);
+               major = dm_get_major(param);
+               if (major < 0)
+                       condlog(2, "%s: not a device mapper table", param);
+               sprintf(dev_path, "dm-%d", minor);
+               alias = dm_mapname(major, minor);
+               /*if there is no mapname found, we first create the device*/
+               if (!alias && !count) {
+                       condlog(2, "%s: mapname not found for %d:%d",
+                               param, major, minor);
+                       rc = get_refwwid(param, DEV_DEVMAP, vecs->pathvec,
+                                                               &refwwid);
+                       if (refwwid) {
+                               if (coalesce_paths(vecs, NULL, refwwid, 0))
+                                       condlog(2, "%s: coalesce_paths failed",
+                                                                       param);
+                               dm_lib_release();
+                       }
+               } /*we attempt to create device only once*/
+               count++;
+       } while (!alias && (count < 2));
+
        if (!alias) {
-               condlog(2, "%s: mapname not found for %d:%d",
-                       param, major, minor);
-               return 0;
+               condlog(2, "%s: add map failed", param);
+               return 1;
        }
        rc = ev_add_map(dev_path, alias, vecs);
        FREE(alias);
+       FREE(refwwid);
        return rc;
 }