Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Jun 2013 17:36:34 +0000 (UTC)
From:      Scott Long <scottl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r252063 - stable/9/sys/geom/mirror
Message-ID:  <201306211736.r5LHaYPN070052@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: scottl
Date: Fri Jun 21 17:36:33 2013
New Revision: 252063
URL: http://svnweb.freebsd.org/changeset/base/252063

Log:
  MFC r252010, r252011:
  
  Mark geom_mirror as capable of unmapped i/o
  
  Obtained from:	Netflix

Modified:
  stable/9/sys/geom/mirror/g_mirror.c

Modified: stable/9/sys/geom/mirror/g_mirror.c
==============================================================================
--- stable/9/sys/geom/mirror/g_mirror.c	Fri Jun 21 17:23:19 2013	(r252062)
+++ stable/9/sys/geom/mirror/g_mirror.c	Fri Jun 21 17:36:33 2013	(r252063)
@@ -2028,7 +2028,7 @@ static void
 g_mirror_launch_provider(struct g_mirror_softc *sc)
 {
 	struct g_mirror_disk *disk;
-	struct g_provider *pp;
+	struct g_provider *pp, *dp;
 
 	sx_assert(&sc->sc_lock, SX_LOCKED);
 
@@ -2038,11 +2038,24 @@ g_mirror_launch_provider(struct g_mirror
 	pp->sectorsize = sc->sc_sectorsize;
 	pp->stripesize = 0;
 	pp->stripeoffset = 0;
+
+	/* Splitting of unmapped BIO's could work but isn't implemented now */
+	if (sc->sc_balance != G_MIRROR_BALANCE_SPLIT)
+		pp->flags |= G_PF_ACCEPT_UNMAPPED;
+
 	LIST_FOREACH(disk, &sc->sc_disks, d_next) {
-		if (disk->d_consumer && disk->d_consumer->provider &&
-		    disk->d_consumer->provider->stripesize > pp->stripesize) {
-			pp->stripesize = disk->d_consumer->provider->stripesize;
-			pp->stripeoffset = disk->d_consumer->provider->stripeoffset;
+		if (disk->d_consumer && disk->d_consumer->provider) {
+			dp = disk->d_consumer->provider;
+			if (dp->stripesize > pp->stripesize) {
+				pp->stripesize = dp->stripesize;
+				pp->stripeoffset = dp->stripeoffset;
+			}
+			/* A provider underneath us doesn't support unmapped */
+			if ((dp->flags & G_PF_ACCEPT_UNMAPPED) == 0) {
+				G_MIRROR_DEBUG(0, "cancelling unmapped "
+				    "because of %s\n", dp->name);
+				pp->flags &= ~G_PF_ACCEPT_UNMAPPED;
+			}
 		}
 	}
 	sc->sc_provider = pp;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306211736.r5LHaYPN070052>