diff options
-rw-r--r-- | include/linux/moduleparam.h | 6 | ||||
-rw-r--r-- | kernel/module.c | 31 | ||||
-rw-r--r-- | kernel/params.c | 30 |
3 files changed, 36 insertions, 31 deletions
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 5d0f4d97997f..7e0079936396 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h | |||
@@ -427,6 +427,12 @@ extern int param_set_bool(const char *val, const struct kernel_param *kp); | |||
427 | extern int param_get_bool(char *buffer, const struct kernel_param *kp); | 427 | extern int param_get_bool(char *buffer, const struct kernel_param *kp); |
428 | #define param_check_bool(name, p) __param_check(name, p, bool) | 428 | #define param_check_bool(name, p) __param_check(name, p, bool) |
429 | 429 | ||
430 | extern const struct kernel_param_ops param_ops_bool_enable_only; | ||
431 | extern int param_set_bool_enable_only(const char *val, | ||
432 | const struct kernel_param *kp); | ||
433 | /* getter is the same as for the regular bool */ | ||
434 | #define param_check_bool_enable_only param_check_bool | ||
435 | |||
430 | extern const struct kernel_param_ops param_ops_invbool; | 436 | extern const struct kernel_param_ops param_ops_invbool; |
431 | extern int param_set_invbool(const char *val, const struct kernel_param *kp); | 437 | extern int param_set_invbool(const char *val, const struct kernel_param *kp); |
432 | extern int param_get_invbool(char *buffer, const struct kernel_param *kp); | 438 | extern int param_get_invbool(char *buffer, const struct kernel_param *kp); |
diff --git a/kernel/module.c b/kernel/module.c index 9e8c9305bba9..9b0e36145474 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -298,37 +298,6 @@ static bool sig_enforce = true; | |||
298 | #else | 298 | #else |
299 | static bool sig_enforce = false; | 299 | static bool sig_enforce = false; |
300 | 300 | ||
301 | static int param_set_bool_enable_only(const char *val, | ||
302 | const struct kernel_param *kp) | ||
303 | { | ||
304 | int err = 0; | ||
305 | bool new_value; | ||
306 | bool orig_value = *(bool *)kp->arg; | ||
307 | struct kernel_param dummy_kp = *kp; | ||
308 | |||
309 | dummy_kp.arg = &new_value; | ||
310 | |||
311 | err = param_set_bool(val, &dummy_kp); | ||
312 | if (err) | ||
313 | return err; | ||
314 | |||
315 | /* Don't let them unset it once it's set! */ | ||
316 | if (!new_value && orig_value) | ||
317 | return -EROFS; | ||
318 | |||
319 | if (new_value) | ||
320 | err = param_set_bool(val, kp); | ||
321 | |||
322 | return err; | ||
323 | } | ||
324 | |||
325 | static const struct kernel_param_ops param_ops_bool_enable_only = { | ||
326 | .flags = KERNEL_PARAM_OPS_FL_NOARG, | ||
327 | .set = param_set_bool_enable_only, | ||
328 | .get = param_get_bool, | ||
329 | }; | ||
330 | #define param_check_bool_enable_only param_check_bool | ||
331 | |||
332 | module_param(sig_enforce, bool_enable_only, 0644); | 301 | module_param(sig_enforce, bool_enable_only, 0644); |
333 | #endif /* !CONFIG_MODULE_SIG_FORCE */ | 302 | #endif /* !CONFIG_MODULE_SIG_FORCE */ |
334 | #endif /* CONFIG_MODULE_SIG */ | 303 | #endif /* CONFIG_MODULE_SIG */ |
diff --git a/kernel/params.c b/kernel/params.c index b7635c025e9b..324624ed620f 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -335,6 +335,36 @@ const struct kernel_param_ops param_ops_bool = { | |||
335 | }; | 335 | }; |
336 | EXPORT_SYMBOL(param_ops_bool); | 336 | EXPORT_SYMBOL(param_ops_bool); |
337 | 337 | ||
338 | int param_set_bool_enable_only(const char *val, const struct kernel_param *kp) | ||
339 | { | ||
340 | int err = 0; | ||
341 | bool new_value; | ||
342 | bool orig_value = *(bool *)kp->arg; | ||
343 | struct kernel_param dummy_kp = *kp; | ||
344 | |||
345 | dummy_kp.arg = &new_value; | ||
346 | |||
347 | err = param_set_bool(val, &dummy_kp); | ||
348 | if (err) | ||
349 | return err; | ||
350 | |||
351 | /* Don't let them unset it once it's set! */ | ||
352 | if (!new_value && orig_value) | ||
353 | return -EROFS; | ||
354 | |||
355 | if (new_value) | ||
356 | err = param_set_bool(val, kp); | ||
357 | |||
358 | return err; | ||
359 | } | ||
360 | EXPORT_SYMBOL_GPL(param_set_bool_enable_only); | ||
361 | |||
362 | const struct kernel_param_ops param_ops_bool_enable_only = { | ||
363 | .flags = KERNEL_PARAM_OPS_FL_NOARG, | ||
364 | .set = param_set_bool_enable_only, | ||
365 | .get = param_get_bool, | ||
366 | }; | ||
367 | |||
338 | /* This one must be bool. */ | 368 | /* This one must be bool. */ |
339 | int param_set_invbool(const char *val, const struct kernel_param *kp) | 369 | int param_set_invbool(const char *val, const struct kernel_param *kp) |
340 | { | 370 | { |