return 1;
}
+static void
+sync_map_state(struct multipath *mpp)
+{
+ int i, j;
+ struct pathgroup *pgp;
+ struct path *pp;
+
+ vector_foreach_slot (mpp->pg, pgp, i){
+ vector_foreach_slot (pgp->paths, pp, j){
+ if (pp->state <= PATH_UNCHECKED)
+ continue;
+ if ((pp->dmstate == PSTATE_FAILED ||
+ pp->dmstate == PSTATE_UNDEF) &&
+ (pp->state == PATH_UP || pp->state == PATH_GHOST))
+ dm_reinstate_path(mpp->alias, pp->dev_t);
+ else if ((pp->dmstate == PSTATE_ACTIVE ||
+ pp->dmstate == PSTATE_UNDEF) &&
+ (pp->state == PATH_DOWN ||
+ pp->state == PATH_SHAKY))
+ dm_fail_path(mpp->alias, pp->dev_t);
+ }
+ }
+}
+
+static void
+sync_maps_state(vector mpvec)
+{
+ int i;
+ struct multipath *mpp;
+
+ vector_foreach_slot (mpvec, mpp, i)
+ sync_map_state(mpp);
+}
+
static int
flush_map(struct multipath * mpp, struct vectors * vecs)
{
*/
if (map_present && (mpp = add_map_without_path(vecs, minor, alias,
start_waiter_thread))) {
+ sync_map_state(mpp);
condlog(3, "%s: devmap %s added", alias, devname);
return 0;
}
if (setup_multipath(vecs, mpp))
goto out;
+ sync_map_state(mpp);
+
if (mpp->action == ACT_CREATE &&
start_waiter_thread(mpp, vecs))
goto out;
free_pathvec(rpvec, KEEP_PATHS);
goto out;
}
+ sync_map_state(mpp);
condlog(3, "%s path removed from devmap %s",
devname, mpp->alias);
dm_lib_release();
+ sync_maps_state(mpvec);
+
if (conf->verbosity > 2)
vector_foreach_slot(mpvec, mpp, i)
print_map(mpp);