aboutsummaryrefslogtreecommitdiff
path: root/sys/geom/geom_subr.c
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2002-10-14 10:05:23 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2002-10-14 10:05:23 +0000
commit6b4abfd6eb683106989a726c3d12ef4381f0f575 (patch)
tree138c12b029e1cb5fb20e9a7d67f5a378686e57f1 /sys/geom/geom_subr.c
parentd0e17c1b913aad0aede2624a0bbfbeabfed6edda (diff)
downloadsrc-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.c119
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);
+}