Date: Mon, 14 Oct 2013 09:28:46 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256439 - projects/camlock/sys/geom/mirror Message-ID: <201310140928.r9E9SkFx089452@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Mon Oct 14 09:28:46 2013 New Revision: 256439 URL: http://svnweb.freebsd.org/changeset/base/256439 Log: Add partial (receive only) direct dispatch support to GEOM MIRROR. Modified: projects/camlock/sys/geom/mirror/g_mirror.c projects/camlock/sys/geom/mirror/g_mirror.h Modified: projects/camlock/sys/geom/mirror/g_mirror.c ============================================================================== --- projects/camlock/sys/geom/mirror/g_mirror.c Mon Oct 14 07:36:17 2013 (r256438) +++ projects/camlock/sys/geom/mirror/g_mirror.c Mon Oct 14 09:28:46 2013 (r256439) @@ -394,6 +394,7 @@ g_mirror_connect_disk(struct g_mirror_di g_topology_lock(); cp = g_new_consumer(disk->d_softc->sc_geom); + cp->flags |= G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error != 0) { g_destroy_consumer(cp); @@ -554,6 +555,7 @@ g_mirror_destroy_device(struct g_mirror_ g_topology_unlock(); mtx_destroy(&sc->sc_queue_mtx); mtx_destroy(&sc->sc_events_mtx); + mtx_destroy(&sc->sc_done_mtx); sx_xunlock(&sc->sc_lock); sx_destroy(&sc->sc_lock); } @@ -852,6 +854,27 @@ g_mirror_unidle(struct g_mirror_softc *s } static void +g_mirror_flush_done(struct bio *bp) +{ + struct g_mirror_softc *sc; + struct bio *pbp; + + pbp = bp->bio_parent; + sc = pbp->bio_to->geom->softc; + mtx_lock(&sc->sc_done_mtx); + if (pbp->bio_error == 0) + pbp->bio_error = bp->bio_error; + pbp->bio_completed += bp->bio_completed; + pbp->bio_inbed++; + if (pbp->bio_children == pbp->bio_inbed) { + mtx_unlock(&sc->sc_done_mtx); + g_io_deliver(pbp, pbp->bio_error); + } else + mtx_unlock(&sc->sc_done_mtx); + g_destroy_bio(bp); +} + +static void g_mirror_done(struct bio *bp) { struct g_mirror_softc *sc; @@ -1037,23 +1060,19 @@ g_mirror_flush(struct g_mirror_softc *sc continue; cbp = g_clone_bio(bp); if (cbp == NULL) { - for (cbp = bioq_first(&queue); cbp != NULL; - cbp = bioq_first(&queue)) { - bioq_remove(&queue, cbp); + while ((cbp = bioq_takefirst(&queue)) != NULL) g_destroy_bio(cbp); - } if (bp->bio_error == 0) bp->bio_error = ENOMEM; g_io_deliver(bp, bp->bio_error); return; } bioq_insert_tail(&queue, cbp); - cbp->bio_done = g_std_done; + cbp->bio_done = g_mirror_flush_done; cbp->bio_caller1 = disk; cbp->bio_to = disk->d_consumer->provider; } - for (cbp = bioq_first(&queue); cbp != NULL; cbp = bioq_first(&queue)) { - bioq_remove(&queue, cbp); + while ((cbp = bioq_takefirst(&queue)) != NULL) { G_MIRROR_LOGREQ(3, cbp, "Sending request."); disk = cbp->bio_caller1; cbp->bio_caller1 = NULL; @@ -1538,11 +1557,8 @@ g_mirror_request_split(struct g_mirror_s continue; cbp = g_clone_bio(bp); if (cbp == NULL) { - for (cbp = bioq_first(&queue); cbp != NULL; - cbp = bioq_first(&queue)) { + while ((cbp = bioq_takefirst(&queue)) != NULL) bioq_remove(&queue, cbp); - g_destroy_bio(cbp); - } if (bp->bio_error == 0) bp->bio_error = ENOMEM; g_io_deliver(bp, bp->bio_error); @@ -1561,8 +1577,7 @@ g_mirror_request_split(struct g_mirror_s offset += cbp->bio_length; data += cbp->bio_length; } - for (cbp = bioq_first(&queue); cbp != NULL; cbp = bioq_first(&queue)) { - bioq_remove(&queue, cbp); + while ((cbp = bioq_takefirst(&queue)) != NULL) { G_MIRROR_LOGREQ(3, cbp, "Sending request."); disk = cbp->bio_caller1; cbp->bio_caller1 = NULL; @@ -1643,11 +1658,8 @@ g_mirror_register_request(struct bio *bp continue; cbp = g_clone_bio(bp); if (cbp == NULL) { - for (cbp = bioq_first(&queue); cbp != NULL; - cbp = bioq_first(&queue)) { - bioq_remove(&queue, cbp); + while ((cbp = bioq_takefirst(&queue)) != NULL) g_destroy_bio(cbp); - } if (bp->bio_error == 0) bp->bio_error = ENOMEM; g_io_deliver(bp, bp->bio_error); @@ -1662,9 +1674,7 @@ g_mirror_register_request(struct bio *bp ("Consumer %s not opened (r%dw%de%d).", cp->provider->name, cp->acr, cp->acw, cp->ace)); } - for (cbp = bioq_first(&queue); cbp != NULL; - cbp = bioq_first(&queue)) { - bioq_remove(&queue, cbp); + while ((cbp = bioq_takefirst(&queue)) != NULL) { G_MIRROR_LOGREQ(3, cbp, "Sending request."); cp = cbp->bio_caller1; cbp->bio_caller1 = NULL; @@ -1920,6 +1930,7 @@ g_mirror_sync_start(struct g_mirror_disk sx_xunlock(&sc->sc_lock); g_topology_lock(); cp = g_new_consumer(sc->sc_sync.ds_geom); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, sc->sc_provider); KASSERT(error == 0, ("Cannot attach to %s (error=%d).", sc->sc_name, error)); @@ -2034,6 +2045,7 @@ g_mirror_launch_provider(struct g_mirror g_topology_lock(); pp = g_new_providerf(sc->sc_geom, "mirror/%s", sc->sc_name); + pp->flags |= G_PF_DIRECT_RECEIVE; pp->mediasize = sc->sc_mediasize; pp->sectorsize = sc->sc_sectorsize; pp->stripesize = 0; @@ -2082,10 +2094,8 @@ g_mirror_destroy_provider(struct g_mirro g_topology_lock(); g_error_provider(sc->sc_provider, ENXIO); mtx_lock(&sc->sc_queue_mtx); - while ((bp = bioq_first(&sc->sc_queue)) != NULL) { - bioq_remove(&sc->sc_queue, bp); + while ((bp = bioq_takefirst(&sc->sc_queue)) != NULL) g_io_deliver(bp, ENXIO); - } mtx_unlock(&sc->sc_queue_mtx); G_MIRROR_DEBUG(0, "Device %s: provider %s destroyed.", sc->sc_name, sc->sc_provider->name); @@ -2896,6 +2906,7 @@ g_mirror_create(struct g_class *mp, cons TAILQ_INIT(&sc->sc_events); mtx_init(&sc->sc_events_mtx, "gmirror:events", NULL, MTX_DEF); callout_init(&sc->sc_callout, CALLOUT_MPSAFE); + mtx_init(&sc->sc_done_mtx, "gmirror:done", NULL, MTX_DEF); sc->sc_state = G_MIRROR_DEVICE_STATE_STARTING; gp->softc = sc; sc->sc_geom = gp; @@ -2914,6 +2925,7 @@ g_mirror_create(struct g_class *mp, cons G_MIRROR_DEBUG(1, "Cannot create kernel thread for %s.", sc->sc_name); g_destroy_geom(sc->sc_sync.ds_geom); + mtx_destroy(&sc->sc_done_mtx); mtx_destroy(&sc->sc_events_mtx); mtx_destroy(&sc->sc_queue_mtx); sx_destroy(&sc->sc_lock); Modified: projects/camlock/sys/geom/mirror/g_mirror.h ============================================================================== --- projects/camlock/sys/geom/mirror/g_mirror.h Mon Oct 14 07:36:17 2013 (r256438) +++ projects/camlock/sys/geom/mirror/g_mirror.h Mon Oct 14 09:28:46 2013 (r256439) @@ -212,6 +212,8 @@ struct g_mirror_softc { struct callout sc_callout; struct root_hold_token *sc_rootmount; + + struct mtx sc_done_mtx; }; #define sc_name sc_geom->name
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310140928.r9E9SkFx089452>