--- geom_subr.c.orig Mon Oct 27 01:23:22 2003 +++ geom_subr.c Mon Oct 27 01:27:19 2003 @@ -82,13 +82,12 @@ hh = arg; mp = hh->mp; - g_free(hh); g_trace(G_T_TOPOLOGY, "g_load_class(%s)", mp->name); LIST_FOREACH(mp2, &g_classes, class) { - KASSERT(mp2 != mp, - ("The GEOM class %s already loaded", mp2->name)); - KASSERT(strcmp(mp2->name, mp->name) != 0, - ("A GEOM class named %s is already loaded", mp2->name)); + if (mp2 == mp || strcmp(mp2->name, mp->name) == 0) { + hh->error = EEXIST; + return; + } } if (mp->init != NULL) @@ -178,8 +177,9 @@ switch (type) { case MOD_LOAD: g_trace(G_T_TOPOLOGY, "g_modevent(%s, LOAD)", hh->mp->name); - g_post_event(g_load_class, hh, M_WAITOK, NULL); - error = 0; + error = g_waitfor_event(g_load_class, hh, M_WAITOK, NULL); + if (error == 0) + error = hh->error; break; case MOD_UNLOAD: g_trace(G_T_TOPOLOGY, "g_modevent(%s, UNLOAD)", hh->mp->name); @@ -191,9 +191,9 @@ KASSERT(LIST_EMPTY(&hh->mp->geom), ("Unloaded class (%s) still has geom", hh->mp->name)); } - g_free(hh); break; } + g_free(hh); return (error); }