PERFORCE change 124889 for review

Ulf Lilleengen lulf at FreeBSD.org
Wed Aug 8 03:33:33 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=124889

Change 124889 by lulf at lulf_carrot on 2007/08/08 10:32:43

	- Add possibility to wait for events to be completed. This means that
	  certain functions like mirror, concat or raid5 can make sure
	  that all object-creating events are processed. Since they sends more than one request
	  down to the kernel, they are dependent on this. And, we don't have to
	  have ugly sleep-hacks.

Affected files ...

.. //depot/projects/soc2007/lulf/gvinum_fixup/sbin/gvinum/gvinum.c#18 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#33 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#26 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_create.c#8 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_events.c#12 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#21 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_move.c#6 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rename.c#5 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rm.c#14 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#21 edit
.. //depot/projects/soc2007/lulf/gvinum_main/sys/geom/vinum/geom_vinum_events.c#4 edit

Differences ...

==== //depot/projects/soc2007/lulf/gvinum_fixup/sbin/gvinum/gvinum.c#18 (text+ko) ====

@@ -432,14 +432,8 @@
 	gctl_ro_param(req, "plexes", sizeof(int), &plexes);
 	gctl_ro_param(req, "subdisks", sizeof(int), &subdisks);
 	errstr = gctl_issue(req);
-	if (errstr != NULL) {
+	if (errstr != NULL) 
 		warnx("error creating drive: %s", errstr);
-		gctl_free(req);
-		free(drivename);
-		usleep(100000); /* sleep for 0.1s. */
-		printf("retrying...\n");
-		return (create_drive(device));
-	}
 	gctl_free(req);
 	return (drivename);
 }

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#33 (text+ko) ====

@@ -75,7 +75,7 @@
 
 	g_trace(G_T_TOPOLOGY, "gv_orphan(%s)", gp->name);
 
-	gv_post_event(sc, GV_EVENT_DRIVE_LOST, d, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_DRIVE_LOST, d, NULL, 0, 0, 0);
 }
 
 void
@@ -188,7 +188,7 @@
 	sc = gp->softc;
 
 	if (sc != NULL) {
-		gv_post_event(sc, GV_EVENT_THREAD_EXIT, NULL, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_THREAD_EXIT, NULL, NULL, 0, 0, 0);
 		gp->softc = NULL;
 		g_wither_geom(gp, ENXIO);
 		return (EAGAIN);
@@ -240,7 +240,8 @@
 		}
 		v = gv_find_vol(sc, parent);
 		p = gv_find_plex(sc, child);
-		gv_post_event(sc, GV_EVENT_ATTACH_PLEX, p, v, *offset, *rename);
+		gv_post_event(sc, GV_EVENT_ATTACH_PLEX, p, v, *offset, *rename,
+		    0);
 		break;
 	case GV_TYPE_SD:
 		if (type_parent != GV_TYPE_PLEX) {
@@ -253,7 +254,7 @@
 			break;
 		}
 		s = gv_find_sd(sc, child);
-		gv_post_event(sc, GV_EVENT_ATTACH_SD, s, p, *offset, *rename);
+		gv_post_event(sc, GV_EVENT_ATTACH_SD, s, p, *offset, *rename, 0);
 		break;
 	default:
 		gctl_error(req, "invalid child type");
@@ -281,11 +282,11 @@
 	switch (type) {
 	case GV_TYPE_PLEX:
 		p = gv_find_plex(sc, object);
-		gv_post_event(sc, GV_EVENT_DETACH_PLEX, p, NULL, *flags, 0);
+		gv_post_event(sc, GV_EVENT_DETACH_PLEX, p, NULL, *flags, 0, 0);
 		break;
 	case GV_TYPE_SD:
 		s = gv_find_sd(sc, object);
-		gv_post_event(sc, GV_EVENT_DETACH_SD, s, NULL, *flags, 0);
+		gv_post_event(sc, GV_EVENT_DETACH_SD, s, NULL, *flags, 0, 0);
 		break;
 	default:
 		gctl_error(req, "invalid object type");
@@ -338,7 +339,7 @@
 		d = g_malloc(sizeof(*d), M_WAITOK | M_ZERO);
 		bcopy(d2, d, sizeof(*d));
 
-		gv_post_event(sc, GV_EVENT_CREATE_DRIVE, d, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_DRIVE, d, NULL, 0, 0, 0);
 	}
 
 	/* ... then volume definitions ... */
@@ -355,7 +356,7 @@
 		v = g_malloc(sizeof(*v), M_WAITOK | M_ZERO);
 		bcopy(v2, v, sizeof(*v));
 
-		gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0, 0);
 	}
 
 	/* ... then plex definitions ... */
@@ -372,7 +373,7 @@
 		p = g_malloc(sizeof(*p), M_WAITOK | M_ZERO);
 		bcopy(p2, p, sizeof(*p));
 
-		gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0, 0);
 	}
 
 	/* ... and, finally, subdisk definitions. */
@@ -389,12 +390,12 @@
 		s = g_malloc(sizeof(*s), M_WAITOK | M_ZERO);
 		bcopy(s2, s, sizeof(*s));
 
-		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0, 0);
 	}
 
 error:
-	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0);
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 1);
 
 	return (0);
 }
@@ -426,7 +427,7 @@
 
 	/* Save our configuration back to disk. */
 	} else if (!strcmp(verb, "saveconfig")) {
-		gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 0);
 
 	/* Return configuration in string form. */
 	} else if (!strcmp(verb, "getconfig")) {
@@ -461,7 +462,7 @@
 		gv_rename(gp, req);
 	
 	} else if (!strcmp(verb, "resetconfig")) {
-		gv_post_event(sc, GV_EVENT_RESET_CONFIG, sc, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_RESET_CONFIG, sc, NULL, 0, 0, 0);
 
 	} else if (!strcmp(verb, "start")) {
 		gv_start_obj(gp, req);
@@ -522,9 +523,9 @@
 	/* XXX: The state of the plex might have changed when this event is
 	 * picked up ... We should perhaps check this afterwards. */
 	if (*rebuild)
-		gv_post_event(sc, GV_EVENT_PARITY_REBUILD, p, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_PARITY_REBUILD, p, NULL, 0, 0, 0);
 	else
-		gv_post_event(sc, GV_EVENT_PARITY_CHECK, p, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_PARITY_CHECK, p, NULL, 0, 0, 0);
 }
 
 
@@ -571,7 +572,7 @@
 	if (vhdr != NULL) {
 		if (vhdr->magic == GV_MAGIC)
 			gv_post_event(sc, GV_EVENT_DRIVE_TASTED, pp, NULL, 0,
-			    0);
+			    0, 0);
 		g_free(vhdr);
 	}
 
@@ -898,6 +899,7 @@
 				printf("VINUM: unknown event %d\n", ev->type);
 			}
 
+			wakeup(ev);
 			g_free(ev);
 
 			mtx_lock(&sc->queue_mtx);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#26 (text+ko) ====

@@ -108,7 +108,7 @@
 
 void	gv_worker(void *);
 void	gv_post_event(struct gv_softc *, int, void *, void *, intmax_t,
-	    intmax_t);
+	    intmax_t, int);
 void	gv_drive_tasted(struct gv_softc *, struct g_provider *);
 void	gv_drive_lost(struct gv_softc *, struct gv_drive *);
 void	gv_setup_objects(struct gv_softc *);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_create.c#8 (text+ko) ====

@@ -324,7 +324,7 @@
 	v = g_malloc(sizeof(*v), M_WAITOK | M_ZERO);
 	strlcpy(v->name, vol, GV_MAXVOLNAME);
 	v->state = GV_VOL_UP;
-	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0, 0);
 
 	/* Then we create the plex. */
 	p = g_malloc(sizeof(*p), M_WAITOK | M_ZERO);
@@ -332,7 +332,7 @@
 	strlcpy(p->volume, v->name, GV_MAXVOLNAME);
 	p->org = GV_PLEX_CONCAT;
 	p->stripesize = 0;
-	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0, 0);
 
 	/* Drives are first (right now) priority */
 	for (dcount = 0; dcount < *drives; dcount++) {
@@ -350,10 +350,10 @@
 		s->plex_offset = -1;
 		s->drive_offset = -1;
 		s->size = -1;
-		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0, 0);
 	}
-	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0);
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 1);
 }
 
 /*
@@ -402,7 +402,7 @@
 	v = g_malloc(sizeof(*v), M_WAITOK | M_ZERO);
 	strlcpy(v->name, vol, GV_MAXVOLNAME);
 	v->state = GV_VOL_UP;
-	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0, 0);
 
 	/* Then we create the plexes. */
 	for (pcount = 0; pcount < 2; pcount++) {
@@ -417,7 +417,7 @@
 			p->org = GV_PLEX_CONCAT;
 			p->stripesize = -1;
 		}
-		gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0, 0);
 
 		/* We just gives each even drive to plex one, and each odd to
 		 * plex two. */
@@ -440,12 +440,12 @@
 			s->plex_offset = -1;
 			s->drive_offset = -1;
 			s->size = -1;
-			gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0);
+			gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0, 0);
 			scount++;
 		}
 	}
-	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0);
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 1);
 }
 
 void
@@ -492,7 +492,7 @@
 	v = g_malloc(sizeof(*v), M_WAITOK | M_ZERO);
 	strlcpy(v->name, vol, GV_MAXVOLNAME);
 	v->state = GV_VOL_UP;
-	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0, 0);
 
 	/* Then we create the plex. */
 	p = g_malloc(sizeof(*p), M_WAITOK | M_ZERO);
@@ -500,7 +500,7 @@
 	strlcpy(p->volume, v->name, GV_MAXVOLNAME);
 	p->org = GV_PLEX_RAID5;
 	p->stripesize = *stripesize;
-	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0, 0);
 
 	/* Create subdisks on drives. */
 	for (dcount = 0; dcount < *drives; dcount++) {
@@ -518,10 +518,10 @@
 		s->plex_offset = -1;
 		s->drive_offset = -1;
 		s->size = -1;
-		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0, 0);
 	}
-	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0);
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 1);
 }
 
 /*
@@ -564,7 +564,7 @@
 	v = g_malloc(sizeof(*v), M_WAITOK | M_ZERO);
 	strlcpy(v->name, vol, GV_MAXVOLNAME);
 	v->state = GV_VOL_UP;
-	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_VOLUME, v, NULL, 0, 0, 0);
 
 	/* Then we create the plex. */
 	p = g_malloc(sizeof(*p), M_WAITOK | M_ZERO);
@@ -572,7 +572,7 @@
 	strlcpy(p->volume, v->name, GV_MAXVOLNAME);
 	p->org = GV_PLEX_STRIPED;
 	p->stripesize = 262144;
-	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0, 0);
 
 	/* Create subdisks on drives. */
 	for (dcount = 0; dcount < *drives; dcount++) {
@@ -590,8 +590,8 @@
 		s->plex_offset = -1;
 		s->drive_offset = -1;
 		s->size = -1;
-		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0);
+		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 0, 0, 0);
 	}
-	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0);
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SETUP_OBJECTS, sc, NULL, 0, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 1);
 }

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_events.c#12 (text+ko) ====

@@ -29,8 +29,10 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
+#include <sys/mutex.h>
 #include <sys/systm.h>
 
 #include <geom/geom.h>
@@ -39,7 +41,7 @@
 
 void
 gv_post_event(struct gv_softc *sc, int event, void *arg1, void *arg2,
-    intmax_t arg3, intmax_t arg4)
+    intmax_t arg3, intmax_t arg4, int wait)
 {
 	struct gv_event *ev;
 
@@ -53,6 +55,8 @@
 	mtx_lock(&sc->queue_mtx);
 	TAILQ_INSERT_TAIL(&sc->equeue, ev, events);
 	wakeup(sc);
+	if (wait)
+		msleep(ev, &sc->queue_mtx, 0, "gv_post_event", hz / 4);
 	mtx_unlock(&sc->queue_mtx);
 }
 
@@ -169,7 +173,7 @@
 		if (cp->nstart != cp->nend) {
 			printf("VINUM: dead drive '%s' has still active "
 			    "requests, can't detach consumer\n", d->name);
-			gv_post_event(sc, GV_EVENT_DRIVE_LOST, d, NULL, 0, 0);
+			gv_post_event(sc, GV_EVENT_DRIVE_LOST, d, NULL, 0, 0, 0);
 			return;
 		}
 		g_topology_lock();

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#21 (text+ko) ====

@@ -72,14 +72,14 @@
 			v = gv_find_vol(sc, argv);
 			if (v != NULL)
 				gv_post_event(sc, GV_EVENT_START_VOLUME, v,
-				    NULL, *initsize, 0);
+				    NULL, *initsize, 0, 0);
 			break;
 
 		case GV_TYPE_PLEX:
 			p = gv_find_plex(sc, argv);
 			if (p != NULL)
 				gv_post_event(sc, GV_EVENT_START_PLEX, p, NULL,
-				    *initsize, 0);
+				    *initsize, 0, 0);
 			break;
 
 		case GV_TYPE_SD:

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_move.c#6 (text+ko) ====

@@ -85,7 +85,7 @@
 			gctl_error(req, "unknown subdisk '%s'", object);
 			return;
 		}
-		gv_post_event(sc, GV_EVENT_MOVE_SD, s, d, *flags, 0);
+		gv_post_event(sc, GV_EVENT_MOVE_SD, s, d, *flags, 0, 0);
 	}
 }
 

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rename.c#5 (text+ko) ====

@@ -77,7 +77,7 @@
 		}
 		name = g_malloc(GV_MAXVOLNAME, M_WAITOK | M_ZERO);
 		strlcpy(name, newname, GV_MAXVOLNAME);
-		gv_post_event(sc, GV_EVENT_RENAME_VOL, v, name, *flags, 0);
+		gv_post_event(sc, GV_EVENT_RENAME_VOL, v, name, *flags, 0, 0);
 		break;
 	case GV_TYPE_PLEX:
 		p = gv_find_plex(sc, object);
@@ -87,7 +87,7 @@
 		}
 		name = g_malloc(GV_MAXPLEXNAME, M_WAITOK | M_ZERO);
 		strlcpy(name, newname, GV_MAXPLEXNAME);
-		gv_post_event(sc, GV_EVENT_RENAME_PLEX, p, name, *flags, 0);
+		gv_post_event(sc, GV_EVENT_RENAME_PLEX, p, name, *flags, 0, 0);
 		break;
 	case GV_TYPE_SD:
 		s = gv_find_sd(sc, object);
@@ -97,7 +97,7 @@
 		}
 		name = g_malloc(GV_MAXSDNAME, M_WAITOK | M_ZERO);
 		strlcpy(name, newname, GV_MAXSDNAME);
-		gv_post_event(sc, GV_EVENT_RENAME_SD, s, name, *flags, 0);
+		gv_post_event(sc, GV_EVENT_RENAME_SD, s, name, *flags, 0, 0);
 		break;
 	case GV_TYPE_DRIVE:
 		d = gv_find_drive(sc, object);
@@ -107,7 +107,7 @@
 		}
 		name = g_malloc(GV_MAXDRIVENAME, M_WAITOK | M_ZERO);
 		strlcpy(name, newname, GV_MAXDRIVENAME);
-		gv_post_event(sc, GV_EVENT_RENAME_DRIVE, d, name, *flags, 0);
+		gv_post_event(sc, GV_EVENT_RENAME_DRIVE, d, name, *flags, 0, 0);
 		break;
 	default:
 		gctl_error(req, "unknown object '%s'", object);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rm.c#14 (text+ko) ====

@@ -81,7 +81,7 @@
 				return;
 			}
 
-			gv_post_event(sc, GV_EVENT_RM_VOLUME, v, NULL, 0, 0);
+			gv_post_event(sc, GV_EVENT_RM_VOLUME, v, NULL, 0, 0, 0);
 			break;
 
 		case GV_TYPE_PLEX:
@@ -106,7 +106,7 @@
 				return;
 			}
 
-			gv_post_event(sc, GV_EVENT_RM_PLEX, p, NULL, 0, 0);
+			gv_post_event(sc, GV_EVENT_RM_PLEX, p, NULL, 0, 0, 0);
 			break;
 
 		case GV_TYPE_SD:
@@ -119,7 +119,7 @@
 				return;
 			}
 
-			gv_post_event(sc, GV_EVENT_RM_SD, s, NULL, 0, 0);
+			gv_post_event(sc, GV_EVENT_RM_SD, s, NULL, 0, 0, 0);
 			break;
 
 		case GV_TYPE_DRIVE:
@@ -138,7 +138,8 @@
 				return;
 			}*/
 
-			gv_post_event(sc, GV_EVENT_RM_DRIVE, d, NULL, *flags, 0);
+			gv_post_event(sc, GV_EVENT_RM_DRIVE, d, NULL, *flags, 0,
+			    0);
 			break;
 
 		default:
@@ -147,7 +148,7 @@
 		}
 	}
 
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 0);
 }
 
 /* Resets configuration */
@@ -175,7 +176,7 @@
 	LIST_FOREACH_SAFE(v, &sc->volumes, volume, v2)
 		gv_rm_vol(sc, v);
 
-	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
+	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0, 0);
 
 	return (0);
 }

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#21 (text+ko) ====

@@ -78,7 +78,7 @@
 		}
 		v = gv_find_vol(sc, obj);
 		gv_post_event(sc, GV_EVENT_SET_VOL_STATE, v, NULL,
-		    gv_volstatei(state), f);
+		    gv_volstatei(state), f, 0);
 		break;
 
 	case GV_TYPE_PLEX:
@@ -88,7 +88,7 @@
 		}
 		p = gv_find_plex(sc, obj);
 		gv_post_event(sc, GV_EVENT_SET_PLEX_STATE, p, NULL,
-		    gv_plexstatei(state), f);
+		    gv_plexstatei(state), f, 0);
 		break;
 
 	case GV_TYPE_SD:
@@ -98,7 +98,7 @@
 		}
 		s = gv_find_sd(sc, obj);
 		gv_post_event(sc, GV_EVENT_SET_SD_STATE, s, NULL,
-		    gv_sdstatei(state), f);
+		    gv_sdstatei(state), f, 0);
 		break;
 
 	case GV_TYPE_DRIVE:
@@ -108,7 +108,7 @@
 		}
 		d = gv_find_drive(sc, obj);
 		gv_post_event(sc, GV_EVENT_SET_DRIVE_STATE, d, NULL,
-		    gv_drivestatei(state), f);
+		    gv_drivestatei(state), f, 0);
 		break;
 
 	default:

==== //depot/projects/soc2007/lulf/gvinum_main/sys/geom/vinum/geom_vinum_events.c#4 (text+ko) ====

@@ -64,9 +64,11 @@
 	struct gv_hdr *hdr;
 	struct gv_drive *d;
 	char *buf;
+	int updatesd;
 
 	hdr = NULL;
 	buf = NULL;
+	updatesd = 0;
 
 	printf("DEBUG: tasted drive on '%s'\n", pp->name);
 
@@ -107,6 +109,7 @@
 	} else if (d->flags & GV_DRIVE_REFERENCED) {
 		strncpy(d->device, pp->name, GV_MAXDRIVENAME);
 		d->flags &= ~GV_DRIVE_REFERENCED;
+		updatesd = 1;
 	} else {
 		printf("DEBUG: drive '%s' is already known\n", d->name);
 		g_free(hdr);


More information about the p4-projects mailing list