[multipathd] handle map dmstate reporting through "show maps" CLI cmd
authorChristophe Varoqui <root@xa-s05.(none)>
Fri, 28 Oct 2005 22:28:43 +0000 (00:28 +0200)
committerChristophe Varoqui <root@xa-s05.(none)>
Fri, 28 Oct 2005 22:28:43 +0000 (00:28 +0200)
- fetch dmstate a startup
- keep map state in sync in suspend/resume cli handlers
- add the print.[ch] bits

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

index cfb1531..22c121b 100644 (file)
@@ -219,6 +219,36 @@ 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;
@@ -644,6 +674,7 @@ 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))
index bbd57ef..a13850e 100644 (file)
@@ -163,6 +163,10 @@ snprint_map_header (char * line, int len, char * format,
                        ml->nr_active_len = MAX(ml->nr_active_len, 5);
                        PAD(ml->nr_active_len);
                        break;
+               case 't':
+                       PRINT(c, TAIL, "dm-st");
+                       PAD(7);
+                       break;
                default:
                        break;
                }
@@ -235,6 +239,16 @@ snprint_map (char * line, int len, char * format,
                        PRINT(c, TAIL, "%i", mpp->nr_active);
                        PAD(ml->nr_active_len);
                        break;
+               case 't':
+                       if (mpp->dmstate == MAPSTATE_ACTIVE) {
+                               PRINT(c, TAIL, "active");
+                       } else if (mpp->dmstate == MAPSTATE_SUSPENDED) {
+                               PRINT(c, TAIL, "suspend");
+                       } else {
+                               PRINT(c, TAIL, "-");
+                       }
+                       PAD(7);
+                       break;
                default:
                        break;
                }
index 14faf19..5da4396 100644 (file)
  * %C : checker countdown
  * %Q : queueing policy changer countdown (no_path_retry)
  * %n : number of active paths
+ * %t : device mapper map status
  */
 #define PRINT_PATH_LONG      "%w %i %d %D %p %t%T %s"
 #define PRINT_PATH_INDENT    " \\_ %i %d %D %t%T"
 #define PRINT_PATH_CHECKER   "%i %d %D %p %t%T %C"
-#define PRINT_MAP_FAILBACK   "%w %d %F %Q %n"
+#define PRINT_MAP_FAILBACK   "%w %d %F %Q %n %t"
 
 #define MAX_LINE_LEN 80
 #define PROGRESS_LEN 10
index 697db94..bb35bd1 100644 (file)
@@ -54,6 +54,12 @@ enum pgstates {
        PGSTATE_ACTIVE
 };
 
+enum mapstates {
+       MAPSTATE_UNDEF,
+       MAPSTATE_ACTIVE,
+       MAPSTATE_SUSPENDED
+};
+
 struct scsi_idlun {
        int dev_id;
        int host_unique_id;
@@ -121,6 +127,7 @@ 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;
index 41bec89..a0fd1c4 100644 (file)
@@ -94,16 +94,37 @@ cli_reconfigure(void * v, char ** reply, int * len, void * data)
 int
 cli_suspend(void * v, char ** reply, int * len, void * data)
 {
+       struct vectors * vecs = (struct vectors *)data;
        char * param = get_keyparam(v, MAP);
-                       
-       return !dm_simplecmd(DM_DEVICE_SUSPEND, param);
+       int r = dm_simplecmd(DM_DEVICE_SUSPEND, param);
+
+       if (!r) /* error */
+               return 1;
+       
+       struct multipath * mpp = find_mp(vecs->mpvec, param);
+
+       if (!mpp)
+               return 1;
+       
+       mpp->dmstate = MAPSTATE_SUSPENDED;
+       return 0;
 }
 
 int
 cli_resume(void * v, char ** reply, int * len, void * data)
 {
+       struct vectors * vecs = (struct vectors *)data;
        char * param = get_keyparam(v, MAP);
-                       
-       return !dm_simplecmd(DM_DEVICE_RESUME, param);
-}
+       int r = dm_simplecmd(DM_DEVICE_RESUME, param);
+
+       if (!r) /* error */
+               return 1;
+       
+       struct multipath * mpp = find_mp(vecs->mpvec, param);
 
+       if (!mpp)
+               return 1;
+       
+       mpp->dmstate = MAPSTATE_ACTIVE;
+       return 0;
+}