svn commit: r239673 - head/sys/geom/multipath
Thomas Quinot
thomas at FreeBSD.org
Sat Aug 25 10:36:32 UTC 2012
Author: thomas
Date: Sat Aug 25 10:36:31 2012
New Revision: 239673
URL: http://svn.freebsd.org/changeset/base/239673
Log:
(g_multipath_rotate): Fix algorithm so that it does rotate over all good
providers, not just the last two.
PR: kern/170379
Reviewed by: mav
MFC after: 2 weeks
Modified:
head/sys/geom/multipath/g_multipath.c
Modified: head/sys/geom/multipath/g_multipath.c
==============================================================================
--- head/sys/geom/multipath/g_multipath.c Sat Aug 25 09:26:37 2012 (r239672)
+++ head/sys/geom/multipath/g_multipath.c Sat Aug 25 10:36:31 2012 (r239673)
@@ -590,19 +590,26 @@ g_multipath_destroy_geom(struct gctl_req
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",
More information about the svn-src-all
mailing list