[libmultipath] embed a struct dm_info pointer in struct multipath
authorChristophe Varoqui <root@xa-s05.(none)>
Mon, 31 Oct 2005 10:44:03 +0000 (11:44 +0100)
committerChristophe Varoqui <root@xa-s05.(none)>
Mon, 31 Oct 2005 10:44:03 +0000 (11:44 +0100)
- replace dm_get_state() by a generic dm_get_info()
- move mpp->minor users to mpp->dmi->minor
- move mpp->dmstate users to mpp->dmi->suspended
- cli handlers for resume/suspend map now trigger dm_get_info()
  instead of playing directly with mpp->dmstate : more reliable

libmultipath/devmapper.c
libmultipath/devmapper.h
libmultipath/print.c
libmultipath/structs.c
libmultipath/structs.h
multipathd/cli_handlers.c
multipathd/main.c

index 2544f95..ee241f2 100644 (file)
@@ -219,36 +219,6 @@ uuidout:
 }
 
 extern int
-dm_get_state(char *name, int *state)
-{
-       struct dm_task *dmt;
-       struct dm_info info;
-
-       dmt = dm_task_create(DM_DEVICE_INFO);
-       if (!dmt)
-               return 1;
-
-        if (!dm_task_set_name (dmt, name))
-                goto out;
-
-       if (!dm_task_run(dmt))
-                goto out;
-
-       if (!dm_task_get_info(dmt, &info))
-               goto out;
-
-       *state = info.suspended;
-       if (info.suspended)
-               *state = MAPSTATE_SUSPENDED;
-       else
-               *state = MAPSTATE_ACTIVE;
-
-out:
-       dm_task_destroy(dmt);
-       return 0;
-}
-
-extern int
 dm_get_status(char * name, char * outstatus)
 {
        int r = 1;
@@ -613,7 +583,6 @@ dm_get_maps (vector mp, char * type)
                                goto out1;
 
                        dm_get_uuid(names->name, mpp->wwid);
-                       dm_get_state(names->name, &mpp->dmstate);
                }
 
                if (!vector_alloc_slot(mp))
@@ -791,6 +760,52 @@ out:
        return r;
 }
 
+static struct dm_info *
+alloc_dminfo (void)
+{
+       return MALLOC(sizeof(struct dm_info));
+}
+
+int
+dm_get_info (char * mapname, struct dm_info ** dmi)
+{
+       int r = 1;
+       struct dm_task *dmt = NULL;
+       
+       if (!mapname)
+               return 1;
+
+       if (!*dmi)
+               *dmi = alloc_dminfo();
+
+       if (!*dmi)
+               return 1;
+
+       if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
+               goto out;
+
+       if (!dm_task_set_name(dmt, mapname))
+               goto out;
+
+       dm_task_no_open_count(dmt);
+
+       if (!dm_task_run(dmt))
+               goto out;
+
+       if (!dm_task_get_info(dmt, *dmi))
+               goto out;
+
+       r = 0;
+out:
+       if (r)
+               memset(*dmi, 0, sizeof(struct dm_info));
+
+       if (dmt)
+               dm_task_destroy(dmt);
+
+       return r;
+}
+
 #if 0
 int
 dm_rename (char * old, char * new)
index ad094eb..48b05ec 100644 (file)
@@ -22,6 +22,7 @@ int dm_get_minor (char *name);
 char * dm_mapname(int major, int minor);
 int dm_remove_partmaps (char * mapname);
 int dm_get_uuid(char *name, char *uuid);
+int dm_get_info (char * mapname, struct dm_info ** dmi);
 
 #if 0
 int dm_rename (char * old, char * new);
index a13850e..21ac634 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <math.h>
+#include <libdevmapper.h>
 
 #include "vector.h"
 #include "structs.h"
@@ -76,8 +77,8 @@ get_map_layout (struct map_layout * ml, vector mpvec)
        vector_foreach_slot (mpvec, mpp, i) {
                mapname_len = (mpp->alias) ?
                                strlen(mpp->alias) : strlen(mpp->wwid);
-               mapdev_len = snprintf(buff, MAX_FIELD_LEN,
-                                     "dm-%i", mpp->minor);
+               if (mpp->dmi) mapdev_len = snprintf(buff, MAX_FIELD_LEN,
+                                     "dm-%i", mpp->dmi->minor);
                failback_progress_len = 4 + PROGRESS_LEN +
                                        (int)log10(mpp->failback_tick) +
                                        (int)log10(mpp->pgfailback);
@@ -207,7 +208,9 @@ snprint_map (char * line, int len, char * format,
                        PAD(ml->mapname_len);
                        break;
                case 'd':
-                       PRINT(c, TAIL, "dm-%i", mpp->minor);
+                       if (mpp->dmi) {
+                               PRINT(c, TAIL, "dm-%i", mpp->dmi->minor);
+                       }
                        PAD(ml->mapdev_len);
                        break;
                case 'F':
@@ -228,9 +231,11 @@ snprint_map (char * line, int len, char * format,
                                PRINT(c, TAIL, "-");
                        } else if (mpp->no_path_retry > 0) {
                                if (mpp->retry_tick) {
-                                       PRINT(c, TAIL, "%i sec", mpp->retry_tick);
+                                       PRINT(c, TAIL, "%i sec",
+                                             mpp->retry_tick);
                                } else {
-                                       PRINT(c, TAIL, "%i chk", mpp->no_path_retry);
+                                       PRINT(c, TAIL, "%i chk",
+                                             mpp->no_path_retry);
                                }
                        }
                        PAD(ml->queueing_progress_len);
@@ -240,12 +245,10 @@ snprint_map (char * line, int len, char * format,
                        PAD(ml->nr_active_len);
                        break;
                case 't':
-                       if (mpp->dmstate == MAPSTATE_ACTIVE) {
-                               PRINT(c, TAIL, "active");
-                       } else if (mpp->dmstate == MAPSTATE_SUSPENDED) {
+                       if (mpp->dmi && mpp->dmi->suspended) {
                                PRINT(c, TAIL, "suspend");
                        } else {
-                               PRINT(c, TAIL, "-");
+                               PRINT(c, TAIL, "active");
                        }
                        PAD(7);
                        break;
index 122a27a..b5db965 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <unistd.h>
+#include <libdevmapper.h>
 
 #include "memory.h"
 #include "vector.h"
@@ -139,6 +140,9 @@ free_multipath (struct multipath * mpp, int free_paths)
            (!mpp->hwe || (mpp->hwe && mpp->hwhandler != mpp->hwe->hwhandler)))
                FREE(mpp->hwhandler);
 
+       if (mpp->dmi)
+               FREE(mpp->dmi);
+       
        free_pathvec(mpp->paths, free_paths);
        free_pgvec(mpp->pg, free_paths);
        FREE(mpp);
@@ -205,8 +209,11 @@ find_mp_by_minor (vector mp, int minor)
        int i;
        struct multipath * mpp;
        
+       if (!mpp->dmi)
+               return NULL;
+
        vector_foreach_slot (mp, mpp, i)
-               if (mpp->minor == minor)
+               if (mpp->dmi->minor == minor)
                        return mpp;
 
        return NULL;
index 223f479..2e35700 100644 (file)
@@ -54,12 +54,6 @@ enum pgstates {
        PGSTATE_ACTIVE
 };
 
-enum mapstates {
-       MAPSTATE_UNDEF,
-       MAPSTATE_ACTIVE,
-       MAPSTATE_SUSPENDED
-};
-
 struct scsi_idlun {
        int dev_id;
        int host_unique_id;
@@ -116,7 +110,6 @@ struct path {
 
 struct multipath {
        char wwid[WWID_SIZE];
-       int minor;
        int pgpolicy;
        int nextpg;
        int queuedio;
@@ -127,12 +120,12 @@ struct multipath {
        int nr_active;     /* current available(= not known as failed) paths */
        int no_path_retry; /* number of retries after all paths are down */
        int retry_tick;    /* remaining times for retries */
-       int dmstate;
        unsigned long long size;
        vector paths;
        vector pg;
        char params[PARAMS_SIZE];
        char status[PARAMS_SIZE];
+       struct dm_info * dmi;
 
        /* configlet pointers */
        char * alias;
index 452038a..047b578 100644 (file)
@@ -106,7 +106,7 @@ cli_suspend(void * v, char ** reply, int * len, void * data)
        if (!mpp)
                return 1;
        
-       mpp->dmstate = MAPSTATE_SUSPENDED;
+       dm_get_info(param, &mpp->dmi);
        return 0;
 }
 
@@ -125,7 +125,7 @@ cli_resume(void * v, char ** reply, int * len, void * data)
        if (!mpp)
                return 1;
        
-       mpp->dmstate = MAPSTATE_ACTIVE;
+       dm_get_info(param, &mpp->dmi);
        return 0;
 }
 
index 9ec3089..c562ba8 100644 (file)
@@ -383,6 +383,9 @@ remove_maps (struct vectors * vecs)
 static int
 setup_multipath (struct vectors * vecs, struct multipath * mpp)
 {
+       if (dm_get_info(mpp->alias, &mpp->dmi))
+               goto out;
+
        set_multipath_wwid(mpp);
        mpp->mpe = find_mpe(mpp->wwid);
        condlog(4, "discovered map %s", mpp->alias);
@@ -696,7 +699,6 @@ uev_add_map (char * devname, struct vectors * vecs)
        if (!mpp)
                return 1;
 
-       mpp->minor = minor;
        mpp->alias = alias;
 
        if (setup_multipath(vecs, mpp))
@@ -895,7 +897,6 @@ map_discovery (struct vectors * vecs)
        vector_foreach_slot (vecs->mpvec, mpp, i) {
                if (setup_multipath(vecs, mpp))
                        return 1;
-               mpp->minor = dm_get_minor(mpp->alias);
                start_waiter_thread(mpp, vecs);
        }