summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/geom/geom.h3
-rw-r--r--sys/geom/geom_bsd.c4
-rw-r--r--sys/geom/geom_ccd.c4
-rw-r--r--sys/geom/geom_ctl.c40
4 files changed, 34 insertions, 17 deletions
diff --git a/sys/geom/geom.h b/sys/geom/geom.h
index d00deb3..7f6bf5a 100644
--- a/sys/geom/geom.h
+++ b/sys/geom/geom.h
@@ -336,7 +336,8 @@ extern struct sx topology_lock;
#endif /* _KERNEL */
/* geom_ctl.c */
-void gctl_set_param(struct gctl_req *req, const char *param, void const *ptr, int len);
+int gctl_set_param(struct gctl_req *req, const char *param, void const *ptr, int len);
+void gctl_set_param_err(struct gctl_req *req, const char *param, void const *ptr, int len);
void *gctl_get_param(struct gctl_req *req, const char *param, int *len);
char const *gctl_get_asciiparam(struct gctl_req *req, const char *param);
void *gctl_get_paraml(struct gctl_req *req, const char *param, int len);
diff --git a/sys/geom/geom_bsd.c b/sys/geom/geom_bsd.c
index b7402cf..7d5b5d1 100644
--- a/sys/geom/geom_bsd.c
+++ b/sys/geom/geom_bsd.c
@@ -635,8 +635,8 @@ g_bsd_config(struct gctl_req *req, struct g_class *mp, char const *verb)
gsp = gp->softc;
ms = gsp->softc;
if (!strcmp(verb, "read mbroffset")) {
- gctl_set_param(req, "mbroffset",
- &ms->mbroffset, sizeof(ms->mbroffset));
+ gctl_set_param_err(req, "mbroffset", &ms->mbroffset,
+ sizeof(ms->mbroffset));
return;
} else if (!strcmp(verb, "write label")) {
label = gctl_get_paraml(req, "label", LABELSIZE);
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index bfa125d..fb66882 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -782,7 +782,7 @@ g_ccd_create(struct gctl_req *req, struct g_class *mp)
else
sbuf_printf(sb, "concatenated\n");
sbuf_finish(sb);
- gctl_set_param(req, "output", sbuf_data(sb), sbuf_len(sb) + 1);
+ gctl_set_param_err(req, "output", sbuf_data(sb), sbuf_len(sb) + 1);
sbuf_delete(sb);
}
@@ -833,7 +833,7 @@ g_ccd_list(struct gctl_req *req, struct g_class *mp)
sbuf_printf(sb, "\n");
}
sbuf_finish(sb);
- gctl_set_param(req, "output", sbuf_data(sb), sbuf_len(sb) + 1);
+ gctl_set_param_err(req, "output", sbuf_data(sb), sbuf_len(sb) + 1);
sbuf_delete(sb);
}
diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c
index 8186bc7..9c183b1 100644
--- a/sys/geom/geom_ctl.c
+++ b/sys/geom/geom_ctl.c
@@ -268,8 +268,9 @@ gctl_dump(struct gctl_req *req)
}
}
-void
-gctl_set_param(struct gctl_req *req, const char *param, void const *ptr, int len)
+int
+gctl_set_param(struct gctl_req *req, const char *param, void const *ptr,
+ int len)
{
int i;
struct gctl_req_arg *ap;
@@ -278,20 +279,35 @@ gctl_set_param(struct gctl_req *req, const char *param, void const *ptr, int len
ap = &req->arg[i];
if (strcmp(param, ap->name))
continue;
- if (!(ap->flag & GCTL_PARAM_WR)) {
- gctl_error(req, "No write access %s argument", param);
- return;
- }
+ if (!(ap->flag & GCTL_PARAM_WR))
+ return (EPERM);
+ ap->flag |= GCTL_PARAM_CHANGED;
if (ap->len < len) {
- gctl_error(req, "Wrong length %s argument", param);
- return;
+ bcopy(ptr, ap->kvalue, ap->len);
+ return (ENOSPC);
}
bcopy(ptr, ap->kvalue, len);
- ap->flag |= GCTL_PARAM_CHANGED;
- return;
+ return (0);
+ }
+ return (EINVAL);
+}
+
+void
+gctl_set_param_err(struct gctl_req *req, const char *param, void const *ptr,
+ int len)
+{
+
+ switch (gctl_set_param(req, param, ptr, len)) {
+ case EPERM:
+ gctl_error(req, "No write access %s argument", param);
+ break;
+ case ENOSPC:
+ gctl_error(req, "Wrong length %s argument", param);
+ break;
+ case EINVAL:
+ gctl_error(req, "Missing %s argument", param);
+ break;
}
- gctl_error(req, "Missing %s argument", param);
- return;
}
void *
OpenPOWER on IntegriCloud