diff options
author | Poul-Henning Kamp <phk@FreeBSD.org> | 2002-10-14 10:05:23 +0000 |
---|---|---|
committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2002-10-14 10:05:23 +0000 |
commit | 6b4abfd6eb683106989a726c3d12ef4381f0f575 (patch) | |
tree | 138c12b029e1cb5fb20e9a7d67f5a378686e57f1 /sys/geom/geom_subr.c | |
parent | d0e17c1b913aad0aede2624a0bbfbeabfed6edda (diff) | |
download | src-6b4abfd6eb683106989a726c3d12ef4381f0f575.tar.gz src-6b4abfd6eb683106989a726c3d12ef4381f0f575.zip |
Implement the GEOMCONFIGGEOM ioctl which can be used to manually create
and configure an instance of a class on a give provider.
Sponsored by: DARPA & NAI Labs
Notes
Notes:
svn path=/head/; revision=105092
Diffstat (limited to 'sys/geom/geom_subr.c')
-rw-r--r-- | sys/geom/geom_subr.c | 119 |
1 files changed, 82 insertions, 37 deletions
diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index 45130c6f8d94..5fc726d006c0 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -572,43 +572,6 @@ g_class_by_name(char *name) } struct g_geom * -g_create_geomf(char *class, struct g_provider *pp, char *fmt, ...) -{ - va_list ap; - struct sbuf *sb; - char *s; - struct g_class *mp; - struct g_geom *gp; - - g_trace(G_T_TOPOLOGY, "g_create_geom(%s, %p(%s))", class, - pp, pp == NULL ? "" : pp->name); - g_topology_assert(); - gp = NULL; - mp = g_class_by_name(class); - if (mp == NULL) - return (NULL); - if (fmt != NULL) { - va_start(ap, fmt); - mtx_lock(&Giant); - sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); - sbuf_vprintf(sb, fmt, ap); - sbuf_finish(sb); - mtx_unlock(&Giant); - s = sbuf_data(sb); - } else { - s = NULL; - } - if (pp != NULL) - gp = mp->taste(mp, pp, G_TF_INSIST); - if (gp == NULL && mp->create_geom == NULL) - return (NULL); - if (gp == NULL) - gp = mp->create_geom(mp, pp, s); - /* XXX: delete sbuf */ - return (gp); -} - -struct g_geom * g_insert_geom(char *class, struct g_consumer *cp) { struct g_class *mp; @@ -699,4 +662,86 @@ g_sanity(void *ptr) } } +struct g_class * +g_idclass(struct geomidorname *p) +{ + struct g_class *mp; + char *n; + + if (p->len == 0) { + LIST_FOREACH(mp, &g_classes, class) + if ((uintptr_t)mp == p->u.id) + return (mp); + return (NULL); + } + n = g_malloc(p->len + 1, M_WAITOK); + if (copyin(p->u.name, n, p->len) == 0) { + n[p->len] = '\0'; + LIST_FOREACH(mp, &g_classes, class) + if (!bcmp(n, mp->name, p->len + 1)) { + g_free(n); + return (mp); + } + } + g_free(n); + return (NULL); +} + +struct g_geom * +g_idgeom(struct geomidorname *p) +{ + struct g_class *mp; + struct g_geom *gp; + char *n; + + if (p->len == 0) { + LIST_FOREACH(mp, &g_classes, class) + LIST_FOREACH(gp, &mp->geom, geom) + if ((uintptr_t)gp == p->u.id) + return (gp); + return (NULL); + } + n = g_malloc(p->len + 1, M_WAITOK); + if (copyin(p->u.name, n, p->len) == 0) { + n[p->len] = '\0'; + LIST_FOREACH(mp, &g_classes, class) + LIST_FOREACH(gp, &mp->geom, geom) + if (!bcmp(n, gp->name, p->len + 1)) { + g_free(n); + return (gp); + } + } + g_free(n); + return (NULL); +} +struct g_provider * +g_idprovider(struct geomidorname *p) +{ + struct g_class *mp; + struct g_geom *gp; + struct g_provider *pp; + char *n; + + if (p->len == 0) { + LIST_FOREACH(mp, &g_classes, class) + LIST_FOREACH(gp, &mp->geom, geom) + LIST_FOREACH(pp, &gp->provider, provider) + if ((uintptr_t)pp == p->u.id) + return (pp); + return (NULL); + } + n = g_malloc(p->len + 1, M_WAITOK); + if (copyin(p->u.name, n, p->len) == 0) { + n[p->len] = '\0'; + LIST_FOREACH(mp, &g_classes, class) + LIST_FOREACH(gp, &mp->geom, geom) + LIST_FOREACH(pp, &gp->provider, provider) + if (!bcmp(n, pp->name, p->len + 1)) { + g_free(n); + return (pp); + } + } + g_free(n); + return (NULL); +} |