From eaf884ba55def055fd81ff3291a1a534fc8bd8f9 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 8 May 2017 16:26:56 +0200 Subject: nv: Fix setting of nv.dev.. variables nv variables with the form nv.dev.. shall be mirrored to the device parameter of the device named . This is broken since: | commit 35d8e858bea17ec4796069c9c27fd0b134125eaf | Author: Sascha Hauer | Date: Thu Apr 6 15:23:56 2017 +0200 | | nv: Do not create globalvars from nvvars Fix this by attaching the setting of the mirror device parameter directly to the nv device rather than to the global device. Reported-by: Ian Abbott Signed-off-by: Sascha Hauer --- common/globalvar.c | 65 +++++++++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/common/globalvar.c b/common/globalvar.c index 1385559fd7..c48e7df067 100644 --- a/common/globalvar.c +++ b/common/globalvar.c @@ -120,28 +120,21 @@ void dev_param_init_from_nv(struct device_d *dev, const char *name) } /** - * nvvar_device_dispatch - dispatch dev.. name into device and parameter name + * nvvar_device_set - set device parameter dev.. * @name: The incoming name in the form dev.. - * @dev: The returned device_d * belonging to - * @pname: the parameter name + * val: The value . should be set to * - * Given a dev.. string this function finds the device_d * belonging to - * and the parameter name from . + * Given a dev.. string this function sets the corresponding parameter + * in the struct device_d * named to @val. * - * Return: When incoming string does not belong to the device namespace (does not begin - * with "dev." this function returns 0. A value > 0 is returned when the incoming string - * is in the device namespace and the string can be dispatched into a device_d * and a - * parameter name. A negative error code is returned when the incoming string belongs to - * the device namespace, but cannot be dispatched. + * Return: 0 for success, negative error code for failure */ -static int nvvar_device_dispatch(const char *name, struct device_d **dev, - const char **pname) +static int nvvar_device_set(const char *name, const char *val) { + struct device_d *dev; char *devname; - const char *dot; - int dotpos; - - *dev = NULL; + const char *dot, *pname; + int dotpos, ret; if (strncmp(name, "dev.", 4)) return 0; @@ -155,15 +148,20 @@ static int nvvar_device_dispatch(const char *name, struct device_d **dev, dotpos = dot - name; devname = xstrndup(name, dotpos); - *dev = get_device_by_name(devname); + dev = get_device_by_name(devname); free(devname); - if (*dev == &nv_device || *dev == &global_device) + if (dev == &nv_device || dev == &global_device) return -EINVAL; - *pname = dot + 1; + pname = dot + 1; + + ret = dev_set_param(dev, pname, val); + if (ret) + pr_err("Cannot init param from nv: %s.%s=%s: %s\n", + dev_name(dev), pname, val, strerror(-ret)); - return 1; + return 0; } static int nv_set(struct param_d *p, const char *val) @@ -174,6 +172,10 @@ static int nv_set(struct param_d *p, const char *val) if (!val) val = ""; + ret = nvvar_device_set(p->name, val); + if (ret) + return ret; + g = get_param_by_name(&global_device, p->name); if (g) { ret = dev_set_param(&global_device, p->name, val); @@ -373,27 +375,6 @@ void globalvar_set_match(const char *match, const char *val) } } -static int globalvar_simple_set(struct param_d *p, const char *val) -{ - struct device_d *rdev; - const char *pname = NULL; - int ret; - - ret = nvvar_device_dispatch(p->name, &rdev, &pname); - if (ret < 0) - return ret; - - if (ret && rdev) { - ret = dev_set_param(rdev, pname, val); - if (ret) - pr_err("Cannot init param from global: %s.%s=%s: %s\n", - dev_name(rdev), pname, val, strerror(-ret)); - } - - /* Pass to the generic function we have overwritten */ - return dev_param_set_generic(p, val); -} - static void globalvar_nv_sync(const char *name) { const char *val; @@ -415,7 +396,7 @@ int globalvar_add_simple(const char *name, const char *value) { struct param_d *param; - param = dev_add_param(&global_device, name, globalvar_simple_set, NULL, + param = dev_add_param(&global_device, name, NULL, NULL, 0); if (IS_ERR(param)) { if (PTR_ERR(param) != -EEXIST) -- cgit v1.2.3