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);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to