diff options
author | trasz <trasz@FreeBSD.org> | 2009-06-30 14:34:06 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2009-06-30 14:34:06 +0000 |
commit | 669f7d97123995ef2239c7ef3717723a3eaeb1f7 (patch) | |
tree | d399548324c2614a0a754390fcaade73189e799a /sys/geom | |
parent | 02a0b3a8398eef5365dd98db3badaafdd0b77480 (diff) | |
download | FreeBSD-src-669f7d97123995ef2239c7ef3717723a3eaeb1f7.zip FreeBSD-src-669f7d97123995ef2239c7ef3717723a3eaeb1f7.tar.gz |
Make gjournal work with kernel compiled with "options DIAGNOSTIC".
Previously, it would panic immediately.
Reviewed by: pjd
Approved by: re (kib)
Diffstat (limited to 'sys/geom')
-rw-r--r-- | sys/geom/geom.h | 1 | ||||
-rw-r--r-- | sys/geom/geom_io.c | 23 | ||||
-rw-r--r-- | 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 c89083f..82d0456 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 cfb8c74..61ca41c 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 e6592d0..16a26f1 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); |