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-stable-12
mailing list