next = dm_get_next_target(dmt, next, &start, &length,
&target_type, ¶ms);
- if (target_type && !strcmp(target_type, type))
+ if (!target_type)
+ r = -1;
+ else if (!strcmp(target_type, type))
r = 1;
out:
if (!dm_map_present(mapname))
return 0;
- if (!dm_type(mapname, type))
+ if (type && dm_type(mapname, type) <= 0)
return 1;
if (dm_remove_partmaps(mapname))
{
struct multipath * mpp;
int r = 1;
+ int info;
struct dm_task *dmt;
struct dm_names *names;
unsigned next = 0;
}
do {
- if (dm_type(names->name, type)) {
- mpp = alloc_multipath();
+ info = dm_type(names->name, type);
- if (!mpp)
- goto out;
+ if (!info)
+ goto next;
+ mpp = alloc_multipath();
+
+ if (!mpp)
+ goto out;
+
+ mpp->alias = STRDUP(names->name);
+
+ if (!mpp->alias)
+ goto out1;
+
+ if (info > 0) {
if (dm_get_map(names->name, &mpp->size, mpp->params))
goto out1;
goto out1;
dm_get_uuid(names->name, mpp->wwid);
+ }
- mpp->alias = MALLOC(strlen(names->name) + 1);
-
- if (!mpp->alias)
- goto out1;
-
- strncat(mpp->alias, names->name, strlen(names->name));
+ if (!vector_alloc_slot(mp))
+ goto out1;
- if (!vector_alloc_slot(mp))
- goto out1;
-
- vector_set_slot(mp, mpp);
- mpp = NULL;
- }
+ vector_set_slot(mp, mpp);
+ mpp = NULL;
+next:
next = names->next;
names = (void *) names + next;
} while (next);
mpp->action = ACT_CREATE;
return;
}
+
+ if (!find_mp_by_wwid(curmp, mpp->wwid)) {
+ dm_flush_map(mpp->alias, NULL);
+ strncat(cmpp->wwid, mpp->wwid, WWID_SIZE);
+ drop_multipath(curmp, cmpp->wwid, KEEP_PATHS);
+ mpp->action = ACT_CREATE;
+ return;
+ }
+
if (pathcount(mpp, PATH_UP) == 0) {
condlog(3, "no good path");
mpp->action = ACT_NOTHING;
struct pathgroup * pgp;
struct path * pp;
+ if (!mpp->pg)
+ return 0;
+
vector_foreach_slot (mpp->pg, pgp, i) {
+ if (!pgp->paths)
+ continue;
+
vector_foreach_slot (pgp->paths, pp, j) {
if (pp->state != PATH_UP &&
(pgp->status == PGSTATE_DISABLED ||
struct pathgroup * pgp;
struct path * pp;
- vector_foreach_slot (mpp->pg, pgp, i)
+ if (!mpp->pg)
+ return 1;
+
+ vector_foreach_slot (mpp->pg, pgp, i) {
+ if (!pgp->paths)
+ continue;
+
vector_foreach_slot (pgp->paths, pp, j)
if (strlen(pp->dev))
return 0; /* alive */
+ }
return 1; /* dead */
}
struct pathgroup * pgp;
struct path * pp;
+ if (!mpp->pg)
+ return 0;
+
vector_foreach_slot (mpp->pg, pgp, i) {
+ if (!pgp->paths)
+ continue;
+
vector_foreach_slot (pgp->paths, pp, j) {
if (!strlen(pp->dev)) {
if (devt2devname(pp->dev_t, pp->dev)) {