Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Sep 2013 10:12:29 +0000 (UTC)
From:      Alexander Motin <mav@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: r255567 - stable/9/sys/geom/zero
Message-ID:  <201309141012.r8EACTW9032484@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sat Sep 14 10:12:28 2013
New Revision: 255567
URL: http://svnweb.freebsd.org/changeset/base/255567

Log:
  MFC r254936:
  Add unmapped BIO support to GEOM ZERO if kern.geom.zero.clear is cleared.

Modified:
  stable/9/sys/geom/zero/g_zero.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/geom/zero/g_zero.c
==============================================================================
--- stable/9/sys/geom/zero/g_zero.c	Sat Sep 14 10:11:38 2013	(r255566)
+++ stable/9/sys/geom/zero/g_zero.c	Sat Sep 14 10:12:28 2013	(r255567)
@@ -41,16 +41,37 @@ __FBSDID("$FreeBSD$");
 
 #define	G_ZERO_CLASS_NAME	"ZERO"
 
+static int	g_zero_clear_sysctl(SYSCTL_HANDLER_ARGS);
+
 SYSCTL_DECL(_kern_geom);
 static SYSCTL_NODE(_kern_geom, OID_AUTO, zero, CTLFLAG_RW, 0,
     "GEOM_ZERO stuff");
 static int g_zero_clear = 1;
-SYSCTL_INT(_kern_geom_zero, OID_AUTO, clear, CTLFLAG_RW, &g_zero_clear, 0,
-    "Clear read data buffer");
+SYSCTL_PROC(_kern_geom_zero, OID_AUTO, clear, CTLTYPE_INT|CTLFLAG_RW,
+    &g_zero_clear, 0, g_zero_clear_sysctl, "I", "Clear read data buffer");
 static int g_zero_byte = 0;
 SYSCTL_INT(_kern_geom_zero, OID_AUTO, byte, CTLFLAG_RW, &g_zero_byte, 0,
     "Byte (octet) value to clear the buffers with");
 
+static struct g_provider *gpp;
+
+static int
+g_zero_clear_sysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error;
+
+	error = sysctl_handle_int(oidp, &g_zero_clear, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	if (gpp == NULL)
+		return (ENXIO);
+	if (g_zero_clear)
+		gpp->flags &= ~G_PF_ACCEPT_UNMAPPED;
+	else
+		gpp->flags |= G_PF_ACCEPT_UNMAPPED;
+	return (0);
+}
+
 static void
 g_zero_start(struct bio *bp)
 {
@@ -58,7 +79,7 @@ g_zero_start(struct bio *bp)
 
 	switch (bp->bio_cmd) {
 	case BIO_READ:
-		if (g_zero_clear)
+		if (g_zero_clear && (bp->bio_flags & BIO_UNMAPPED) == 0)
 			memset(bp->bio_data, g_zero_byte, bp->bio_length);
 		/* FALLTHROUGH */
 	case BIO_DELETE:
@@ -84,7 +105,9 @@ g_zero_init(struct g_class *mp)
 	gp = g_new_geomf(mp, "gzero");
 	gp->start = g_zero_start;
 	gp->access = g_std_access;
-	pp = g_new_providerf(gp, "%s", gp->name);
+	gpp = pp = g_new_providerf(gp, "%s", gp->name);
+	if (!g_zero_clear)
+		pp->flags |= G_PF_ACCEPT_UNMAPPED;
 	pp->mediasize = 1152921504606846976LLU;
 	pp->sectorsize = 512;
 	g_error_provider(pp, 0);
@@ -104,6 +127,7 @@ g_zero_destroy_geom(struct gctl_req *req
 		return (0);
 	if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0)
 		return (EBUSY);
+	gpp = NULL;
 	g_wither_geom(gp, ENXIO);
 	return (0);
 }



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