Page MenuHomeFreeBSD

D31354.id.diff
No OneTemporary

D31354.id.diff

diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c
--- a/sys/geom/geom_vfs.c
+++ b/sys/geom/geom_vfs.c
@@ -53,6 +53,7 @@
struct g_vfs_softc {
struct mtx sc_mtx;
struct bufobj *sc_bo;
+ struct g_event *sc_event;
int sc_active;
int sc_orphaned;
int sc_enxio_active;
@@ -96,6 +97,7 @@
g_vfs_done(struct bio *bip)
{
struct g_consumer *cp;
+ struct g_event *event;
struct g_vfs_softc *sc;
struct buf *bp;
int destroy;
@@ -157,9 +159,14 @@
mtx_lock(&sc->sc_mtx);
destroy = ((--sc->sc_active) == 0 && sc->sc_orphaned);
+ if (destroy) {
+ event = sc->sc_event;
+ sc->sc_event = NULL;
+ } else
+ event = NULL;
mtx_unlock(&sc->sc_mtx);
if (destroy)
- g_post_event(g_vfs_destroy, cp, M_WAITOK, NULL);
+ g_post_event_ep(g_vfs_destroy, cp, event, NULL);
bufdone(bp);
}
@@ -212,6 +219,7 @@
g_vfs_orphan(struct g_consumer *cp)
{
struct g_geom *gp;
+ struct g_event *event;
struct g_vfs_softc *sc;
int destroy;
@@ -222,12 +230,20 @@
sc = gp->softc;
if (sc == NULL)
return;
+ event = g_alloc_event(M_WAITOK);
mtx_lock(&sc->sc_mtx);
+ KASSERT(sc->sc_event == NULL, ("g_vfs %p already has an event", sc));
sc->sc_orphaned = 1;
destroy = (sc->sc_active == 0);
+ if (!destroy) {
+ sc->sc_event = event;
+ event = NULL;
+ }
mtx_unlock(&sc->sc_mtx);
- if (destroy)
+ if (destroy) {
+ g_free(event);
g_vfs_destroy(cp, 0);
+ }
/*
* Do not destroy the geom. Filesystem will do that during unmount.
@@ -297,5 +313,6 @@
mtx_destroy(&sc->sc_mtx);
if (!sc->sc_orphaned || cp->provider == NULL)
g_wither_geom_close(gp, ENXIO);
+ KASSERT(sc->sc_event == NULL, ("g_vfs %p event is non-NULL", sc));
g_free(sc);
}

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 23, 10:47 AM (10 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16794121
Default Alt Text
D31354.id.diff (1 KB)

Event Timeline