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