--- geom_subr.c.orig Sat Jan 17 01:19:58 2004 +++ geom_subr.c Sat Jan 17 19:28:55 2004 @@ -288,6 +288,9 @@ g_new_consumer(struct g_geom *gp) struct g_consumer *cp; g_topology_assert(); + KASSERT(!(gp->flags & G_GEOM_WITHER), + ("g_new_consumer called on geom(%s) with WITHER flag set (class %s)", + gp->name, gp->class->name)); KASSERT(gp->orphan != NULL, ("g_new_consumer on geom(%s) (class %s) without orphan", gp->name, gp->class->name)); @@ -365,6 +368,9 @@ g_new_providerf(struct g_geom *gp, const va_list ap; g_topology_assert(); + KASSERT(!(gp->flags & G_GEOM_WITHER), + ("g_new_providerf called on geom(%s) with WITHER flag set (class %s)", + gp->name, gp->class->name)); sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); va_start(ap, fmt); sbuf_vprintf(sb, fmt, ap); @@ -388,6 +394,9 @@ void g_error_provider(struct g_provider *pp, int error) { + KASSERT(!(pp->geom->flags & G_GEOM_WITHER), + ("error change for provider(%s) on geom(%s) with WITHER flag set (class %s)", + pp->geom->name, pp->geom->class->name)); pp->error = error; } @@ -504,6 +513,8 @@ g_attach(struct g_consumer *cp, struct g g_topology_assert(); KASSERT(cp->provider == NULL, ("attach but attached")); + if (pp->geom->flags & G_GEOM_WITHER) + return (EPERM); /* XXX: ENXIO? pp->error? */ cp->provider = pp; LIST_INSERT_HEAD(&pp->consumers, cp, consumers); error = redo_rank(cp->geom);