PERFORCE change 120331 for review
Ulf Lilleengen
lulf at FreeBSD.org
Thu May 24 19:27:55 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=120331
Change 120331 by lulf at lulf_carrot on 2007/05/24 19:27:25
- Add paritycheck as well.
- Change name of gv_rebuild_parity to gv_parityop.
- Replace old parityop with this one.
- Change userland utility to include rebuild flag.
Affected files ...
.. //depot/projects/soc2007/lulf/gvinum_fixup/sbin/gvinum/gvinum.c#4 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#10 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#8 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_plex.c#5 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_var.h#9 edit
Differences ...
==== //depot/projects/soc2007/lulf/gvinum_fixup/sbin/gvinum/gvinum.c#4 (text+ko) ====
@@ -594,6 +594,7 @@
req = gctl_get_handle();
gctl_ro_param(req, "class", -1, "VINUM");
gctl_ro_param(req, "verb", -1, op);
+ gctl_ro_param(req, "rebuild", sizeof(int), &rebuild);
gctl_ro_param(req, "flags", sizeof(int), &flags);
gctl_ro_param(req, "plex", -1, argv[0]);
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#10 (text+ko) ====
@@ -335,8 +335,9 @@
gv_move(gp, req);
#endif
- } else if (!strcmp(verb, "rebuildparity")) {
- gv_rebuild_parity(sc, req);
+ } else if (!strcmp(verb, "rebuildparity") ||
+ !strcmp(verb, "checkparity")) {
+ gv_parityop(sc, req);
} else if (!strcmp(verb, "remove")) {
gv_remove(gp, req);
@@ -568,7 +569,14 @@
"%d\n", err);
break;
- case GV_EVENT_REBUILD:
+ case GV_EVENT_PARITY_REBUILD:
+ /* Start parity check. */
+ p = ev->arg1;
+ p->synced = 0;
+ gv_issue_next_parity_bio(p, 0);
+ break;
+
+ case GV_EVENT_PARITY_CHECK:
printf("VINUM: event 'rebuild'\n");
/*
* Start the rebuild. The gv_plex_done will
@@ -578,7 +586,7 @@
/* XXX: Should check plex state here. */
p = ev->arg1;
p->synced = 0;
- gv_issue_next_parity_bio(p);
+ gv_issue_next_parity_bio(p, 1);
break;
case GV_EVENT_THREAD_EXIT:
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#8 (text+ko) ====
@@ -33,7 +33,7 @@
void gv_save_config(struct gv_softc *);
/* geom_vinum_init.c */
-void gv_parityop(struct g_geom *, struct gctl_req *);
+/*void gv_parityop(struct g_geom *, struct gctl_req *);*/
void gv_start_obj(struct g_geom *, struct gctl_req *);
/* geom_vinum_list.c */
@@ -111,7 +111,7 @@
int gv_stripe_active(struct gv_plex *, struct bio *);
-void gv_issue_next_parity_bio(struct gv_plex *);
-void gv_rebuild_parity(struct gv_softc *, struct gctl_req *);
+void gv_issue_next_parity_bio(struct gv_plex *, int);
+void gv_parityop(struct gv_softc *, struct gctl_req *);
#endif /* !_GEOM_VINUM_H_ */
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_plex.c#5 (text+ko) ====
@@ -474,7 +474,7 @@
* XXX: Should perhaps be another place.
*/
void
-gv_issue_next_parity_bio(struct gv_plex *p)
+gv_issue_next_parity_bio(struct gv_plex *p, int rebuild)
{
struct bio *bp;
@@ -493,7 +493,8 @@
bp->bio_data = g_malloc(p->stripesize, M_WAITOK | M_ZERO);
/* bp->bio_cflags |= GV_BIO_REBUILD;*/
bp->bio_cflags |= GV_BIO_CHECK;
- bp->bio_cflags |= GV_BIO_PARITY;
+ if (rebuild)
+ bp->bio_cflags |= GV_BIO_PARITY;
bp->bio_cflags |= GV_BIO_MALLOC;
bp->bio_length = p->stripesize;
@@ -502,6 +503,7 @@
printf("VINUM: rebuild of %s finished\n", p->name);
g_free(bp->bio_data);
g_destroy_bio(bp);
+ p->synced = 0;
return;
}
@@ -520,9 +522,10 @@
static void
gv_parity_completed(struct gv_plex *p, struct bio *bp)
{
- int error;
+ int error, rebuild;
error = bp->bio_error;
+ rebuild = bp->bio_cflags & GV_BIO_PARITY;
if (bp->bio_cflags & GV_BIO_MALLOC)
g_free(bp->bio_data);
g_destroy_bio(bp);
@@ -530,21 +533,21 @@
/* Clean up what we allocated. */
/* XXX: Check for error type. */
if (error) {
- printf("VINUM: Error rebuilding %s at %lld\n", p->name,
+ printf("VINUM: Parity operation error on %s at %lld\n", p->name,
p->synced);
return;
}
- printf("VINUM: Finished parity write at %lld\n", p->synced);
+ printf("VINUM: Parity operation at %lld finished\n", p->synced);
/* Send down next. It will determine if we need to itself. */
- gv_issue_next_parity_bio(p);
+ gv_issue_next_parity_bio(p, rebuild);
}
void
-gv_rebuild_parity(struct gv_softc *sc, struct gctl_req *req)
+gv_parityop(struct gv_softc *sc, struct gctl_req *req)
{
struct gv_plex *p;
- int *flags, type;
+ int *flags, *rebuild, type;
char *plex;
plex = gctl_get_param(req, "plex", NULL);
@@ -559,6 +562,12 @@
return;
}
+ rebuild = gctl_get_paraml(req, "rebuild", sizeof(*rebuild));
+ if (rebuild == NULL) {
+ gctl_error(req, "no operation given");
+ return;
+ }
+
type = gv_object_type(sc, plex);
if (type != GV_TYPE_PLEX) {
gctl_error(req, "'%s' is not a plex", plex);
@@ -580,5 +589,8 @@
/* Put it in the event queue. */
/* XXX: The state of the plex might have changed when this event is
* picked up ... We should really check this afterwards. */
- gv_post_event(sc, GV_EVENT_REBUILD, p, NULL, NULL);
+ if (*rebuild)
+ gv_post_event(sc, GV_EVENT_PARITY_REBUILD, p, NULL, NULL);
+ else
+ gv_post_event(sc, GV_EVENT_PARITY_CHECK, p, NULL, NULL);
}
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_var.h#9 (text+ko) ====
@@ -190,7 +190,8 @@
#define GV_EVENT_SET_VOL_STATE 15
#define GV_EVENT_SET_PLEX_STATE 16
#define GV_EVENT_RESET_CONFIG 17
-#define GV_EVENT_REBUILD 18
+#define GV_EVENT_PARITY_REBUILD 18
+#define GV_EVENT_PARITY_CHECK 19
struct gv_event {
int type;
More information about the p4-projects
mailing list