[dm-devel] dm-multipath: syncing path states
Benjamin Marzinski
bmarzins at redhat.com
Tue Feb 21 22:37:08 UTC 2006
Occasionally, the path states for multipathd and device mapper are out of sync.
This happens either when multipathd starts, or after a multipath map is
created or reloaded (what a path is added or removed, or a map is added).
The attached patch syncs the paths' dmstate with it's state after one of
these actions happens.
-Ben
-------------- next part --------------
diff -urpN mp-devel-clean/multipathd/main.c mp-devel-patched/multipathd/main.c
--- mp-devel-clean/multipathd/main.c 2006-02-17 16:07:19.000000000 -0600
+++ mp-devel-patched/multipathd/main.c 2006-02-21 17:14:42.000000000 -0600
@@ -475,6 +475,40 @@ out:
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)
{
@@ -556,6 +590,7 @@ ev_add_map (char * devname, struct vecto
*/
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;
}
@@ -728,6 +763,8 @@ rescan:
if (setup_multipath(vecs, mpp))
goto out;
+ sync_map_state(mpp);
+
if (mpp->action == ACT_CREATE &&
start_waiter_thread(mpp, vecs))
goto out;
@@ -826,6 +863,7 @@ ev_remove_path (char * devname, struct v
free_pathvec(rpvec, KEEP_PATHS);
goto out;
}
+ sync_map_state(mpp);
condlog(3, "%s path removed from devmap %s",
devname, mpp->alias);
@@ -1354,6 +1392,8 @@ configure (struct vectors * vecs, int st
dm_lib_release();
+ sync_maps_state(mpvec);
+
if (conf->verbosity > 2)
vector_foreach_slot(mpvec, mpp, i)
print_map(mpp);
More information about the dm-devel
mailing list