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 | ||
