diff options
Diffstat (limited to 'kernel/params.c')
-rw-r--r-- | kernel/params.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/kernel/params.c b/kernel/params.c index 4bc965d8a1fe..f37d82631347 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -15,7 +15,6 @@ | |||
15 | along with this program; if not, write to the Free Software | 15 | along with this program; if not, write to the Free Software |
16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 | */ | 17 | */ |
18 | #include <linux/module.h> | ||
19 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
20 | #include <linux/string.h> | 19 | #include <linux/string.h> |
21 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
@@ -88,6 +87,8 @@ static int parse_one(char *param, | |||
88 | char *val, | 87 | char *val, |
89 | const struct kernel_param *params, | 88 | const struct kernel_param *params, |
90 | unsigned num_params, | 89 | unsigned num_params, |
90 | s16 min_level, | ||
91 | s16 max_level, | ||
91 | int (*handle_unknown)(char *param, char *val)) | 92 | int (*handle_unknown)(char *param, char *val)) |
92 | { | 93 | { |
93 | unsigned int i; | 94 | unsigned int i; |
@@ -96,6 +97,9 @@ static int parse_one(char *param, | |||
96 | /* Find parameter */ | 97 | /* Find parameter */ |
97 | for (i = 0; i < num_params; i++) { | 98 | for (i = 0; i < num_params; i++) { |
98 | if (parameq(param, params[i].name)) { | 99 | if (parameq(param, params[i].name)) { |
100 | if (params[i].level < min_level | ||
101 | || params[i].level > max_level) | ||
102 | return 0; | ||
99 | /* No one handled NULL, so do it here. */ | 103 | /* No one handled NULL, so do it here. */ |
100 | if (!val && params[i].ops->set != param_set_bool | 104 | if (!val && params[i].ops->set != param_set_bool |
101 | && params[i].ops->set != param_set_bint) | 105 | && params[i].ops->set != param_set_bint) |
@@ -175,6 +179,8 @@ int parse_args(const char *name, | |||
175 | char *args, | 179 | char *args, |
176 | const struct kernel_param *params, | 180 | const struct kernel_param *params, |
177 | unsigned num, | 181 | unsigned num, |
182 | s16 min_level, | ||
183 | s16 max_level, | ||
178 | int (*unknown)(char *param, char *val)) | 184 | int (*unknown)(char *param, char *val)) |
179 | { | 185 | { |
180 | char *param, *val; | 186 | char *param, *val; |
@@ -190,7 +196,8 @@ int parse_args(const char *name, | |||
190 | 196 | ||
191 | args = next_arg(args, ¶m, &val); | 197 | args = next_arg(args, ¶m, &val); |
192 | irq_was_disabled = irqs_disabled(); | 198 | irq_was_disabled = irqs_disabled(); |
193 | ret = parse_one(param, val, params, num, unknown); | 199 | ret = parse_one(param, val, params, num, |
200 | min_level, max_level, unknown); | ||
194 | if (irq_was_disabled && !irqs_disabled()) { | 201 | if (irq_was_disabled && !irqs_disabled()) { |
195 | printk(KERN_WARNING "parse_args(): option '%s' enabled " | 202 | printk(KERN_WARNING "parse_args(): option '%s' enabled " |
196 | "irq's!\n", param); | 203 | "irq's!\n", param); |
@@ -298,35 +305,18 @@ EXPORT_SYMBOL(param_ops_charp); | |||
298 | /* Actually could be a bool or an int, for historical reasons. */ | 305 | /* Actually could be a bool or an int, for historical reasons. */ |
299 | int param_set_bool(const char *val, const struct kernel_param *kp) | 306 | int param_set_bool(const char *val, const struct kernel_param *kp) |
300 | { | 307 | { |
301 | bool v; | ||
302 | int ret; | ||
303 | |||
304 | /* No equals means "set"... */ | 308 | /* No equals means "set"... */ |
305 | if (!val) val = "1"; | 309 | if (!val) val = "1"; |
306 | 310 | ||
307 | /* One of =[yYnN01] */ | 311 | /* One of =[yYnN01] */ |
308 | ret = strtobool(val, &v); | 312 | return strtobool(val, kp->arg); |
309 | if (ret) | ||
310 | return ret; | ||
311 | |||
312 | if (kp->flags & KPARAM_ISBOOL) | ||
313 | *(bool *)kp->arg = v; | ||
314 | else | ||
315 | *(int *)kp->arg = v; | ||
316 | return 0; | ||
317 | } | 313 | } |
318 | EXPORT_SYMBOL(param_set_bool); | 314 | EXPORT_SYMBOL(param_set_bool); |
319 | 315 | ||
320 | int param_get_bool(char *buffer, const struct kernel_param *kp) | 316 | int param_get_bool(char *buffer, const struct kernel_param *kp) |
321 | { | 317 | { |
322 | bool val; | ||
323 | if (kp->flags & KPARAM_ISBOOL) | ||
324 | val = *(bool *)kp->arg; | ||
325 | else | ||
326 | val = *(int *)kp->arg; | ||
327 | |||
328 | /* Y and N chosen as being relatively non-coder friendly */ | 318 | /* Y and N chosen as being relatively non-coder friendly */ |
329 | return sprintf(buffer, "%c", val ? 'Y' : 'N'); | 319 | return sprintf(buffer, "%c", *(bool *)kp->arg ? 'Y' : 'N'); |
330 | } | 320 | } |
331 | EXPORT_SYMBOL(param_get_bool); | 321 | EXPORT_SYMBOL(param_get_bool); |
332 | 322 | ||
@@ -344,7 +334,6 @@ int param_set_invbool(const char *val, const struct kernel_param *kp) | |||
344 | struct kernel_param dummy; | 334 | struct kernel_param dummy; |
345 | 335 | ||
346 | dummy.arg = &boolval; | 336 | dummy.arg = &boolval; |
347 | dummy.flags = KPARAM_ISBOOL; | ||
348 | ret = param_set_bool(val, &dummy); | 337 | ret = param_set_bool(val, &dummy); |
349 | if (ret == 0) | 338 | if (ret == 0) |
350 | *(bool *)kp->arg = !boolval; | 339 | *(bool *)kp->arg = !boolval; |
@@ -373,7 +362,6 @@ int param_set_bint(const char *val, const struct kernel_param *kp) | |||
373 | /* Match bool exactly, by re-using it. */ | 362 | /* Match bool exactly, by re-using it. */ |
374 | boolkp = *kp; | 363 | boolkp = *kp; |
375 | boolkp.arg = &v; | 364 | boolkp.arg = &v; |
376 | boolkp.flags |= KPARAM_ISBOOL; | ||
377 | 365 | ||
378 | ret = param_set_bool(val, &boolkp); | 366 | ret = param_set_bool(val, &boolkp); |
379 | if (ret == 0) | 367 | if (ret == 0) |
@@ -394,7 +382,7 @@ static int param_array(const char *name, | |||
394 | unsigned int min, unsigned int max, | 382 | unsigned int min, unsigned int max, |
395 | void *elem, int elemsize, | 383 | void *elem, int elemsize, |
396 | int (*set)(const char *, const struct kernel_param *kp), | 384 | int (*set)(const char *, const struct kernel_param *kp), |
397 | u16 flags, | 385 | s16 level, |
398 | unsigned int *num) | 386 | unsigned int *num) |
399 | { | 387 | { |
400 | int ret; | 388 | int ret; |
@@ -404,7 +392,7 @@ static int param_array(const char *name, | |||
404 | /* Get the name right for errors. */ | 392 | /* Get the name right for errors. */ |
405 | kp.name = name; | 393 | kp.name = name; |
406 | kp.arg = elem; | 394 | kp.arg = elem; |
407 | kp.flags = flags; | 395 | kp.level = level; |
408 | 396 | ||
409 | *num = 0; | 397 | *num = 0; |
410 | /* We expect a comma-separated list of values. */ | 398 | /* We expect a comma-separated list of values. */ |
@@ -445,7 +433,7 @@ static int param_array_set(const char *val, const struct kernel_param *kp) | |||
445 | unsigned int temp_num; | 433 | unsigned int temp_num; |
446 | 434 | ||
447 | return param_array(kp->name, val, 1, arr->max, arr->elem, | 435 | return param_array(kp->name, val, 1, arr->max, arr->elem, |
448 | arr->elemsize, arr->ops->set, kp->flags, | 436 | arr->elemsize, arr->ops->set, kp->level, |
449 | arr->num ?: &temp_num); | 437 | arr->num ?: &temp_num); |
450 | } | 438 | } |
451 | 439 | ||