diff options
Diffstat (limited to 'kernel/params.c')
| -rw-r--r-- | kernel/params.c | 62 |
1 files changed, 28 insertions, 34 deletions
diff --git a/kernel/params.c b/kernel/params.c index f37d82631347..ed35345be536 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,49 +177,47 @@ 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) | ||
| 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 | pr_warn("%s: option '%s' enabled irq's!\n", |
| 203 | "irq's!\n", param); | 206 | doing, param); |
| 204 | } | 207 | |
| 205 | switch (ret) { | 208 | switch (ret) { |
| 206 | case -ENOENT: | 209 | case -ENOENT: |
| 207 | printk(KERN_ERR "%s: Unknown parameter `%s'\n", | 210 | pr_err("%s: Unknown parameter `%s'\n", doing, param); |
| 208 | name, param); | ||
| 209 | return ret; | 211 | return ret; |
| 210 | case -ENOSPC: | 212 | case -ENOSPC: |
| 211 | printk(KERN_ERR | 213 | pr_err("%s: `%s' too large for parameter `%s'\n", |
| 212 | "%s: `%s' too large for parameter `%s'\n", | 214 | doing, val ?: "", param); |
| 213 | name, val ?: "", param); | ||
| 214 | return ret; | 215 | return ret; |
| 215 | case 0: | 216 | case 0: |
| 216 | break; | 217 | break; |
| 217 | default: | 218 | default: |
| 218 | printk(KERN_ERR | 219 | pr_err("%s: `%s' invalid for parameter `%s'\n", |
| 219 | "%s: `%s' invalid for parameter `%s'\n", | 220 | doing, val ?: "", param); |
| 220 | name, val ?: "", param); | ||
| 221 | return ret; | 221 | return ret; |
| 222 | } | 222 | } |
| 223 | } | 223 | } |
| @@ -263,8 +263,7 @@ STANDARD_PARAM_DEF(ulong, unsigned long, "%lu", unsigned long, strict_strtoul); | |||
| 263 | int param_set_charp(const char *val, const struct kernel_param *kp) | 263 | int param_set_charp(const char *val, const struct kernel_param *kp) |
| 264 | { | 264 | { |
| 265 | if (strlen(val) > 1024) { | 265 | if (strlen(val) > 1024) { |
| 266 | printk(KERN_ERR "%s: string parameter too long\n", | 266 | pr_err("%s: string parameter too long\n", kp->name); |
| 267 | kp->name); | ||
| 268 | return -ENOSPC; | 267 | return -ENOSPC; |
| 269 | } | 268 | } |
| 270 | 269 | ||
| @@ -400,8 +399,7 @@ static int param_array(const char *name, | |||
| 400 | int len; | 399 | int len; |
| 401 | 400 | ||
| 402 | if (*num == max) { | 401 | if (*num == max) { |
| 403 | printk(KERN_ERR "%s: can only take %i arguments\n", | 402 | pr_err("%s: can only take %i arguments\n", name, max); |
| 404 | name, max); | ||
| 405 | return -EINVAL; | 403 | return -EINVAL; |
| 406 | } | 404 | } |
| 407 | len = strcspn(val, ","); | 405 | len = strcspn(val, ","); |
| @@ -420,8 +418,7 @@ static int param_array(const char *name, | |||
| 420 | } while (save == ','); | 418 | } while (save == ','); |
| 421 | 419 | ||
| 422 | if (*num < min) { | 420 | if (*num < min) { |
| 423 | printk(KERN_ERR "%s: needs at least %i arguments\n", | 421 | pr_err("%s: needs at least %i arguments\n", name, min); |
| 424 | name, min); | ||
| 425 | return -EINVAL; | 422 | return -EINVAL; |
| 426 | } | 423 | } |
| 427 | return 0; | 424 | return 0; |
| @@ -480,7 +477,7 @@ int param_set_copystring(const char *val, const struct kernel_param *kp) | |||
| 480 | const struct kparam_string *kps = kp->str; | 477 | const struct kparam_string *kps = kp->str; |
| 481 | 478 | ||
| 482 | if (strlen(val)+1 > kps->maxlen) { | 479 | if (strlen(val)+1 > kps->maxlen) { |
| 483 | printk(KERN_ERR "%s: string doesn't fit in %u chars.\n", | 480 | pr_err("%s: string doesn't fit in %u chars.\n", |
| 484 | kp->name, kps->maxlen-1); | 481 | kp->name, kps->maxlen-1); |
| 485 | return -ENOSPC; | 482 | return -ENOSPC; |
| 486 | } | 483 | } |
| @@ -750,11 +747,8 @@ static struct module_kobject * __init locate_module_kobject(const char *name) | |||
| 750 | #endif | 747 | #endif |
| 751 | if (err) { | 748 | if (err) { |
| 752 | kobject_put(&mk->kobj); | 749 | kobject_put(&mk->kobj); |
| 753 | printk(KERN_ERR | 750 | pr_crit("Adding module '%s' to sysfs failed (%d), the system may be unstable.\n", |
| 754 | "Module '%s' failed add to sysfs, error number %d\n", | ||
| 755 | name, err); | 751 | name, err); |
| 756 | printk(KERN_ERR | ||
| 757 | "The system will be unstable now.\n"); | ||
| 758 | return NULL; | 752 | return NULL; |
| 759 | } | 753 | } |
| 760 | 754 | ||
