Date: Fri, 18 Dec 2009 05:51:04 GMT From: Zhouyi Zhou <zhouzhouyi@ec.com.cn> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/141740: g_journal_destroy concurrent error Message-ID: <200912180551.nBI5p4xW082936@www.freebsd.org> Resent-Message-ID: <200912180600.nBI60EhB000484@freefall.freebsd.org>
index | next in thread | raw e-mail
>Number: 141740
>Category: misc
>Synopsis: g_journal_destroy concurrent error
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Dec 18 06:00:14 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: Zhouyi Zhou
>Release: I use gjournal patch on FB6, but it may apply to other FB versions
>Organization:
ICT China
>Environment:
FreeBSD 6.3 i386
>Description:
When the kernel is configured as preemptable, when after the PC excuted function g_journal_destroy line 2352:
2350 while (sc->sc_worker != NULL)
2351 msleep(&sc->sc_worker, &sc->sc_mtx, PRIBIO, "gj:destroy", 0);
2352 mtx_destroy(&sc->sc_mtx);
now the g_topology_unlock has been called, then if g_journal_switcher got scheduled, the concurrence problem will occur.
#0 0x407a8de5 in turnstile_setowner (ts=0x63be6480, owner=0x4) at ../../../kern/subr_turnstile.c:457
#1 0x407a92bc in turnstile_wait (lock=0x836b8210, owner=0x4, queue=0) at ../../../kern/subr_turnstile.c:661
#2 0x40770fb3 in _mtx_lock_sleep (m=0x836b8210, tid=2145898496, opts=0, file=0x0, line=0) at ../../../kern/kern_mutex.c:580
#3 0x407359de in g_journal_do_switch (classp=0x40dbaee0, td=0x7fe7d000) at ../../../geom/journal/g_journal.c:2861
#4 0x40735c57 in g_journal_switcher (arg=0x40dbaee0) at ../../../geom/journal/g_journal.c:2909
>How-To-Repeat:
reboot/shutdown, if luck, the problem occurs
>Fix:
--- g_journal.c~ 2009-12-07 10:37:58.000000000 +0000
+++ g_journal.c 2009-12-18 12:25:20.000000000 +0000
@@ -2349,7 +2349,7 @@
wakeup(sc);
while (sc->sc_worker != NULL)
msleep(&sc->sc_worker, &sc->sc_mtx, PRIBIO, "gj:destroy", 0);
- mtx_destroy(&sc->sc_mtx);
+
if (pp != NULL) {
GJ_DEBUG(1, "Marking %s as clean.", sc->sc_name);
@@ -2378,6 +2378,7 @@
g_post_event(g_journal_destroy_consumer, cp, M_WAITOK, NULL);
}
gp->softc = NULL;
+ mtx_destroy(&sc->sc_mtx);
g_wither_geom(gp, ENXIO);
free(sc, M_JOURNAL);
return (0);
>Release-Note:
>Audit-Trail:
>Unformatted:
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912180551.nBI5p4xW082936>
