diff options
Diffstat (limited to 'sys/geom/nop/g_nop.c')
-rw-r--r-- | sys/geom/nop/g_nop.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c index a1a1ad1..bd72d78 100644 --- a/sys/geom/nop/g_nop.c +++ b/sys/geom/nop/g_nop.c @@ -107,6 +107,7 @@ g_nop_start(struct bio *bp) gp = bp->bio_to->geom; sc = gp->softc; G_NOP_LOGREQ(bp, "Request received."); + mtx_lock(&sc->sc_lock); switch (bp->bio_cmd) { case BIO_READ: sc->sc_reads++; @@ -119,6 +120,7 @@ g_nop_start(struct bio *bp) failprob = sc->sc_wfailprob; break; } + mtx_unlock(&sc->sc_lock); if (failprob > 0) { u_int rval; @@ -224,6 +226,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, sc->sc_writes = 0; sc->sc_readbytes = 0; sc->sc_wrotebytes = 0; + mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF); gp->softc = sc; gp->start = g_nop_start; gp->orphan = g_nop_orphan; @@ -232,10 +235,12 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, gp->dumpconf = g_nop_dumpconf; newpp = g_new_providerf(gp, "%s", gp->name); + newpp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; newpp->mediasize = size; newpp->sectorsize = secsize; cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error != 0) { gctl_error(req, "Cannot attach to provider %s.", pp->name); @@ -251,6 +256,7 @@ fail: g_detach(cp); g_destroy_consumer(cp); g_destroy_provider(newpp); + mtx_destroy(&sc->sc_lock); g_free(gp->softc); g_destroy_geom(gp); return (error); @@ -259,10 +265,12 @@ fail: static int g_nop_destroy(struct g_geom *gp, boolean_t force) { + struct g_nop_softc *sc; struct g_provider *pp; g_topology_assert(); - if (gp->softc == NULL) + sc = gp->softc; + if (sc == NULL) return (ENXIO); pp = LIST_FIRST(&gp->provider); if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) { @@ -277,8 +285,9 @@ g_nop_destroy(struct g_geom *gp, boolean_t force) } else { G_NOP_DEBUG(0, "Device %s removed.", gp->name); } - g_free(gp->softc); gp->softc = NULL; + mtx_destroy(&sc->sc_lock); + g_free(sc); g_wither_geom(gp, ENXIO); return (0); |