PERFORCE change 121631 for review
Ulf Lilleengen
lulf at FreeBSD.org
Thu Jun 14 14:26:39 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=121631
Change 121631 by lulf at lulf_carrot on 2007/06/14 14:26:33
- Submit a temporarily hack to fix a problem where two or more plexes
uses the same BIO.
Affected files ...
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_plex.c#12 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_volume.c#3 edit
Differences ...
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_plex.c#12 (text+ko) ====
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_volume.c#3 (text+ko) ====
@@ -112,6 +112,7 @@
struct gv_volume *v;
struct gv_plex *p;
struct gv_sd *s;
+ int numplex;
s = bp->bio_caller1;
KASSERT(s != NULL, ("gv_bio_done: NULL s"));
@@ -132,8 +133,36 @@
if (pbp->bio_children == pbp->bio_inbed) {
if (pbp->bio_cflags & GV_BIO_SYNCREQ)
gv_sync_completed(p, pbp);
- else
+ else {
+ /*
+ * If completed is a multiple of a number less
+ * than or equal to the plexcount, we can be
+ * sure that a write got through, and adjust
+ * bio_completed accordingly.
+ *
+ * A) We can be sure all plexes will have
+ * written the BIO, becaouse bio_children ==
+ * bio_inbed which is "global" for all plexes
+ * since the same BIO was sent to all.
+ * B) If a plex fails to write totally, we get
+ * a wrong length/completed number which is
+ * lower than it should, and the error shouldn't
+ * really occur.
+ *
+ * XXX: This is sort of a hack, but I can't find
+ * any better way without cloning the initial
+ * BIO being sent down to all plexes in a mirror
+ *
+ * Actually, cloning the BIO would be
+ * preferable.
+ */
+ numplex = pbp->bio_completed / pbp->bio_length;
+ if (numplex <= v->plexcount &&
+ (pbp->bio_completed % pbp->bio_length) == 0)
+ pbp->bio_completed =
+ pbp->bio_completed / numplex;
g_io_deliver(pbp, pbp->bio_error);
+ }
}
break;
case GV_PLEX_RAID5:
More information about the p4-projects
mailing list