summaryrefslogtreecommitdiffstats
path: root/kernel/params.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2015-06-25 17:14:38 -0400
committerRusty Russell <rusty@rustcorp.com.au>2015-06-28 01:16:14 -0400
commitcf2fde7b39e9446e2af015215d7fb695781af0c1 (patch)
tree646bec4e1717bf8370a3d4153c59a06a4a78f73f /kernel/params.c
parent38183b9c31cf21d8996d6eee2e3a14508b20c418 (diff)
param: fix module param locks when !CONFIG_SYSFS.
As Dan Streetman points out, the entire point of locking for is to stop sysfs accesses, so they're elided entirely in the !SYSFS case. Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'kernel/params.c')
-rw-r--r--kernel/params.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/kernel/params.c b/kernel/params.c
index 8890d0b8dffc..faa461c16f12 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -25,12 +25,22 @@
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/ctype.h> 26#include <linux/ctype.h>
27 27
28#ifdef CONFIG_SYSFS
28/* Protects all built-in parameters, modules use their own param_lock */ 29/* Protects all built-in parameters, modules use their own param_lock */
29static DEFINE_MUTEX(param_lock); 30static DEFINE_MUTEX(param_lock);
30 31
31/* Use the module's mutex, or if built-in use the built-in mutex */ 32/* Use the module's mutex, or if built-in use the built-in mutex */
32#define KPARAM_MUTEX(mod) ((mod) ? &(mod)->param_lock : &param_lock) 33#define KPARAM_MUTEX(mod) ((mod) ? &(mod)->param_lock : &param_lock)
33#define KPARAM_IS_LOCKED(mod) mutex_is_locked(KPARAM_MUTEX(mod)) 34
35static inline void check_kparam_locked(struct module *mod)
36{
37 BUG_ON(!mutex_is_locked(KPARAM_MUTEX(mod)));
38}
39#else
40static inline void check_kparam_locked(struct module *mod)
41{
42}
43#endif /* !CONFIG_SYSFS */
34 44
35/* This just allows us to keep track of which parameters are kmalloced. */ 45/* This just allows us to keep track of which parameters are kmalloced. */
36struct kmalloced_param { 46struct kmalloced_param {
@@ -459,7 +469,7 @@ static int param_array(struct module *mod,
459 /* nul-terminate and parse */ 469 /* nul-terminate and parse */
460 save = val[len]; 470 save = val[len];
461 ((char *)val)[len] = '\0'; 471 ((char *)val)[len] = '\0';
462 BUG_ON(!KPARAM_IS_LOCKED(mod)); 472 check_kparam_locked(mod);
463 ret = set(val, &kp); 473 ret = set(val, &kp);
464 474
465 if (ret != 0) 475 if (ret != 0)
@@ -496,7 +506,7 @@ static int param_array_get(char *buffer, const struct kernel_param *kp)
496 if (i) 506 if (i)
497 buffer[off++] = ','; 507 buffer[off++] = ',';
498 p.arg = arr->elem + arr->elemsize * i; 508 p.arg = arr->elem + arr->elemsize * i;
499 BUG_ON(!KPARAM_IS_LOCKED(p.mod)); 509 check_kparam_locked(p.mod);
500 ret = arr->ops->get(buffer + off, &p); 510 ret = arr->ops->get(buffer + off, &p);
501 if (ret < 0) 511 if (ret < 0)
502 return ret; 512 return ret;
@@ -616,6 +626,7 @@ static ssize_t param_attr_store(struct module_attribute *mattr,
616#define __modinit __init 626#define __modinit __init
617#endif 627#endif
618 628
629#ifdef CONFIG_SYSFS
619void kernel_param_lock(struct module *mod) 630void kernel_param_lock(struct module *mod)
620{ 631{
621 mutex_lock(KPARAM_MUTEX(mod)); 632 mutex_lock(KPARAM_MUTEX(mod));
@@ -626,7 +637,6 @@ void kernel_param_unlock(struct module *mod)
626 mutex_unlock(KPARAM_MUTEX(mod)); 637 mutex_unlock(KPARAM_MUTEX(mod));
627} 638}
628 639
629#ifdef CONFIG_SYSFS
630EXPORT_SYMBOL(kernel_param_lock); 640EXPORT_SYMBOL(kernel_param_lock);
631EXPORT_SYMBOL(kernel_param_unlock); 641EXPORT_SYMBOL(kernel_param_unlock);
632 642