svn commit: r348792 - stable/12/sys/geom/nop

Kirk McKusick mckusick at FreeBSD.org
Fri Jun 7 22:24:59 UTC 2019


Author: mckusick
Date: Fri Jun  7 22:24:57 2019
New Revision: 348792
URL: https://svnweb.freebsd.org/changeset/base/348792

Log:
  MFC of 348259
  
  Proper draining of GEOM nop forced shutdown.

Modified:
  stable/12/sys/geom/nop/g_nop.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/geom/nop/g_nop.c
==============================================================================
--- stable/12/sys/geom/nop/g_nop.c	Fri Jun  7 21:30:11 2019	(r348791)
+++ stable/12/sys/geom/nop/g_nop.c	Fri Jun  7 22:24:57 2019	(r348792)
@@ -54,17 +54,26 @@ static int g_nop_destroy_geom(struct gctl_req *req, st
     struct g_geom *gp);
 static void g_nop_config(struct gctl_req *req, struct g_class *mp,
     const char *verb);
-static void g_nop_dumpconf(struct sbuf *sb, const char *indent,
-    struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp);
+static g_access_t g_nop_access;
+static g_dumpconf_t g_nop_dumpconf;
+static g_orphan_t g_nop_orphan;
+static g_provgone_t g_nop_providergone;
+static g_resize_t g_nop_resize;
+static g_start_t g_nop_start;
 
 struct g_class g_nop_class = {
 	.name = G_NOP_CLASS_NAME,
 	.version = G_VERSION,
 	.ctlreq = g_nop_config,
-	.destroy_geom = g_nop_destroy_geom
+	.destroy_geom = g_nop_destroy_geom,
+	.access = g_nop_access,
+	.dumpconf = g_nop_dumpconf,
+	.orphan = g_nop_orphan,
+	.providergone = g_nop_providergone,
+	.resize = g_nop_resize,
+	.start = g_nop_start,
 };
 
-
 static void
 g_nop_orphan(struct g_consumer *cp)
 {
@@ -277,11 +286,6 @@ g_nop_create(struct gctl_req *req, struct g_class *mp,
 	sc->sc_wrotebytes = 0;
 	mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF);
 	gp->softc = sc;
-	gp->start = g_nop_start;
-	gp->orphan = g_nop_orphan;
-	gp->resize = g_nop_resize;
-	gp->access = g_nop_access;
-	gp->dumpconf = g_nop_dumpconf;
 
 	newpp = g_new_providerf(gp, "%s", gp->name);
 	newpp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE;
@@ -314,6 +318,18 @@ fail:
 	return (error);
 }
 
+static void
+g_nop_providergone(struct g_provider *pp)
+{
+	struct g_geom *gp = pp->geom;
+	struct g_nop_softc *sc = gp->softc;
+
+	gp->softc = NULL;
+	free(sc->sc_physpath, M_GEOM);
+	mtx_destroy(&sc->sc_lock);
+	g_free(sc);
+}
+
 static int
 g_nop_destroy(struct g_geom *gp, boolean_t force)
 {
@@ -324,7 +340,6 @@ g_nop_destroy(struct g_geom *gp, boolean_t force)
 	sc = gp->softc;
 	if (sc == NULL)
 		return (ENXIO);
-	free(sc->sc_physpath, M_GEOM);
 	pp = LIST_FIRST(&gp->provider);
 	if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) {
 		if (force) {
@@ -338,9 +353,6 @@ g_nop_destroy(struct g_geom *gp, boolean_t force)
 	} else {
 		G_NOP_DEBUG(0, "Device %s removed.", gp->name);
 	}
-	gp->softc = NULL;
-	mtx_destroy(&sc->sc_lock);
-	g_free(sc);
 	g_wither_geom(gp, ENXIO);
 
 	return (0);


More information about the svn-src-all mailing list