From fb231f3627703f7e35592db8fb24ffbfb01c3291 Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Tue, 30 Jun 2009 14:34:06 +0000 Subject: [PATCH] Make gjournal work with kernel compiled with "options DIAGNOSTIC". Previously, it would panic immediately. Reviewed by: pjd Approved by: re (kib) --- sys/geom/geom.h | 1 + sys/geom/geom_io.c | 23 +++++++++++++++-------- sys/geom/journal/g_journal.c | 1 + 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/sys/geom/geom.h b/sys/geom/geom.h index c89083fc3613..82d04568aee1 100644 --- a/sys/geom/geom.h +++ b/sys/geom/geom.h @@ -134,6 +134,7 @@ struct g_geom { void *softc; unsigned flags; #define G_GEOM_WITHER 1 +#define G_GEOM_VOLATILE_BIO 2 }; /* diff --git a/sys/geom/geom_io.c b/sys/geom/geom_io.c index cfb8c74541f9..61ca41c97ea1 100644 --- a/sys/geom/geom_io.c +++ b/sys/geom/geom_io.c @@ -480,14 +480,6 @@ g_io_deliver(struct bio *bp, int error) KASSERT(bp != NULL, ("NULL bp in g_io_deliver")); pp = bp->bio_to; KASSERT(pp != NULL, ("NULL bio_to in g_io_deliver")); -#ifdef DIAGNOSTIC - KASSERT(bp->bio_caller1 == bp->_bio_caller1, - ("bio_caller1 used by the provider %s", pp->name)); - KASSERT(bp->bio_caller2 == bp->_bio_caller2, - ("bio_caller2 used by the provider %s", pp->name)); - KASSERT(bp->bio_cflags == bp->_bio_cflags, - ("bio_cflags used by the provider %s", pp->name)); -#endif cp = bp->bio_from; if (cp == NULL) { bp->bio_error = error; @@ -496,6 +488,21 @@ g_io_deliver(struct bio *bp, int error) } KASSERT(cp != NULL, ("NULL bio_from in g_io_deliver")); KASSERT(cp->geom != NULL, ("NULL bio_from->geom in g_io_deliver")); +#ifdef DIAGNOSTIC + /* + * Some classes - GJournal in particular - can modify bio's + * private fields while the bio is in transit; G_GEOM_VOLATILE_BIO + * flag means it's an expected behaviour for that particular geom. + */ + if ((cp->geom->flags & G_GEOM_VOLATILE_BIO) == 0) { + KASSERT(bp->bio_caller1 == bp->_bio_caller1, + ("bio_caller1 used by the provider %s", pp->name)); + KASSERT(bp->bio_caller2 == bp->_bio_caller2, + ("bio_caller2 used by the provider %s", pp->name)); + KASSERT(bp->bio_cflags == bp->_bio_cflags, + ("bio_cflags used by the provider %s", pp->name)); + } +#endif KASSERT(bp->bio_completed >= 0, ("bio_completed can't be less than 0")); KASSERT(bp->bio_completed <= bp->bio_length, ("bio_completed can't be greater than bio_length")); diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c index e6592d0c82d7..16a26f1ea655 100644 --- a/sys/geom/journal/g_journal.c +++ b/sys/geom/journal/g_journal.c @@ -2292,6 +2292,7 @@ g_journal_create(struct g_class *mp, struct g_provider *pp, gp->orphan = g_journal_orphan; gp->access = g_journal_access; gp->softc = sc; + gp->flags |= G_GEOM_VOLATILE_BIO; sc->sc_geom = gp; mtx_init(&sc->sc_mtx, "gjournal", NULL, MTX_DEF);