diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/params.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/kernel/params.c b/kernel/params.c index f37d8263134..b60e2c74b96 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
| @@ -85,11 +85,13 @@ bool parameq(const char *a, const char *b) | |||
| 85 | 85 | ||
| 86 | static int parse_one(char *param, | 86 | static int parse_one(char *param, |
| 87 | char *val, | 87 | char *val, |
| 88 | const char *doing, | ||
| 88 | const struct kernel_param *params, | 89 | const struct kernel_param *params, |
| 89 | unsigned num_params, | 90 | unsigned num_params, |
| 90 | s16 min_level, | 91 | s16 min_level, |
| 91 | s16 max_level, | 92 | s16 max_level, |
| 92 | int (*handle_unknown)(char *param, char *val)) | 93 | int (*handle_unknown)(char *param, char *val, |
| 94 | const char *doing)) | ||
| 93 | { | 95 | { |
| 94 | unsigned int i; | 96 | unsigned int i; |
| 95 | int err; | 97 | int err; |
| @@ -104,8 +106,8 @@ static int parse_one(char *param, | |||
| 104 | if (!val && params[i].ops->set != param_set_bool | 106 | if (!val && params[i].ops->set != param_set_bool |
| 105 | && params[i].ops->set != param_set_bint) | 107 | && params[i].ops->set != param_set_bint) |
| 106 | return -EINVAL; | 108 | return -EINVAL; |
| 107 | pr_debug("They are equal! Calling %p\n", | 109 | pr_debug("handling %s with %p\n", param, |
| 108 | params[i].ops->set); | 110 | params[i].ops->set); |
| 109 | mutex_lock(¶m_lock); | 111 | mutex_lock(¶m_lock); |
| 110 | err = params[i].ops->set(val, ¶ms[i]); | 112 | err = params[i].ops->set(val, ¶ms[i]); |
| 111 | mutex_unlock(¶m_lock); | 113 | mutex_unlock(¶m_lock); |
| @@ -114,11 +116,11 @@ static int parse_one(char *param, | |||
| 114 | } | 116 | } |
| 115 | 117 | ||
| 116 | if (handle_unknown) { | 118 | if (handle_unknown) { |
| 117 | pr_debug("Unknown argument: calling %p\n", handle_unknown); | 119 | pr_debug("doing %s: %s='%s'\n", doing, param, val); |
| 118 | return handle_unknown(param, val); | 120 | return handle_unknown(param, val, doing); |
| 119 | } | 121 | } |
| 120 | 122 | ||
| 121 | pr_debug("Unknown argument `%s'\n", param); | 123 | pr_debug("Unknown argument '%s'\n", param); |
| 122 | return -ENOENT; | 124 | return -ENOENT; |
| 123 | } | 125 | } |
| 124 | 126 | ||
| @@ -175,28 +177,29 @@ static char *next_arg(char *args, char **param, char **val) | |||
| 175 | } | 177 | } |
| 176 | 178 | ||
| 177 | /* Args looks like "foo=bar,bar2 baz=fuz wiz". */ | 179 | /* Args looks like "foo=bar,bar2 baz=fuz wiz". */ |
| 178 | int parse_args(const char *name, | 180 | int parse_args(const char *doing, |
| 179 | char *args, | 181 | char *args, |
| 180 | const struct kernel_param *params, | 182 | const struct kernel_param *params, |
| 181 | unsigned num, | 183 | unsigned num, |
| 182 | s16 min_level, | 184 | s16 min_level, |
| 183 | s16 max_level, | 185 | s16 max_level, |
| 184 | int (*unknown)(char *param, char *val)) | 186 | int (*unknown)(char *param, char *val, const char *doing)) |
| 185 | { | 187 | { |
| 186 | char *param, *val; | 188 | char *param, *val; |
| 187 | 189 | ||
| 188 | pr_debug("Parsing ARGS: %s\n", args); | ||
| 189 | |||
| 190 | /* Chew leading spaces */ | 190 | /* Chew leading spaces */ |
| 191 | args = skip_spaces(args); | 191 | args = skip_spaces(args); |
| 192 | 192 | ||
| 193 | if (args && *args) | ||
| 194 | pr_debug("doing %s, parsing ARGS: '%s'\n", doing, args); | ||
| 195 | |||
| 193 | while (*args) { | 196 | while (*args) { |
| 194 | int ret; | 197 | int ret; |
| 195 | int irq_was_disabled; | 198 | int irq_was_disabled; |
| 196 | 199 | ||
| 197 | args = next_arg(args, ¶m, &val); | 200 | args = next_arg(args, ¶m, &val); |
| 198 | irq_was_disabled = irqs_disabled(); | 201 | irq_was_disabled = irqs_disabled(); |
| 199 | ret = parse_one(param, val, params, num, | 202 | ret = parse_one(param, val, doing, params, num, |
| 200 | min_level, max_level, unknown); | 203 | min_level, max_level, unknown); |
| 201 | if (irq_was_disabled && !irqs_disabled()) { | 204 | if (irq_was_disabled && !irqs_disabled()) { |
| 202 | printk(KERN_WARNING "parse_args(): option '%s' enabled " | 205 | printk(KERN_WARNING "parse_args(): option '%s' enabled " |
| @@ -205,19 +208,19 @@ int parse_args(const char *name, | |||
| 205 | switch (ret) { | 208 | switch (ret) { |
| 206 | case -ENOENT: | 209 | case -ENOENT: |
| 207 | printk(KERN_ERR "%s: Unknown parameter `%s'\n", | 210 | printk(KERN_ERR "%s: Unknown parameter `%s'\n", |
| 208 | name, param); | 211 | doing, param); |
| 209 | return ret; | 212 | return ret; |
| 210 | case -ENOSPC: | 213 | case -ENOSPC: |
| 211 | printk(KERN_ERR | 214 | printk(KERN_ERR |
| 212 | "%s: `%s' too large for parameter `%s'\n", | 215 | "%s: `%s' too large for parameter `%s'\n", |
| 213 | name, val ?: "", param); | 216 | doing, val ?: "", param); |
| 214 | return ret; | 217 | return ret; |
| 215 | case 0: | 218 | case 0: |
| 216 | break; | 219 | break; |
| 217 | default: | 220 | default: |
| 218 | printk(KERN_ERR | 221 | printk(KERN_ERR |
| 219 | "%s: `%s' invalid for parameter `%s'\n", | 222 | "%s: `%s' invalid for parameter `%s'\n", |
| 220 | name, val ?: "", param); | 223 | doing, val ?: "", param); |
| 221 | return ret; | 224 | return ret; |
| 222 | } | 225 | } |
| 223 | } | 226 | } |
