diff options
-rw-r--r-- | common/globalvar.c | 71 | ||||
-rw-r--r-- | include/param.h | 1 |
2 files changed, 68 insertions, 4 deletions
diff --git a/common/globalvar.c b/common/globalvar.c index 0cd265b08d..4bda029c84 100644 --- a/common/globalvar.c +++ b/common/globalvar.c @@ -425,11 +425,14 @@ void globalvar_set_match(const char *match, const char *val) */ int globalvar_add_simple(const char *name, const char *value) { - int ret; + struct param_d *param; - ret = globalvar_add(name, NULL, NULL, 0); - if (ret && ret != -EEXIST) - return ret; + param = dev_add_param(&global_device, name, NULL, NULL, + PARAM_GLOBALVAR_UNQUALIFIED); + if (IS_ERR(param)) { + if (PTR_ERR(param) != -EEXIST) + return PTR_ERR(param); + } if (!value) return 0; @@ -437,9 +440,39 @@ int globalvar_add_simple(const char *name, const char *value) return dev_set_param(&global_device, name, value); } +static int globalvar_remove_unqualified(const char *name) +{ + struct param_d *p; + + p = get_param_by_name(&global_device, name); + if (!p) + return 0; + + if (!(p->flags & PARAM_GLOBALVAR_UNQUALIFIED)) + return -EEXIST; + + dev_remove_param(p); + + return 0; +} + +static void globalvar_nv_sync(const char *name) +{ + const char *val; + + val = dev_get_param(&nv_device, name); + if (val) + dev_set_param(&global_device, name, val); +} + int globalvar_add_simple_string(const char *name, char **value) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_string(&global_device, name, NULL, NULL, value, NULL); @@ -447,6 +480,8 @@ int globalvar_add_simple_string(const char *name, char **value) if (IS_ERR(p)) return PTR_ERR(p); + globalvar_nv_sync(name); + return 0; } @@ -454,6 +489,11 @@ int globalvar_add_simple_int(const char *name, int *value, const char *format) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_int(&global_device, name, NULL, NULL, value, format, NULL); @@ -461,12 +501,19 @@ int globalvar_add_simple_int(const char *name, int *value, if (IS_ERR(p)) return PTR_ERR(p); + globalvar_nv_sync(name); + return 0; } int globalvar_add_simple_bool(const char *name, int *value) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_bool(&global_device, name, NULL, NULL, value, NULL); @@ -474,6 +521,8 @@ int globalvar_add_simple_bool(const char *name, int *value) if (IS_ERR(p)) return PTR_ERR(p); + globalvar_nv_sync(name); + return 0; } @@ -481,6 +530,11 @@ int globalvar_add_simple_enum(const char *name, int *value, const char * const *names, int max) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_enum(&global_device, name, NULL, NULL, value, names, max, NULL); @@ -488,12 +542,19 @@ int globalvar_add_simple_enum(const char *name, int *value, if (IS_ERR(p)) return PTR_ERR(p); + globalvar_nv_sync(name); + return 0; } int globalvar_add_simple_ip(const char *name, IPaddr_t *ip) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_ip(&global_device, name, NULL, NULL, ip, NULL); @@ -501,6 +562,8 @@ int globalvar_add_simple_ip(const char *name, IPaddr_t *ip) if (IS_ERR(p)) return PTR_ERR(p); + globalvar_nv_sync(name); + return 0; } diff --git a/include/param.h b/include/param.h index 3fb4740b3a..68e08a254e 100644 --- a/include/param.h +++ b/include/param.h @@ -6,6 +6,7 @@ #include <linux/list.h> #define PARAM_FLAG_RO (1 << 0) +#define PARAM_GLOBALVAR_UNQUALIFIED (1 << 1) struct device_d; typedef uint32_t IPaddr_t; |