diff options
author | Luis R. Rodriguez <mcgrof@suse.com> | 2015-03-30 19:20:03 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-05-20 03:25:24 -0400 |
commit | ecc8617053e0a97272ef2eee138809f30080e84b (patch) | |
tree | f9433e1dd51aea5b6f66db03460a9f2c1c3f4f4d /kernel/params.c | |
parent | 6570a9a1ce3a1dd227a065fd8ad16778d827b753 (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.c | 11 |
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); |