}
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;
goto out1;
dm_get_uuid(names->name, mpp->wwid);
+ dm_get_state(names->name, &mpp->dmstate);
}
if (!vector_alloc_slot(mp))
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;
}
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;
}
* %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
PGSTATE_ACTIVE
};
+enum mapstates {
+ MAPSTATE_UNDEF,
+ MAPSTATE_ACTIVE,
+ MAPSTATE_SUSPENDED
+};
+
struct scsi_idlun {
int dev_id;
int host_unique_id;
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;
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;
+}