Index: geom_event.c =================================================================== RCS file: /private/FreeBSD/src/sys/geom/geom_event.c,v retrieving revision 1.49 diff -u -p -r1.49 geom_event.c --- geom_event.c 10 Mar 2004 08:49:08 -0000 1.49 +++ geom_event.c 13 Apr 2004 19:18:52 -0000 @@ -83,6 +83,20 @@ g_waitidle(void) } void +g_waitidle_lock(void) +{ + + g_topology_assert_not(); +again: + g_waitidle(); + g_topology_lock(); + if (g_pending_events > 0) { + g_topology_unlock(); + goto again; + } +} + +void g_orphan_provider(struct g_provider *pp, int error) { Index: geom.h =================================================================== RCS file: /private/FreeBSD/src/sys/geom/geom.h,v retrieving revision 1.81 diff -u -p -r1.81 geom.h --- geom.h 10 Mar 2004 08:49:08 -0000 1.81 +++ geom.h 13 Apr 2004 19:19:09 -0000 @@ -200,6 +200,7 @@ int g_waitfor_event(g_event_t *func, voi void g_cancel_event(void *ref); void g_orphan_provider(struct g_provider *pp, int error); void g_waitidle(void); +void g_waitidle_lock(void); /* geom_subr.c */ int g_access(struct g_consumer *cp, int nread, int nwrite, int nexcl); Index: geom_dev.c =================================================================== RCS file: /private/FreeBSD/src/sys/geom/geom_dev.c,v retrieving revision 1.73 diff -u -p -r1.73 geom_dev.c --- geom_dev.c 21 Feb 2004 21:10:49 -0000 1.73 +++ geom_dev.c 13 Apr 2004 19:16:48 -0000 @@ -210,7 +210,7 @@ g_dev_open(dev_t dev, int flags, int fmt #else e = 0; #endif - g_topology_lock(); + g_waitidle_lock(); if (dev->si_devsw == NULL) error = ENXIO; /* We were orphaned */ else