diff -rup geom.orig/geom.h geom/geom.h --- geom.orig/geom.h Fri Jan 23 16:54:52 2004 +++ geom/geom.h Mon Jan 26 00:34:48 2004 @@ -287,6 +287,10 @@ extern struct sx topology_lock; }; \ DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); +#ifdef INVARIANTS +boolean_t g_on_event_queue(void); +#endif + #endif /* _KERNEL */ /* geom_ctl.c */ diff -rup geom.orig/geom_event.c geom/geom_event.c --- geom.orig/geom_event.c Fri Jan 23 16:54:52 2004 +++ geom/geom_event.c Mon Jan 26 00:29:53 2004 @@ -312,7 +312,9 @@ g_waitfor_event(g_event_t *func, void *a /* g_topology_assert_not(); */ KASSERT(flag == M_WAITOK || flag == M_NOWAIT, - ("Wrong flag to g_post_event")); + ("Wrong flag to g_waitfor_event")); + KASSERT(!g_on_event_queue(), + ("Function g_waitfor_event called from the event queue")); va_start(ap, flag); error = g_post_event_x(func, arg, flag | EV_WAKEUP, &ep, ap); va_end(ap); diff -rup geom.orig/geom_kern.c geom/geom_kern.c --- geom.orig/geom_kern.c Fri Jan 23 16:54:52 2004 +++ geom/geom_kern.c Mon Jan 26 00:35:20 2004 @@ -136,6 +136,18 @@ g_event_procbody(void) } } +#ifdef INVARIANTS +/* + * Check if we're on the event queue. + */ +boolean_t +g_on_event_queue(void) +{ + + return (curthread->td_proc->p_pid == g_event_proc->p_pid); +} +#endif + static struct kproc_desc g_event_kp = { "g_event", g_event_procbody,