aboutsummaryrefslogtreecommitdiff
path: root/sys/geom/geom_ctl.c
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2003-04-22 21:01:46 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2003-04-22 21:01:46 +0000
commitea9ab6bed2483079ac2f35a715e242cbf77661c0 (patch)
tree68b4c503a9c64e4284f993a660024f65d836aabc /sys/geom/geom_ctl.c
parent2c30da600eae746b6c4bc092e500b2a9644feb0f (diff)
downloadsrc-ea9ab6bed2483079ac2f35a715e242cbf77661c0.tar.gz
src-ea9ab6bed2483079ac2f35a715e242cbf77661c0.zip
Implement handling of CONFIG_GEOM OAM request.
Notes
Notes: svn path=/head/; revision=113876
Diffstat (limited to 'sys/geom/geom_ctl.c')
-rw-r--r--sys/geom/geom_ctl.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c
index ab50552ca43b..279156e35de9 100644
--- a/sys/geom/geom_ctl.c
+++ b/sys/geom/geom_ctl.c
@@ -381,6 +381,42 @@ gctl_destroy_geom(struct gctl_req *req)
return (error);
}
+static int
+gctl_config_geom(struct gctl_req *req)
+{
+ struct g_class *mp;
+ struct g_geom *gp;
+ char *verb;
+ int error, vlen;
+
+ g_topology_assert();
+ mp = gctl_get_class(req);
+ if (mp == NULL)
+ return (gctl_error(req, "Class not found"));
+ if (mp->config_geom == NULL)
+ return (gctl_error(req, "Class has no config_geom method"));
+ gp = gctl_get_geom(req, mp);
+ if (gp == NULL)
+ return (gctl_error(req, "Geom not specified"));
+ if (gp->class != mp)
+ return (gctl_error(req, "Geom not of specificed class"));
+ verb = gctl_get_param(req, "verb", &vlen);
+ if (verb == NULL)
+ return (gctl_error(req, "Missing verb parameter"));
+ if (vlen < 2) {
+ g_free(verb);
+ return (gctl_error(req, "Too short verb parameter"));
+ }
+ if (verb[vlen - 1] != '\0') {
+ g_free(verb);
+ return (gctl_error(req, "Unterminated verb parameter"));
+ }
+ error = mp->config_geom(req, gp, verb);
+ g_free(verb);
+ g_topology_assert();
+ return (error);
+}
+
/*
* Handle ioctl from libgeom::geom_ctl.c
*/
@@ -426,6 +462,9 @@ g_ctl_ioctl_ctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *t
case GCTL_DESTROY_GEOM:
error = gctl_destroy_geom(req);
break;
+ case GCTL_CONFIG_GEOM:
+ error = gctl_config_geom(req);
+ break;
default:
error = gctl_error(req, "XXX: TBD");
break;