/* 1. if path has no unique id or wwid blacklisted */
if (memcmp(empty_buff, pp1->wwid, WWID_SIZE) == 0 ||
- filter_path(conf, pp1) > 0)
+ filter_path(conf, pp1) > 0) {
+ orphan_path(pp1);
continue;
+ }
/* 2. if path already coalesced */
if (pp1->mpp)
continue;
/* 3. if path has disappeared */
- if (!pp1->size)
+ if (!pp1->size) {
+ orphan_path(pp1);
continue;
+ }
/* 4. path is out of scope */
if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE))
}
extern int
-adopt_paths (vector pathvec, struct multipath * mpp)
+adopt_paths (vector pathvec, struct multipath * mpp, int get_info)
{
int i;
struct path * pp;
if (!find_path_by_dev(mpp->paths, pp->dev) &&
store_path(mpp->paths, pp))
return 1;
- pathinfo(pp, conf->hwtable, DI_PRIO | DI_CHECKER);
+ if (get_info)
+ pathinfo(pp, conf->hwtable,
+ DI_PRIO | DI_CHECKER);
}
}
return 0;
goto out;
}
- //adopt_paths(vecs->pathvec, mpp);
if (!mpp->hwe)
mpp->hwe = extract_hwe_from_path(mpp);
if (!mpp->hwe) {
return NULL; /* mpp freed in setup_multipath */
}
- if (adopt_paths(vecs->pathvec, mpp))
+ if (adopt_paths(vecs->pathvec, mpp, 1))
goto out;
if (!vector_alloc_slot(vecs->mpvec))
select_alias(mpp);
mpp->size = pp->size;
- if (adopt_paths(vecs->pathvec, mpp))
+ if (adopt_paths(vecs->pathvec, mpp, 1))
goto out;
if (add_vec) {
if (setup_multipath(vecs, mpp))
return 1; /* mpp freed in setup_multipath */
+ adopt_paths(vecs->pathvec, mpp, 0);
/*
* compare checkers states with DM states
*/
*/
if (memcmp(empty_buff, pp->wwid, WWID_SIZE) == 0) {
condlog(0, "%s: failed to get path uid", devname);
- return 1; /* leave path added to pathvec */
+ goto fail; /* leave path added to pathvec */
}
if (filter_path(conf, pp) > 0){
int i = find_slot(vecs->pathvec, (void *)pp);
condlog(4,"%s: adopting all paths for path %s",
mpp->alias, pp->dev);
- if (adopt_paths(vecs->pathvec, mpp))
- return 1; /* leave path added to pathvec */
+ if (adopt_paths(vecs->pathvec, mpp, 1))
+ goto fail; /* leave path added to pathvec */
verify_paths(mpp, vecs, NULL);
mpp->flush_on_last_del = FLUSH_UNDEF;
if ((mpp = add_map_with_path(vecs, pp, 1)))
mpp->action = ACT_CREATE;
else
- return 1; /* leave path added to pathvec */
+ goto fail; /* leave path added to pathvec */
}
/*
if (setup_map(mpp)) {
condlog(0, "%s: failed to setup map for addition of new "
"path %s", mpp->alias, devname);
- goto out;
+ goto fail_map;
}
/*
* reload the map for the multipath mapped device
goto rescan;
}
else
- goto out;
+ goto fail_map;
}
dm_lib_release();
* update our state from kernel regardless of create or reload
*/
if (setup_multipath(vecs, mpp))
- goto out;
+ goto fail_map;
sync_map_state(mpp);
if (mpp->action == ACT_CREATE &&
start_waiter_thread(mpp, vecs))
- goto out;
+ goto fail_map;
condlog(2, "%s path added to devmap %s", devname, mpp->alias);
return 0;
-out:
+fail_map:
remove_map(mpp, vecs, 1);
+fail:
+ orphan_path(pp);
return 1;
}
/*
* create new set of maps & push changed ones into dm
*/
- if (coalesce_paths(vecs, mpvec, NULL, 0))
+ if (coalesce_paths(vecs, mpvec, NULL, 1))
return 1;
/*