diff options
Diffstat (limited to 'kernel/params.c')
-rw-r--r-- | kernel/params.c | 30 |
1 files changed, 30 insertions, 0 deletions
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 | { |