aboutsummaryrefslogtreecommitdiff
path: root/sys/geom/multipath
diff options
context:
space:
mode:
authorThomas Quinot <thomas@FreeBSD.org>2012-08-25 10:36:31 +0000
committerThomas Quinot <thomas@FreeBSD.org>2012-08-25 10:36:31 +0000
commit8fb378d6b11a7013149b918d8cc44067d83cd2c9 (patch)
treefed304e9abf5edc3bb5baa136f10acddcb69bd4d /sys/geom/multipath
parentec03d5433f2d9c00969173caf13ba230adaf0c9d (diff)
Notes
Diffstat (limited to 'sys/geom/multipath')
-rw-r--r--sys/geom/multipath/g_multipath.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c
index b50367ec8524..7ca0082fb489 100644
--- a/sys/geom/multipath/g_multipath.c
+++ b/sys/geom/multipath/g_multipath.c
@@ -590,19 +590,26 @@ g_multipath_destroy_geom(struct gctl_req *req, struct g_class *mp,
static int
g_multipath_rotate(struct g_geom *gp)
{
- struct g_consumer *lcp;
+ struct g_consumer *lcp, *first_good_cp = NULL;
struct g_multipath_softc *sc = gp->softc;
+ int active_cp_seen = 0;
g_topology_assert();
if (sc == NULL)
return (ENXIO);
LIST_FOREACH(lcp, &gp->consumer, consumer) {
if ((lcp->index & MP_BAD) == 0) {
- if (sc->sc_active != lcp)
+ if (first_good_cp == NULL)
+ first_good_cp = lcp;
+ if (active_cp_seen)
break;
}
+ if (sc->sc_active == lcp)
+ active_cp_seen = 1;
}
- if (lcp) {
+ if (lcp == NULL)
+ lcp = first_good_cp;
+ if (lcp && lcp != sc->sc_active) {
sc->sc_active = lcp;
if (sc->sc_active_active != 1)
printf("GEOM_MULTIPATH: %s is now active path in %s\n",