Index: geom_event.c =================================================================== RCS file: /usr/repo/src/sys/geom/geom_event.c,v retrieving revision 1.53 diff -u -p -r1.53 geom_event.c --- geom_event.c 18 May 2005 21:53:08 -0000 1.53 +++ geom_event.c 31 Aug 2005 20:05:18 -0000 @@ -84,8 +84,13 @@ g_waitidle(void) g_topology_assert_not(); mtx_assert(&Giant, MA_NOTOWNED); - while (g_pending_events) + mtx_lock(&g_eventlock); + while (g_pending_events) { + mtx_unlock(&g_eventlock); tsleep(&g_pending_events, PPAUSE, "g_waitidle", hz/5); + mtx_lock(&g_eventlock); + } + mtx_unlock(&g_eventlock); curthread->td_pflags &= ~TDP_GEOM; } @@ -94,11 +99,15 @@ g_waitidlelock(void) { g_topology_assert(); + mtx_lock(&g_eventlock); while (g_pending_events) { + mtx_unlock(&g_eventlock); g_topology_unlock(); tsleep(&g_pending_events, PPAUSE, "g_waitidle", hz/5); g_topology_lock(); + mtx_lock(&g_eventlock); } + mtx_unlock(&g_eventlock); } void @@ -203,9 +212,11 @@ one_event(void) } else { g_free(ep); } + mtx_lock(&g_eventlock); g_pending_events--; if (g_pending_events == 0) wakeup(&g_pending_events); + mtx_unlock(&g_eventlock); g_topology_unlock(); return (1); }