summaryrefslogtreecommitdiff
path: root/sys/geom/journal/g_journal.c
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2008-12-06 11:33:10 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2008-12-06 11:33:10 +0000
commitd27a975f72adee6dc0f31a61570faff08c018d0c (patch)
tree733fa79459ad8e59b7d0007b385cfaa07e2b70a9 /sys/geom/journal/g_journal.c
parentf1f8583397585cf5c7ce267cd5e7e87debb9990e (diff)
Notes
Diffstat (limited to 'sys/geom/journal/g_journal.c')
-rw-r--r--sys/geom/journal/g_journal.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c
index 4dbb44b19e20..2db236440fcd 100644
--- a/sys/geom/journal/g_journal.c
+++ b/sys/geom/journal/g_journal.c
@@ -2108,6 +2108,12 @@ g_journal_worker(void *arg)
g_topology_unlock();
last_write = time_second;
+ if (sc->sc_rootmount != NULL) {
+ GJ_DEBUG(1, "root_mount_rel %p", sc->sc_rootmount);
+ root_mount_rel(sc->sc_rootmount);
+ sc->sc_rootmount = NULL;
+ }
+
for (;;) {
/* Get first request from the queue. */
mtx_lock(&sc->sc_mtx);
@@ -2304,6 +2310,9 @@ g_journal_create(struct g_class *mp, struct g_provider *pp,
sc->sc_inactive.jj_queue = NULL;
sc->sc_active.jj_queue = NULL;
+ sc->sc_rootmount = root_mount_hold("GJOURNAL");
+ GJ_DEBUG(1, "root_mount_hold %p", sc->sc_rootmount);
+
callout_init(&sc->sc_callout, CALLOUT_MPSAFE);
if (md->md_type != GJ_TYPE_COMPLETE) {
/*
@@ -2434,6 +2443,13 @@ g_journal_destroy(struct g_journal_softc *sc)
sc->sc_flags |= (GJF_DEVICE_DESTROY | GJF_DEVICE_CLEAN);
g_topology_unlock();
+
+ if (sc->sc_rootmount != NULL) {
+ GJ_DEBUG(1, "root_mount_rel %p", sc->sc_rootmount);
+ root_mount_rel(sc->sc_rootmount);
+ sc->sc_rootmount = NULL;
+ }
+
callout_drain(&sc->sc_callout);
mtx_lock(&sc->sc_mtx);
wakeup(sc);