svn commit: r353668 - head/sys/geom/nop

Chuck Silvers chs at FreeBSD.org
Wed Oct 16 21:49:44 UTC 2019


Author: chs
Date: Wed Oct 16 21:49:44 2019
New Revision: 353668
URL: https://svnweb.freebsd.org/changeset/base/353668

Log:
  Make all the gnop parameters optional in the request from userland,
  filling in the same defaults that the current userland module uses.
  This allows an old geom_nop.so userland module to work with a new kernel.
  
  Approved by:	imp (mentor)
  Reviewed by:	cem
  Sponsored by:	Netflix
  Differential Revision:	https://reviews.freebsd.org/D21972

Modified:
  head/sys/geom/nop/g_nop.c

Modified: head/sys/geom/nop/g_nop.c
==============================================================================
--- head/sys/geom/nop/g_nop.c	Wed Oct 16 21:49:39 2019	(r353667)
+++ head/sys/geom/nop/g_nop.c	Wed Oct 16 21:49:44 2019	(r353668)
@@ -497,15 +497,28 @@ static void
 g_nop_ctl_create(struct gctl_req *req, struct g_class *mp)
 {
 	struct g_provider *pp;
-	intmax_t *error, *rfailprob, *wfailprob, *count_until_fail, *offset,
-	    *secsize, *size, *stripesize, *stripeoffset, *delaymsec,
-	    *rdelayprob, *wdelayprob;
+	intmax_t *val, error, rfailprob, wfailprob, count_until_fail, offset,
+	    secsize, size, stripesize, stripeoffset, delaymsec,
+	    rdelayprob, wdelayprob;
 	const char *name, *physpath;
 	char param[16];
 	int i, *nargs;
 
 	g_topology_assert();
 
+	error = -1;
+	rfailprob = -1;
+	wfailprob = -1;
+	count_until_fail = -1;
+	offset = 0;
+	secsize = 0;
+	size = 0;
+	stripesize = 0;
+	stripeoffset = 0;
+	delaymsec = -1;
+	rdelayprob = -1;
+	wdelayprob = -1;
+
 	nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
 	if (nargs == NULL) {
 		gctl_error(req, "No '%s' argument", "nargs");
@@ -515,111 +528,100 @@ g_nop_ctl_create(struct gctl_req *req, struct g_class 
 		gctl_error(req, "Missing device(s).");
 		return;
 	}
-	error = gctl_get_paraml(req, "error", sizeof(*error));
-	if (error == NULL) {
-		gctl_error(req, "No '%s' argument", "error");
-		return;
+	val = gctl_get_paraml_opt(req, "error", sizeof(*val));
+	if (val != NULL) {
+		error = *val;
 	}
-	rfailprob = gctl_get_paraml(req, "rfailprob", sizeof(*rfailprob));
-	if (rfailprob == NULL) {
-		gctl_error(req, "No '%s' argument", "rfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "rfailprob", sizeof(*val));
+	if (val != NULL) {
+		rfailprob = *val;
+		if (rfailprob < -1 || rfailprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "rfailprob");
+			return;
+		}
 	}
-	if (*rfailprob < -1 || *rfailprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "rfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "wfailprob", sizeof(*val));
+	if (val != NULL) {
+		wfailprob = *val;
+		if (wfailprob < -1 || wfailprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "wfailprob");
+			return;
+		}
 	}
-	wfailprob = gctl_get_paraml(req, "wfailprob", sizeof(*wfailprob));
-	if (wfailprob == NULL) {
-		gctl_error(req, "No '%s' argument", "wfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "delaymsec", sizeof(*val));
+	if (val != NULL) {
+		delaymsec = *val;
+		if (delaymsec < 1 && delaymsec != -1) {
+			gctl_error(req, "Invalid '%s' argument", "delaymsec");
+			return;
+		}
 	}
-	if (*wfailprob < -1 || *wfailprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "wfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "rdelayprob", sizeof(*val));
+	if (val != NULL) {
+		rdelayprob = *val;
+		if (rdelayprob < -1 || rdelayprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "rdelayprob");
+			return;
+		}
 	}
-	delaymsec = gctl_get_paraml(req, "delaymsec", sizeof(*delaymsec));
-	if (delaymsec == NULL) {
-		gctl_error(req, "No '%s' argument", "delaymsec");
-		return;
+	val = gctl_get_paraml_opt(req, "wdelayprob", sizeof(*val));
+	if (val != NULL) {
+		wdelayprob = *val;
+		if (wdelayprob < -1 || wdelayprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "wdelayprob");
+			return;
+		}
 	}
-	if (*delaymsec < 1 && *delaymsec != -1) {
-		gctl_error(req, "Invalid '%s' argument", "delaymsec");
-		return;
+	val = gctl_get_paraml_opt(req, "count_until_fail", sizeof(*val));
+	if (val != NULL) {
+		count_until_fail = *val;
+		if (count_until_fail < -1) {
+			gctl_error(req, "Invalid '%s' argument",
+			    "count_until_fail");
+			return;
+		}
 	}
-	rdelayprob = gctl_get_paraml(req, "rdelayprob", sizeof(*rdelayprob));
-	if (rdelayprob == NULL) {
-		gctl_error(req, "No '%s' argument", "rdelayprob");
-		return;
+	val = gctl_get_paraml_opt(req, "offset", sizeof(*val));
+	if (val != NULL) {
+		offset = *val;
+		if (offset < 0) {
+			gctl_error(req, "Invalid '%s' argument", "offset");
+			return;
+		}
 	}
-	if (*rdelayprob < -1 || *rdelayprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "rdelayprob");
-		return;
+	val = gctl_get_paraml_opt(req, "size", sizeof(*val));
+	if (val != NULL) {
+		size = *val;
+		if (size < 0) {
+			gctl_error(req, "Invalid '%s' argument", "size");
+			return;
+		}
 	}
-	wdelayprob = gctl_get_paraml(req, "wdelayprob", sizeof(*wdelayprob));
-	if (wdelayprob == NULL) {
-		gctl_error(req, "No '%s' argument", "wdelayprob");
-		return;
+	val = gctl_get_paraml_opt(req, "secsize", sizeof(*val));
+	if (val != NULL) {
+		secsize = *val;
+		if (secsize < 0) {
+			gctl_error(req, "Invalid '%s' argument", "secsize");
+			return;
+		}
 	}
-	if (*wdelayprob < -1 || *wdelayprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "wdelayprob");
-		return;
+	val = gctl_get_paraml_opt(req, "stripesize", sizeof(*val));
+	if (val != NULL) {
+		stripesize = *val;
+		if (stripesize < 0) {
+			gctl_error(req, "Invalid '%s' argument", "stripesize");
+			return;
+		}
 	}
-	count_until_fail = gctl_get_paraml(req, "count_until_fail",
-	    sizeof(*count_until_fail));
-	if (count_until_fail == NULL) {
-		gctl_error(req, "No '%s' argument", "count_until_fail");
-		return;
+	val = gctl_get_paraml_opt(req, "stripeoffset", sizeof(*val));
+	if (val != NULL) {
+		stripeoffset = *val;
+		if (stripeoffset < 0) {
+			gctl_error(req, "Invalid '%s' argument",
+			    "stripeoffset");
+			return;
+		}
 	}
-	if (*count_until_fail < -1) {
-		gctl_error(req, "Invalid '%s' argument", "count_until_fail");
-		return;
-	}
-	offset = gctl_get_paraml(req, "offset", sizeof(*offset));
-	if (offset == NULL) {
-		gctl_error(req, "No '%s' argument", "offset");
-		return;
-	}
-	if (*offset < 0) {
-		gctl_error(req, "Invalid '%s' argument", "offset");
-		return;
-	}
-	size = gctl_get_paraml(req, "size", sizeof(*size));
-	if (size == NULL) {
-		gctl_error(req, "No '%s' argument", "size");
-		return;
-	}
-	if (*size < 0) {
-		gctl_error(req, "Invalid '%s' argument", "size");
-		return;
-	}
-	secsize = gctl_get_paraml(req, "secsize", sizeof(*secsize));
-	if (secsize == NULL) {
-		gctl_error(req, "No '%s' argument", "secsize");
-		return;
-	}
-	if (*secsize < 0) {
-		gctl_error(req, "Invalid '%s' argument", "secsize");
-		return;
-	}
-	stripesize = gctl_get_paraml(req, "stripesize", sizeof(*stripesize));
-	if (stripesize == NULL) {
-		gctl_error(req, "No '%s' argument", "stripesize");
-		return;
-	}
-	if (*stripesize < 0) {
-		gctl_error(req, "Invalid '%s' argument", "stripesize");
-		return;
-	}
-	stripeoffset = gctl_get_paraml(req, "stripeoffset", sizeof(*stripeoffset));
-	if (stripeoffset == NULL) {
-		gctl_error(req, "No '%s' argument", "stripeoffset");
-		return;
-	}
-	if (*stripeoffset < 0) {
-		gctl_error(req, "Invalid '%s' argument", "stripeoffset");
-		return;
-	}
 	physpath = gctl_get_asciiparam(req, "physpath");
 
 	for (i = 0; i < *nargs; i++) {
@@ -638,15 +640,15 @@ g_nop_ctl_create(struct gctl_req *req, struct g_class 
 			return;
 		}
 		if (g_nop_create(req, mp, pp,
-		    *error == -1 ? EIO : (int)*error,
-		    *count_until_fail == -1 ? 0 : (u_int)*count_until_fail,
-		    *rfailprob == -1 ? 0 : (u_int)*rfailprob,
-		    *wfailprob == -1 ? 0 : (u_int)*wfailprob,
-		    *delaymsec == -1 ? 1 : (u_int)*delaymsec,
-		    *rdelayprob == -1 ? 0 : (u_int)*rdelayprob,
-		    *wdelayprob == -1 ? 0 : (u_int)*wdelayprob,
-		    (off_t)*offset, (off_t)*size, (u_int)*secsize,
-		    (off_t)*stripesize, (off_t)*stripeoffset,
+		    error == -1 ? EIO : (int)error,
+		    count_until_fail == -1 ? 0 : (u_int)count_until_fail,
+		    rfailprob == -1 ? 0 : (u_int)rfailprob,
+		    wfailprob == -1 ? 0 : (u_int)wfailprob,
+		    delaymsec == -1 ? 1 : (u_int)delaymsec,
+		    rdelayprob == -1 ? 0 : (u_int)rdelayprob,
+		    wdelayprob == -1 ? 0 : (u_int)wdelayprob,
+		    (off_t)offset, (off_t)size, (u_int)secsize,
+		    (off_t)stripesize, (off_t)stripeoffset,
 		    physpath) != 0) {
 			return;
 		}
@@ -658,14 +660,22 @@ g_nop_ctl_configure(struct gctl_req *req, struct g_cla
 {
 	struct g_nop_softc *sc;
 	struct g_provider *pp;
-	intmax_t *delaymsec, *error, *rdelayprob, *rfailprob, *wdelayprob,
-	    *wfailprob, *count_until_fail;
+	intmax_t *val, delaymsec, error, rdelayprob, rfailprob, wdelayprob,
+	    wfailprob, count_until_fail;
 	const char *name;
 	char param[16];
 	int i, *nargs;
 
 	g_topology_assert();
 
+	count_until_fail = -1;
+	delaymsec = -1;
+	error = -1;
+	rdelayprob = -1;
+	rfailprob = -1;
+	wdelayprob = -1;
+	wfailprob = -1;
+
 	nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
 	if (nargs == NULL) {
 		gctl_error(req, "No '%s' argument", "nargs");
@@ -675,63 +685,54 @@ g_nop_ctl_configure(struct gctl_req *req, struct g_cla
 		gctl_error(req, "Missing device(s).");
 		return;
 	}
-	error = gctl_get_paraml(req, "error", sizeof(*error));
-	if (error == NULL) {
-		gctl_error(req, "No '%s' argument", "error");
-		return;
+	val = gctl_get_paraml_opt(req, "error", sizeof(*val));
+	if (val != NULL) {
+		error = *val;
 	}
-	count_until_fail = gctl_get_paraml(req, "count_until_fail",
-	    sizeof(*count_until_fail));
-	if (count_until_fail == NULL) {
-		gctl_error(req, "No '%s' argument", "count_until_fail");
-		return;
+	val = gctl_get_paraml_opt(req, "count_until_fail", sizeof(*val));
+	if (val != NULL) {
+		count_until_fail = *val;
 	}
-	rfailprob = gctl_get_paraml(req, "rfailprob", sizeof(*rfailprob));
-	if (rfailprob == NULL) {
-		gctl_error(req, "No '%s' argument", "rfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "rfailprob", sizeof(*val));
+	if (val != NULL) {
+		rfailprob = *val;
+		if (rfailprob < -1 || rfailprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "rfailprob");
+			return;
+		}
 	}
-	if (*rfailprob < -1 || *rfailprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "rfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "wfailprob", sizeof(*val));
+	if (val != NULL) {
+		wfailprob = *val;
+		if (wfailprob < -1 || wfailprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "wfailprob");
+			return;
+		}
 	}
-	wfailprob = gctl_get_paraml(req, "wfailprob", sizeof(*wfailprob));
-	if (wfailprob == NULL) {
-		gctl_error(req, "No '%s' argument", "wfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "delaymsec", sizeof(*val));
+	if (val != NULL) {
+		delaymsec = *val;
+		if (delaymsec < 1 && delaymsec != -1) {
+			gctl_error(req, "Invalid '%s' argument", "delaymsec");
+			return;
+		}
 	}
-	if (*wfailprob < -1 || *wfailprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "wfailprob");
-		return;
+	val = gctl_get_paraml_opt(req, "rdelayprob", sizeof(*val));
+	if (val != NULL) {
+		rdelayprob = *val;
+		if (rdelayprob < -1 || rdelayprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "rdelayprob");
+			return;
+		}
 	}
-
-	delaymsec = gctl_get_paraml(req, "delaymsec", sizeof(*delaymsec));
-	if (delaymsec == NULL) {
-		gctl_error(req, "No '%s' argument", "delaymsec");
-		return;
+	val = gctl_get_paraml_opt(req, "wdelayprob", sizeof(*val));
+	if (val != NULL) {
+		wdelayprob = *val;
+		if (wdelayprob < -1 || wdelayprob > 100) {
+			gctl_error(req, "Invalid '%s' argument", "wdelayprob");
+			return;
+		}
 	}
-	if (*delaymsec < 1 && *delaymsec != -1) {
-		gctl_error(req, "Invalid '%s' argument", "delaymsec");
-		return;
-	}
-	rdelayprob = gctl_get_paraml(req, "rdelayprob", sizeof(*rdelayprob));
-	if (rdelayprob == NULL) {
-		gctl_error(req, "No '%s' argument", "rdelayprob");
-		return;
-	}
-	if (*rdelayprob < -1 || *rdelayprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "rdelayprob");
-		return;
-	}
-	wdelayprob = gctl_get_paraml(req, "wdelayprob", sizeof(*wdelayprob));
-	if (wdelayprob == NULL) {
-		gctl_error(req, "No '%s' argument", "wdelayprob");
-		return;
-	}
-	if (*wdelayprob < -1 || *wdelayprob > 100) {
-		gctl_error(req, "Invalid '%s' argument", "wdelayprob");
-		return;
-	}
 
 	for (i = 0; i < *nargs; i++) {
 		snprintf(param, sizeof(param), "arg%d", i);
@@ -749,20 +750,20 @@ g_nop_ctl_configure(struct gctl_req *req, struct g_cla
 			return;
 		}
 		sc = pp->geom->softc;
-		if (*error != -1)
-			sc->sc_error = (int)*error;
-		if (*rfailprob != -1)
-			sc->sc_rfailprob = (u_int)*rfailprob;
-		if (*wfailprob != -1)
-			sc->sc_wfailprob = (u_int)*wfailprob;
-		if (*rdelayprob != -1)
-			sc->sc_rdelayprob = (u_int)*rdelayprob;
-		if (*wdelayprob != -1)
-			sc->sc_wdelayprob = (u_int)*wdelayprob;
-		if (*delaymsec != -1)
-			sc->sc_delaymsec = (u_int)*delaymsec;
-		if (*count_until_fail != -1)
-			sc->sc_count_until_fail = (u_int)*count_until_fail;
+		if (error != -1)
+			sc->sc_error = (int)error;
+		if (rfailprob != -1)
+			sc->sc_rfailprob = (u_int)rfailprob;
+		if (wfailprob != -1)
+			sc->sc_wfailprob = (u_int)wfailprob;
+		if (rdelayprob != -1)
+			sc->sc_rdelayprob = (u_int)rdelayprob;
+		if (wdelayprob != -1)
+			sc->sc_wdelayprob = (u_int)wdelayprob;
+		if (delaymsec != -1)
+			sc->sc_delaymsec = (u_int)delaymsec;
+		if (count_until_fail != -1)
+			sc->sc_count_until_fail = (u_int)count_until_fail;
 	}
 }
 


More information about the svn-src-all mailing list