summaryrefslogtreecommitdiffstats
path: root/kernel/params.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@suse.com>2015-03-30 19:20:03 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-05-20 03:25:24 -0400
commitecc8617053e0a97272ef2eee138809f30080e84b (patch)
treef9433e1dd51aea5b6f66db03460a9f2c1c3f4f4d /kernel/params.c
parent6570a9a1ce3a1dd227a065fd8ad16778d827b753 (diff)
module: add extra argument for parse_params() callback
This adds an extra argument onto parse_params() to be used as a way to make the unused callback a bit more useful and generic by allowing the caller to pass on a data structure of its choice. An example use case is to allow us to easily make module parameters for every module which we will do next. @ parse @ identifier name, args, params, num, level_min, level_max; identifier unknown, param, val, doing; type s16; @@ extern char *parse_args(const char *name, char *args, const struct kernel_param *params, unsigned num, s16 level_min, s16 level_max, + void *arg, int (*unknown)(char *param, char *val, const char *doing + , void *arg )); @ parse_mod @ identifier name, args, params, num, level_min, level_max; identifier unknown, param, val, doing; type s16; @@ char *parse_args(const char *name, char *args, const struct kernel_param *params, unsigned num, s16 level_min, s16 level_max, + void *arg, int (*unknown)(char *param, char *val, const char *doing + , void *arg )) { ... } @ parse_args_found @ expression R, E1, E2, E3, E4, E5, E6; identifier func; @@ ( R = parse_args(E1, E2, E3, E4, E5, E6, + NULL, func); | R = parse_args(E1, E2, E3, E4, E5, E6, + NULL, &func); | R = parse_args(E1, E2, E3, E4, E5, E6, + NULL, NULL); | parse_args(E1, E2, E3, E4, E5, E6, + NULL, func); | parse_args(E1, E2, E3, E4, E5, E6, + NULL, &func); | parse_args(E1, E2, E3, E4, E5, E6, + NULL, NULL); ) @ parse_args_unused depends on parse_args_found @ identifier parse_args_found.func; @@ int func(char *param, char *val, const char *unused + , void *arg ) { ... } @ mod_unused depends on parse_args_found @ identifier parse_args_found.func; expression A1, A2, A3; @@ - func(A1, A2, A3); + func(A1, A2, A3, NULL); Generated-by: Coccinelle SmPL Cc: cocci@systeme.lip6.fr Cc: Tejun Heo <tj@kernel.org> Cc: Arjan van de Ven <arjan@linux.intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Christoph Hellwig <hch@infradead.org> Cc: Felipe Contreras <felipe.contreras@gmail.com> Cc: Ewan Milne <emilne@redhat.com> Cc: Jean Delvare <jdelvare@suse.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Jani Nikula <jani.nikula@intel.com> Cc: linux-kernel@vger.kernel.org Reviewed-by: Tejun Heo <tj@kernel.org> Acked-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel/params.c')
-rw-r--r--kernel/params.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/kernel/params.c b/kernel/params.c
index a22d6a759b1a..30288c1e15dd 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -100,8 +100,9 @@ static int parse_one(char *param,
100 unsigned num_params, 100 unsigned num_params,
101 s16 min_level, 101 s16 min_level,
102 s16 max_level, 102 s16 max_level,
103 void *arg,
103 int (*handle_unknown)(char *param, char *val, 104 int (*handle_unknown)(char *param, char *val,
104 const char *doing)) 105 const char *doing, void *arg))
105{ 106{
106 unsigned int i; 107 unsigned int i;
107 int err; 108 int err;
@@ -128,7 +129,7 @@ static int parse_one(char *param,
128 129
129 if (handle_unknown) { 130 if (handle_unknown) {
130 pr_debug("doing %s: %s='%s'\n", doing, param, val); 131 pr_debug("doing %s: %s='%s'\n", doing, param, val);
131 return handle_unknown(param, val, doing); 132 return handle_unknown(param, val, doing, arg);
132 } 133 }
133 134
134 pr_debug("Unknown argument '%s'\n", param); 135 pr_debug("Unknown argument '%s'\n", param);
@@ -194,7 +195,9 @@ char *parse_args(const char *doing,
194 unsigned num, 195 unsigned num,
195 s16 min_level, 196 s16 min_level,
196 s16 max_level, 197 s16 max_level,
197 int (*unknown)(char *param, char *val, const char *doing)) 198 void *arg,
199 int (*unknown)(char *param, char *val,
200 const char *doing, void *arg))
198{ 201{
199 char *param, *val; 202 char *param, *val;
200 203
@@ -214,7 +217,7 @@ char *parse_args(const char *doing,
214 return args; 217 return args;
215 irq_was_disabled = irqs_disabled(); 218 irq_was_disabled = irqs_disabled();
216 ret = parse_one(param, val, doing, params, num, 219 ret = parse_one(param, val, doing, params, num,
217 min_level, max_level, unknown); 220 min_level, max_level, arg, unknown);
218 if (irq_was_disabled && !irqs_disabled()) 221 if (irq_was_disabled && !irqs_disabled())
219 pr_warn("%s: option '%s' enabled irq's!\n", 222 pr_warn("%s: option '%s' enabled irq's!\n",
220 doing, param); 223 doing, param);