From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 16:04:53 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6A4A264E; Mon, 26 Aug 2013 16:04:53 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 48BC82DA7; Mon, 26 Aug 2013 16:04:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QG4ruY061528; Mon, 26 Aug 2013 16:04:53 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QG4qVh061525; Mon, 26 Aug 2013 16:04:52 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261604.r7QG4qVh061525@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 16:04:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254914 - projects/camlock/sys/geom/stripe X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 16:04:53 -0000 Author: mav Date: Mon Aug 26 16:04:52 2013 New Revision: 254914 URL: http://svnweb.freebsd.org/changeset/base/254914 Log: Make GEOM STRIPE support direct dispatch by locking g_stripe_done() method. Modified: projects/camlock/sys/geom/stripe/g_stripe.c projects/camlock/sys/geom/stripe/g_stripe.h Modified: projects/camlock/sys/geom/stripe/g_stripe.c ============================================================================== --- projects/camlock/sys/geom/stripe/g_stripe.c Mon Aug 26 15:38:27 2013 (r254913) +++ projects/camlock/sys/geom/stripe/g_stripe.c Mon Aug 26 16:04:52 2013 (r254914) @@ -284,22 +284,25 @@ g_stripe_done(struct bio *bp) pbp = bp->bio_parent; sc = pbp->bio_to->geom->softc; - if (pbp->bio_error == 0) - pbp->bio_error = bp->bio_error; - pbp->bio_completed += bp->bio_completed; if (bp->bio_cmd == BIO_READ && bp->bio_caller1 != NULL) { g_stripe_copy(sc, bp->bio_data, bp->bio_caller1, bp->bio_offset, bp->bio_length, 1); bp->bio_data = bp->bio_caller1; bp->bio_caller1 = NULL; } - g_destroy_bio(bp); + mtx_lock(&sc->sc_lock); + 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_lock); if (pbp->bio_driver1 != NULL) uma_zfree(g_stripe_zone, pbp->bio_driver1); g_io_deliver(pbp, pbp->bio_error); - } + } else + mtx_unlock(&sc->sc_lock); + g_destroy_bio(bp); } static int @@ -651,6 +654,7 @@ g_stripe_check_and_run(struct g_stripe_s sc->sc_provider = g_new_providerf(sc->sc_geom, "stripe/%s", sc->sc_name); + sc->sc_provider->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; /* * Find the smallest disk. */ @@ -729,6 +733,7 @@ g_stripe_add_disk(struct g_stripe_softc fcp = LIST_FIRST(&gp->consumer); cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; cp->private = NULL; cp->index = no; error = g_attach(cp, pp); @@ -830,6 +835,7 @@ g_stripe_create(struct g_class *mp, cons for (no = 0; no < sc->sc_ndisks; no++) sc->sc_disks[no] = NULL; sc->sc_type = type; + mtx_init(&sc->sc_lock, "gstripe lock", NULL, MTX_DEF); gp->softc = sc; sc->sc_geom = gp; @@ -878,6 +884,7 @@ g_stripe_destroy(struct g_stripe_softc * KASSERT(sc->sc_provider == NULL, ("Provider still exists? (device=%s)", gp->name)); free(sc->sc_disks, M_STRIPE); + mtx_destroy(&sc->sc_lock); free(sc, M_STRIPE); G_STRIPE_DEBUG(0, "Device %s destroyed.", gp->name); g_wither_geom(gp, ENXIO); Modified: projects/camlock/sys/geom/stripe/g_stripe.h ============================================================================== --- projects/camlock/sys/geom/stripe/g_stripe.h Mon Aug 26 15:38:27 2013 (r254913) +++ projects/camlock/sys/geom/stripe/g_stripe.h Mon Aug 26 16:04:52 2013 (r254914) @@ -76,6 +76,7 @@ struct g_stripe_softc { uint16_t sc_ndisks; uint32_t sc_stripesize; uint32_t sc_stripebits; + struct mtx sc_lock; }; #define sc_name sc_geom->name #endif /* _KERNEL */