diff options
Diffstat (limited to 'kernel/params.c')
-rw-r--r-- | kernel/params.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/kernel/params.c b/kernel/params.c index 440e65d1a544..c00d5b502aa4 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -103,8 +103,8 @@ static int parse_one(char *param, | |||
103 | || params[i].level > max_level) | 103 | || params[i].level > max_level) |
104 | return 0; | 104 | return 0; |
105 | /* No one handled NULL, so do it here. */ | 105 | /* No one handled NULL, so do it here. */ |
106 | if (!val && params[i].ops->set != param_set_bool | 106 | if (!val && |
107 | && params[i].ops->set != param_set_bint) | 107 | !(params[i].ops->flags & KERNEL_PARAM_FL_NOARG)) |
108 | return -EINVAL; | 108 | return -EINVAL; |
109 | pr_debug("handling %s with %p\n", param, | 109 | pr_debug("handling %s with %p\n", param, |
110 | params[i].ops->set); | 110 | params[i].ops->set); |
@@ -241,7 +241,8 @@ int parse_args(const char *doing, | |||
241 | } \ | 241 | } \ |
242 | int param_get_##name(char *buffer, const struct kernel_param *kp) \ | 242 | int param_get_##name(char *buffer, const struct kernel_param *kp) \ |
243 | { \ | 243 | { \ |
244 | return sprintf(buffer, format, *((type *)kp->arg)); \ | 244 | return scnprintf(buffer, PAGE_SIZE, format, \ |
245 | *((type *)kp->arg)); \ | ||
245 | } \ | 246 | } \ |
246 | struct kernel_param_ops param_ops_##name = { \ | 247 | struct kernel_param_ops param_ops_##name = { \ |
247 | .set = param_set_##name, \ | 248 | .set = param_set_##name, \ |
@@ -252,13 +253,13 @@ int parse_args(const char *doing, | |||
252 | EXPORT_SYMBOL(param_ops_##name) | 253 | EXPORT_SYMBOL(param_ops_##name) |
253 | 254 | ||
254 | 255 | ||
255 | STANDARD_PARAM_DEF(byte, unsigned char, "%c", unsigned long, strict_strtoul); | 256 | STANDARD_PARAM_DEF(byte, unsigned char, "%hhu", unsigned long, kstrtoul); |
256 | STANDARD_PARAM_DEF(short, short, "%hi", long, strict_strtol); | 257 | STANDARD_PARAM_DEF(short, short, "%hi", long, kstrtol); |
257 | STANDARD_PARAM_DEF(ushort, unsigned short, "%hu", unsigned long, strict_strtoul); | 258 | STANDARD_PARAM_DEF(ushort, unsigned short, "%hu", unsigned long, kstrtoul); |
258 | STANDARD_PARAM_DEF(int, int, "%i", long, strict_strtol); | 259 | STANDARD_PARAM_DEF(int, int, "%i", long, kstrtol); |
259 | STANDARD_PARAM_DEF(uint, unsigned int, "%u", unsigned long, strict_strtoul); | 260 | STANDARD_PARAM_DEF(uint, unsigned int, "%u", unsigned long, kstrtoul); |
260 | STANDARD_PARAM_DEF(long, long, "%li", long, strict_strtol); | 261 | STANDARD_PARAM_DEF(long, long, "%li", long, kstrtol); |
261 | STANDARD_PARAM_DEF(ulong, unsigned long, "%lu", unsigned long, strict_strtoul); | 262 | STANDARD_PARAM_DEF(ulong, unsigned long, "%lu", unsigned long, kstrtoul); |
262 | 263 | ||
263 | int param_set_charp(const char *val, const struct kernel_param *kp) | 264 | int param_set_charp(const char *val, const struct kernel_param *kp) |
264 | { | 265 | { |
@@ -285,7 +286,7 @@ EXPORT_SYMBOL(param_set_charp); | |||
285 | 286 | ||
286 | int param_get_charp(char *buffer, const struct kernel_param *kp) | 287 | int param_get_charp(char *buffer, const struct kernel_param *kp) |
287 | { | 288 | { |
288 | return sprintf(buffer, "%s", *((char **)kp->arg)); | 289 | return scnprintf(buffer, PAGE_SIZE, "%s", *((char **)kp->arg)); |
289 | } | 290 | } |
290 | EXPORT_SYMBOL(param_get_charp); | 291 | EXPORT_SYMBOL(param_get_charp); |
291 | 292 | ||
@@ -320,6 +321,7 @@ int param_get_bool(char *buffer, const struct kernel_param *kp) | |||
320 | EXPORT_SYMBOL(param_get_bool); | 321 | EXPORT_SYMBOL(param_get_bool); |
321 | 322 | ||
322 | struct kernel_param_ops param_ops_bool = { | 323 | struct kernel_param_ops param_ops_bool = { |
324 | .flags = KERNEL_PARAM_FL_NOARG, | ||
323 | .set = param_set_bool, | 325 | .set = param_set_bool, |
324 | .get = param_get_bool, | 326 | .get = param_get_bool, |
325 | }; | 327 | }; |
@@ -370,6 +372,7 @@ int param_set_bint(const char *val, const struct kernel_param *kp) | |||
370 | EXPORT_SYMBOL(param_set_bint); | 372 | EXPORT_SYMBOL(param_set_bint); |
371 | 373 | ||
372 | struct kernel_param_ops param_ops_bint = { | 374 | struct kernel_param_ops param_ops_bint = { |
375 | .flags = KERNEL_PARAM_FL_NOARG, | ||
373 | .set = param_set_bint, | 376 | .set = param_set_bint, |
374 | .get = param_get_int, | 377 | .get = param_get_int, |
375 | }; | 378 | }; |
@@ -827,7 +830,7 @@ ssize_t __modver_version_show(struct module_attribute *mattr, | |||
827 | struct module_version_attribute *vattr = | 830 | struct module_version_attribute *vattr = |
828 | container_of(mattr, struct module_version_attribute, mattr); | 831 | container_of(mattr, struct module_version_attribute, mattr); |
829 | 832 | ||
830 | return sprintf(buf, "%s\n", vattr->version); | 833 | return scnprintf(buf, PAGE_SIZE, "%s\n", vattr->version); |
831 | } | 834 | } |
832 | 835 | ||
833 | extern const struct module_version_attribute *__start___modver[]; | 836 | extern const struct module_version_attribute *__start___modver[]; |
@@ -912,7 +915,14 @@ static const struct kset_uevent_ops module_uevent_ops = { | |||
912 | struct kset *module_kset; | 915 | struct kset *module_kset; |
913 | int module_sysfs_initialized; | 916 | int module_sysfs_initialized; |
914 | 917 | ||
918 | static void module_kobj_release(struct kobject *kobj) | ||
919 | { | ||
920 | struct module_kobject *mk = to_module_kobject(kobj); | ||
921 | complete(mk->kobj_completion); | ||
922 | } | ||
923 | |||
915 | struct kobj_type module_ktype = { | 924 | struct kobj_type module_ktype = { |
925 | .release = module_kobj_release, | ||
916 | .sysfs_ops = &module_sysfs_ops, | 926 | .sysfs_ops = &module_sysfs_ops, |
917 | }; | 927 | }; |
918 | 928 | ||