PERFORCE change 122955 for review

Ulf Lilleengen lulf at FreeBSD.org
Thu Jul 5 14:31:35 UTC 2007


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

Change 122955 by lulf at lulf_carrot on 2007/07/05 14:31:21

	- Implement raid5 command, which enables easy creation of raid5 volumes.
	- Remember to setup objects after we have run
	  raid5/mirror/stripe/concat.

Affected files ...

.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#27 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#20 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_create.c#3 edit

Differences ...

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

@@ -444,6 +444,9 @@
 	} else if (!strcmp(verb, "move")) {
 		gv_move(gp, req);
 
+	} else if (!strcmp(verb, "raid5")) {
+		gv_raid5(gp, req);
+
 	} else if (!strcmp(verb, "rebuildparity") ||
 	    !strcmp(verb, "checkparity")) {
 		gv_parityop(sc, req);

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

@@ -33,6 +33,7 @@
 void	gv_concat(struct g_geom *gp, struct gctl_req *);
 void	gv_mirror(struct g_geom *gp, struct gctl_req *);
 void	gv_stripe(struct g_geom *gp, struct gctl_req *);
+void	gv_raid5(struct g_geom *gp, struct gctl_req *);
 
 /* geom_vinum_drive.c */
 void	gv_save_config(struct gv_softc *);

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

@@ -100,6 +100,7 @@
 		s->size = -1;
 		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 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);
 }
 
@@ -191,6 +192,83 @@
 			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);
+}
+
+void
+gv_raid5(struct g_geom *gp, struct gctl_req *req)
+{
+	struct gv_softc *sc;
+	struct gv_drive *d;
+	struct gv_volume *v;
+	struct gv_plex *p;
+	struct gv_sd *s;
+	int *drives, *flags, dcount;
+	char *vol, *drive, buf[30];
+	off_t *stripesize;
+
+	dcount = 0;
+	sc = gp->softc;
+
+	vol = gctl_get_param(req, "name", NULL);
+	if (vol == NULL) {
+		gctl_error(req, "volume's not given");
+		return;
+	}
+	flags = gctl_get_paraml(req, "flags", sizeof(*flags));
+	drives = gctl_get_paraml(req, "drives", sizeof(*drives));
+	stripesize = gctl_get_paraml(req, "stripesize", sizeof(*stripesize));
+
+	if (stripesize == NULL) {
+		gctl_error(req, "no stripesize given");
+		return;
+	}
+
+	if (drives == NULL) {
+		gctl_error(req, "drives not given");
+		return;
+	}
+
+	/* We must have at least three drives. */
+	if (*drives < 3) {
+		gctl_error(req, "must have at least three drives for this "
+		    "plex organisation");
+		return;
+	}
+	/* First we create the volume. */
+	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);
+
+	/* Then we create the plex. */
+	p = g_malloc(sizeof(*p), M_WAITOK | M_ZERO);
+	snprintf(p->name, sizeof(p->name), "%s.p%d", v->name, v->plexcount);
+	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);
+
+	/* Create subdisks on drives. */
+	for (dcount = 0; dcount < *drives; dcount++) {
+		snprintf(buf, sizeof(buf), "drive%d", dcount);
+		drive = gctl_get_param(req, buf, NULL);
+		d = gv_find_drive(sc, drive);
+		if (d == NULL) {
+			gctl_error(req, "No such drive '%s'", drive);
+			continue;
+		}
+		s = g_malloc(sizeof(*s), M_WAITOK | M_ZERO);
+		snprintf(s->name, sizeof(s->name), "%s.s%d", p->name, dcount);
+		strlcpy(s->plex, p->name, GV_MAXPLEXNAME);
+		strlcpy(s->drive, drive, GV_MAXDRIVENAME);
+		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_SETUP_OBJECTS, sc, NULL, 0, 0);
 	gv_post_event(sc, GV_EVENT_SAVE_CONFIG, sc, NULL, 0, 0);
 }
 
@@ -244,8 +322,7 @@
 	p->stripesize = 262144;
 	gv_post_event(sc, GV_EVENT_CREATE_PLEX, p, NULL, 0, 0);
 
-	/* Drives are first (only right now) priority. We just gives each even
-	 * drive to plex one, and each odd to plex two. */
+	/* Create subdisks on drives. */
 	for (dcount = 0; dcount < *drives; dcount++) {
 		snprintf(buf, sizeof(buf), "drive%d", dcount);
 		drive = gctl_get_param(req, buf, NULL);
@@ -263,5 +340,6 @@
 		s->size = -1;
 		gv_post_event(sc, GV_EVENT_CREATE_SD, s, NULL, 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);
 }


More information about the p4-projects mailing list