[multipath] set devmap UUID to multipath WWID
authorChristophe Varoqui <cvaroqui@zezette.localdomain>
Thu, 29 Sep 2005 22:14:03 +0000 (00:14 +0200)
committerChristophe Varoqui <cvaroqui@zezette.localdomain>
Thu, 29 Sep 2005 22:14:03 +0000 (00:14 +0200)
If you use aliases to rename the multipath devices to something sensible you
lose the WWIDs, this patch stores them as the device-mapper UUID and retrieves
them so they can be displayed using multipath -l.

Patrick Caulfield, Redhat.

libmultipath/devmapper.c
libmultipath/devmapper.h
multipath/main.c

index 363b25f..7cd656f 100644 (file)
@@ -102,7 +102,7 @@ dm_simplecmd (int task, const char *name) {
 
 extern int
 dm_addmap (int task, const char *name, const char *target,
-          const char *params, unsigned long long size) {
+          const char *params, unsigned long long size, const char *uuid) {
        int r = 0;
        struct dm_task *dmt;
 
@@ -115,6 +115,9 @@ dm_addmap (int task, const char *name, const char *target,
        if (!dm_task_add_target (dmt, 0, size, target, params))
                goto addout;
 
+       if (uuid && !dm_task_set_uuid(dmt, uuid))
+               goto addout;
+
        dm_task_no_open_count(dmt);
 
        r = dm_task_run (dmt);
@@ -188,6 +191,34 @@ out:
 }
 
 extern int
+dm_get_uuid(char *name, char *uuid)
+{
+       struct dm_task *dmt;
+       const char *uuidtmp;
+
+       dmt = dm_task_create(DM_DEVICE_INFO);
+       if (!dmt)
+               return 1;
+
+        if (!dm_task_set_name (dmt, name))
+                goto uuidout;
+
+       if (!dm_task_run(dmt))
+                goto uuidout;
+
+       uuidtmp = dm_task_get_uuid(dmt);
+       if (uuidtmp)
+               strcpy(uuid, uuidtmp);
+       else
+               uuid[0] = '\0';
+
+uuidout:
+       dm_task_destroy(dmt);
+
+       return 0;
+}
+
+extern int
 dm_get_status(char * name, char * outstatus)
 {
        int r = 1;
@@ -556,6 +587,8 @@ dm_get_maps (vector mp, char * type)
                        if (dm_get_status(names->name, mpp->status))
                                goto out1;
 
+                       dm_get_uuid(names->name, mpp->wwid);
+
                        mpp->alias = MALLOC(strlen(names->name) + 1);
 
                        if (!mpp->alias)
index d930aae..4bdf705 100644 (file)
@@ -1,7 +1,7 @@
 int dm_prereq (char *, int, int, int);
 int dm_simplecmd (int, const char *);
 int dm_addmap (int, const char *, const char *, const char *,
-              unsigned long long);
+              unsigned long long, const char *uuid);
 int dm_map_present (char *);
 int dm_get_map(char *, unsigned long long *, char *);
 int dm_get_status(char *, char *);
index 8813a32..170bb2f 100644 (file)
@@ -625,7 +625,7 @@ domap (struct multipath * mpp)
         */
        dm_log_init_verbose(0);
 
-       r = dm_addmap(op, mpp->alias, DEFAULT_TARGET, mpp->params, mpp->size);
+       r = dm_addmap(op, mpp->alias, DEFAULT_TARGET, mpp->params, mpp->size, mpp->wwid);
 
        if (r == 0)
                dm_simplecmd(DM_DEVICE_REMOVE, mpp->alias);