Date: Fri, 27 Jul 2007 11:05:29 GMT From: Ulf Lilleengen <lulf@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124170 for review Message-ID: <200707271105.l6RB5T8h087741@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124170 Change 124170 by lulf@lulf_carrot on 2007/07/27 11:04:34 - Remove RESIZING state for plexes, and use DEGRADED instead... check the subdisks to see what we have to do on init. - Make sure we unlock topology in gv_save_config if an error occurs. - Hold the topology_lock while we modify the provider in gv_setup_objects. - Make setstate handle GV_PLEX_GROWING cases. Affected files ... .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_drive.c#2 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#16 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_share.c#4 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#18 edit .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_subr.c#20 edit Differences ... ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_drive.c#2 (text+ko) ==== @@ -92,12 +92,12 @@ bcopy(&last_update, &hdr->label.last_update, sizeof(struct timeval)); bcopy(&hdr->label, &vhdr->label, sizeof(struct gv_label)); - g_topology_lock(); error = g_access(cp, 0, 1, 0); if (error) { printf("VINUM: gv_save_config/g_access failed on " "drive %s, errno %d\n", d->name, error); + g_topology_unlock(); continue; } g_topology_unlock(); @@ -108,6 +108,7 @@ "errno %d\n", d->name, error); g_topology_lock(); g_access(cp, 0, -1, 0); + g_topology_unlock(); continue; } /* First config copy. */ @@ -118,6 +119,7 @@ "drive %s, errno %d\n", d->name, error); g_topology_lock(); g_access(cp, 0, -1, 0); + g_topology_unlock(); continue; } /* Second config copy. */ ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#16 (text+ko) ==== @@ -102,7 +102,8 @@ gv_start_plex(struct gv_plex *p) { struct gv_volume *v; - int error; + struct gv_sd *s; + int error, rebuild; KASSERT(p != NULL, ("gv_start_plex: NULL p")); @@ -114,11 +115,19 @@ if ((v != NULL) && (v->plexcount > 1)) error = gv_sync(v); else if (p->org == GV_PLEX_RAID5) { - if (p->state == GV_PLEX_DEGRADED) - error = gv_rebuild_plex(p); - else if (p->state == GV_PLEX_RESIZING) - error = gv_grow_plex(p); - else + if (p->state == GV_PLEX_DEGRADED) { + rebuild = 0; + LIST_FOREACH(s, &p->subdisks, in_plex) { + if (s->state < GV_SD_UP) { + rebuild = 1; + break; + } + } + if (rebuild) + error = gv_rebuild_plex(p); + else + error = gv_grow_plex(p); + } else error = gv_init_plex(p); } @@ -256,8 +265,6 @@ p->flags & GV_PLEX_SYNCING || p->flags & GV_PLEX_REBUILDING) return (EINPROGRESS); - if (p->state > GV_PLEX_RESIZING) - return (GV_ERR_INVSTATE); g_topology_lock(); error = gv_access(v->provider, 1, 1, 0); g_topology_unlock(); ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_share.c#4 (text+ko) ==== @@ -274,8 +274,6 @@ return (GV_PLEX_INITIALIZING); else if (!strcmp(buf, "degraded")) return (GV_PLEX_DEGRADED); - else if (!strcmp(buf, "resizing")) - return (GV_PLEX_RESIZING); else return (GV_PLEX_DOWN); } @@ -289,8 +287,6 @@ return "down"; case GV_PLEX_INITIALIZING: return "initializing"; - case GV_PLEX_RESIZING: - return "resizing"; case GV_PLEX_DEGRADED: return "degraded"; case GV_PLEX_UP: ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#18 (text+ko) ==== @@ -318,6 +318,11 @@ } p->state = newstate; break; + case GV_PLEX_DEGRADED: + /* Only used internally, so we have to be forced. */ + if (flags & GV_SETSTATE_FORCE) + p->state = newstate; + break; } /* Update our volume if we have one. */ @@ -419,14 +424,9 @@ /* First, check the state of our subdisks. */ sdstates = gv_sdstatemap(p); - /* If we're growing, don't change the state. */ - if (p->flags & GV_PLEX_GROWING) - p->state = GV_PLEX_RESIZING; - /* If all subdisks are up, our plex can be up, too. */ - else if (sdstates == GV_SD_UPSTATE) + if (sdstates == GV_SD_UPSTATE) p->state = GV_PLEX_UP; - /* One or more of our subdisks are down. */ else if (sdstates & GV_SD_DOWNSTATE) { /* A RAID5 plex can handle one dead subdisk. */ @@ -438,7 +438,8 @@ /* Some of our subdisks are initializing. */ } else if (sdstates & GV_SD_INITSTATE) { if (p->flags & GV_PLEX_SYNCING || - p->flags & GV_PLEX_REBUILDING) + p->flags & GV_PLEX_REBUILDING || + p->flags & GV_PLEX_GROWING) p->state = GV_PLEX_DEGRADED; else p->state = GV_PLEX_DOWN; ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_subr.c#20 (text+ko) ==== @@ -486,7 +486,8 @@ LIST_FOREACH(s, &p->subdisks, in_plex) { if (s->flags & GV_SD_GROW) { printf("Setting state\n"); - p->state = GV_PLEX_RESIZING; + gv_set_plex_state(p, GV_PLEX_DEGRADED, + GV_SETSTATE_FORCE); break; } } @@ -992,12 +993,12 @@ if (v->provider == NULL) { g_topology_lock(); pp = g_new_providerf(sc->geom, "gvinum/%s", v->name); - g_topology_unlock(); pp->mediasize = v->size; pp->sectorsize = 512; /* XXX */ g_error_provider(pp, 0); v->provider = pp; pp->private = v; + g_topology_unlock(); } else if (v->provider->mediasize != v->size) { g_topology_lock(); v->provider->mediasize = v->size;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707271105.l6RB5T8h087741>