Make it possible to use gjournal for the root filesystem. Previously,
an unclean shutdown would make it impossible to mount rootfs at boot. PR: kern/128529 Reviewed by: pjd Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation
This commit is contained in:
parent
f1f8583397
commit
d27a975f72
@ -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);
|
||||
|
@ -163,6 +163,8 @@ struct g_journal_softc {
|
||||
|
||||
struct callout sc_callout;
|
||||
struct proc *sc_worker;
|
||||
|
||||
struct root_hold_token *sc_rootmount;
|
||||
};
|
||||
#define sc_dprovider sc_dconsumer->provider
|
||||
#define sc_jprovider sc_jconsumer->provider
|
||||
|
Loading…
x
Reference in New Issue
Block a user