PERFORCE change 124170 for review
Ulf Lilleengen
lulf at FreeBSD.org
Fri Jul 27 11:05:30 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124170
Change 124170 by lulf at 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;
More information about the p4-projects
mailing list