From 189337d81f1164b73b6ff4fa21010b2138fc0047 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Mon, 2 Jun 2003 20:50:03 +0000 Subject: [PATCH] Begin deevilification of CCD: Make CCD a GEOM class. For now only use this for implementing a OAM config method which can return a list of configured CCD devices in the format which "ccdconfig -g[v]" would normally output. --- sys/dev/ccd/ccd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++- sys/geom/geom_ccd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/sys/dev/ccd/ccd.c b/sys/dev/ccd/ccd.c index 541724ad8d85..ea3c5ee8396f 100644 --- a/sys/dev/ccd/ccd.c +++ b/sys/dev/ccd/ccd.c @@ -63,10 +63,10 @@ #include #include #include -#include #include #include #include +#include #include #include @@ -1264,3 +1264,58 @@ ccdunlock(struct ccd_s *cs) wakeup(cs); } } + +static struct sbuf * +g_ccd_list(int verbose) +{ + struct sbuf *sb; + struct ccd_s *cs; + int i; + + sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); + sbuf_clear(sb); + LIST_FOREACH(cs, &ccd_softc_list, list) { + if (!IS_INITED(cs)) + continue; + if (verbose) { + sbuf_printf(sb, + "# ccd\t\tileave\tflags\tcomponent devices\n"); + verbose = 0; + } + sbuf_printf(sb, "ccd%d\t\t%d\t%d\t", + cs->sc_unit, cs->sc_ileave, cs->sc_cflags & CCDF_USERMASK); + + for (i = 0; i < cs->sc_nccdisks; ++i) { + sbuf_printf(sb, "%s%s", i == 0 ? "" : " ", + cs->sc_cinfo[i].ci_path); + } + sbuf_printf(sb, "\n"); + } + sbuf_finish(sb); + return (sb); +} + +static void +g_ccd_config(struct gctl_req *req, struct g_class *mp, char const *verb) +{ + struct sbuf *sb; + + g_topology_assert(); + if (!strcmp(verb, "create geom")) { + gctl_error(req, "TBD"); + } else if (!strcmp(verb, "destroy geom")) { + gctl_error(req, "TBD"); + } else if (!strcmp(verb, "list")) { + sb = g_ccd_list(gctl_get_param(req, "verbose", NULL) ? 1 : 0); + gctl_set_param(req, "output", sbuf_data(sb), sbuf_len(sb) + 1); + } else { + gctl_error(req, "unknown verb"); + } +} + +static struct g_class g_ccd_class = { + .name = "CCD", + .ctlreq = g_ccd_config, +}; + +DECLARE_GEOM_CLASS(g_ccd_class, g_ccd); diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c index 541724ad8d85..ea3c5ee8396f 100644 --- a/sys/geom/geom_ccd.c +++ b/sys/geom/geom_ccd.c @@ -63,10 +63,10 @@ #include #include #include -#include #include #include #include +#include #include #include @@ -1264,3 +1264,58 @@ ccdunlock(struct ccd_s *cs) wakeup(cs); } } + +static struct sbuf * +g_ccd_list(int verbose) +{ + struct sbuf *sb; + struct ccd_s *cs; + int i; + + sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); + sbuf_clear(sb); + LIST_FOREACH(cs, &ccd_softc_list, list) { + if (!IS_INITED(cs)) + continue; + if (verbose) { + sbuf_printf(sb, + "# ccd\t\tileave\tflags\tcomponent devices\n"); + verbose = 0; + } + sbuf_printf(sb, "ccd%d\t\t%d\t%d\t", + cs->sc_unit, cs->sc_ileave, cs->sc_cflags & CCDF_USERMASK); + + for (i = 0; i < cs->sc_nccdisks; ++i) { + sbuf_printf(sb, "%s%s", i == 0 ? "" : " ", + cs->sc_cinfo[i].ci_path); + } + sbuf_printf(sb, "\n"); + } + sbuf_finish(sb); + return (sb); +} + +static void +g_ccd_config(struct gctl_req *req, struct g_class *mp, char const *verb) +{ + struct sbuf *sb; + + g_topology_assert(); + if (!strcmp(verb, "create geom")) { + gctl_error(req, "TBD"); + } else if (!strcmp(verb, "destroy geom")) { + gctl_error(req, "TBD"); + } else if (!strcmp(verb, "list")) { + sb = g_ccd_list(gctl_get_param(req, "verbose", NULL) ? 1 : 0); + gctl_set_param(req, "output", sbuf_data(sb), sbuf_len(sb) + 1); + } else { + gctl_error(req, "unknown verb"); + } +} + +static struct g_class g_ccd_class = { + .name = "CCD", + .ctlreq = g_ccd_config, +}; + +DECLARE_GEOM_CLASS(g_ccd_class, g_ccd);