Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[cascardo/linux.git] / kernel / params.c
index 440e65d..501bde4 100644 (file)
@@ -103,8 +103,8 @@ static int parse_one(char *param,
                            || params[i].level > max_level)
                                return 0;
                        /* No one handled NULL, so do it here. */
-                       if (!val && params[i].ops->set != param_set_bool
-                           && params[i].ops->set != param_set_bint)
+                       if (!val &&
+                           !(params[i].ops->flags & KERNEL_PARAM_FL_NOARG))
                                return -EINVAL;
                        pr_debug("handling %s with %p\n", param,
                                params[i].ops->set);
@@ -241,7 +241,8 @@ int parse_args(const char *doing,
        }                                                               \
        int param_get_##name(char *buffer, const struct kernel_param *kp) \
        {                                                               \
-               return sprintf(buffer, format, *((type *)kp->arg));     \
+               return scnprintf(buffer, PAGE_SIZE, format,             \
+                               *((type *)kp->arg));                    \
        }                                                               \
        struct kernel_param_ops param_ops_##name = {                    \
                .set = param_set_##name,                                \
@@ -252,7 +253,7 @@ int parse_args(const char *doing,
        EXPORT_SYMBOL(param_ops_##name)
 
 
-STANDARD_PARAM_DEF(byte, unsigned char, "%c", unsigned long, strict_strtoul);
+STANDARD_PARAM_DEF(byte, unsigned char, "%hhu", unsigned long, strict_strtoul);
 STANDARD_PARAM_DEF(short, short, "%hi", long, strict_strtol);
 STANDARD_PARAM_DEF(ushort, unsigned short, "%hu", unsigned long, strict_strtoul);
 STANDARD_PARAM_DEF(int, int, "%i", long, strict_strtol);
@@ -285,7 +286,7 @@ EXPORT_SYMBOL(param_set_charp);
 
 int param_get_charp(char *buffer, const struct kernel_param *kp)
 {
-       return sprintf(buffer, "%s", *((char **)kp->arg));
+       return scnprintf(buffer, PAGE_SIZE, "%s", *((char **)kp->arg));
 }
 EXPORT_SYMBOL(param_get_charp);
 
@@ -320,6 +321,7 @@ int param_get_bool(char *buffer, const struct kernel_param *kp)
 EXPORT_SYMBOL(param_get_bool);
 
 struct kernel_param_ops param_ops_bool = {
+       .flags = KERNEL_PARAM_FL_NOARG,
        .set = param_set_bool,
        .get = param_get_bool,
 };
@@ -370,6 +372,7 @@ int param_set_bint(const char *val, const struct kernel_param *kp)
 EXPORT_SYMBOL(param_set_bint);
 
 struct kernel_param_ops param_ops_bint = {
+       .flags = KERNEL_PARAM_FL_NOARG,
        .set = param_set_bint,
        .get = param_get_int,
 };
@@ -827,7 +830,7 @@ ssize_t __modver_version_show(struct module_attribute *mattr,
        struct module_version_attribute *vattr =
                container_of(mattr, struct module_version_attribute, mattr);
 
-       return sprintf(buf, "%s\n", vattr->version);
+       return scnprintf(buf, PAGE_SIZE, "%s\n", vattr->version);
 }
 
 extern const struct module_version_attribute *__start___modver[];
@@ -912,7 +915,14 @@ static const struct kset_uevent_ops module_uevent_ops = {
 struct kset *module_kset;
 int module_sysfs_initialized;
 
+static void module_kobj_release(struct kobject *kobj)
+{
+       struct module_kobject *mk = to_module_kobject(kobj);
+       complete(mk->kobj_completion);
+}
+
 struct kobj_type module_ktype = {
+       .release   =    module_kobj_release,
        .sysfs_ops =    &module_sysfs_ops,
 };