}
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))
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)
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);
#include <stdio.h>
#include <string.h>
#include <math.h>
+#include <libdevmapper.h>
#include "vector.h"
#include "structs.h"
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);
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':
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);
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;
#include <stdio.h>
#include <unistd.h>
+#include <libdevmapper.h>
#include "memory.h"
#include "vector.h"
(!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);
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;
PGSTATE_ACTIVE
};
-enum mapstates {
- MAPSTATE_UNDEF,
- MAPSTATE_ACTIVE,
- MAPSTATE_SUSPENDED
-};
-
struct scsi_idlun {
int dev_id;
int host_unique_id;
struct multipath {
char wwid[WWID_SIZE];
- int minor;
int pgpolicy;
int nextpg;
int queuedio;
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;
if (!mpp)
return 1;
- mpp->dmstate = MAPSTATE_SUSPENDED;
+ dm_get_info(param, &mpp->dmi);
return 0;
}
if (!mpp)
return 1;
- mpp->dmstate = MAPSTATE_ACTIVE;
+ dm_get_info(param, &mpp->dmi);
return 0;
}
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);
if (!mpp)
return 1;
- mpp->minor = minor;
mpp->alias = alias;
if (setup_multipath(vecs, mpp))
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);
}