diff options
| author | Luis R. Rodriguez <mcgrof@suse.com> | 2015-03-30 16:20:03 -0700 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-05-20 00:25:24 -0700 | 
| commit | ecc8617053e0a97272ef2eee138809f30080e84b (patch) | |
| tree | f9433e1dd51aea5b6f66db03460a9f2c1c3f4f4d /init | |
| parent | 6570a9a1ce3a1dd227a065fd8ad16778d827b753 (diff) | |
| download | linux-ecc8617053e0a97272ef2eee138809f30080e84b.tar.bz2 | |
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 'init')
| -rw-r--r-- | init/main.c | 25 | 
1 files changed, 15 insertions, 10 deletions
| diff --git a/init/main.c b/init/main.c index 2115055faeac..edcb13440646 100644 --- a/init/main.c +++ b/init/main.c @@ -235,7 +235,8 @@ static int __init loglevel(char *str)  early_param("loglevel", loglevel);  /* Change NUL term back to "=", to make "param" the whole string. */ -static int __init repair_env_string(char *param, char *val, const char *unused) +static int __init repair_env_string(char *param, char *val, +				    const char *unused, void *arg)  {  	if (val) {  		/* param=val or param="val"? */ @@ -252,14 +253,15 @@ static int __init repair_env_string(char *param, char *val, const char *unused)  }  /* Anything after -- gets handed straight to init. */ -static int __init set_init_arg(char *param, char *val, const char *unused) +static int __init set_init_arg(char *param, char *val, +			       const char *unused, void *arg)  {  	unsigned int i;  	if (panic_later)  		return 0; -	repair_env_string(param, val, unused); +	repair_env_string(param, val, unused, NULL);  	for (i = 0; argv_init[i]; i++) {  		if (i == MAX_INIT_ARGS) { @@ -276,9 +278,10 @@ static int __init set_init_arg(char *param, char *val, const char *unused)   * Unknown boot options get handed to init, unless they look like   * unused parameters (modprobe will find them in /proc/cmdline).   */ -static int __init unknown_bootoption(char *param, char *val, const char *unused) +static int __init unknown_bootoption(char *param, char *val, +				     const char *unused, void *arg)  { -	repair_env_string(param, val, unused); +	repair_env_string(param, val, unused, NULL);  	/* Handle obsolete-style parameters */  	if (obsolete_checksetup(param)) @@ -410,7 +413,8 @@ static noinline void __init_refok rest_init(void)  }  /* Check for early params. */ -static int __init do_early_param(char *param, char *val, const char *unused) +static int __init do_early_param(char *param, char *val, +				 const char *unused, void *arg)  {  	const struct obs_kernel_param *p; @@ -429,7 +433,8 @@ static int __init do_early_param(char *param, char *val, const char *unused)  void __init parse_early_options(char *cmdline)  { -	parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param); +	parse_args("early options", cmdline, NULL, 0, 0, 0, NULL, +		   do_early_param);  }  /* Arch code calls this early on, or if not, just before other parsing. */ @@ -535,10 +540,10 @@ asmlinkage __visible void __init start_kernel(void)  	after_dashes = parse_args("Booting kernel",  				  static_command_line, __start___param,  				  __stop___param - __start___param, -				  -1, -1, &unknown_bootoption); +				  -1, -1, NULL, &unknown_bootoption);  	if (!IS_ERR_OR_NULL(after_dashes))  		parse_args("Setting init args", after_dashes, NULL, 0, -1, -1, -			   set_init_arg); +			   NULL, set_init_arg);  	jump_label_init(); @@ -847,7 +852,7 @@ static void __init do_initcall_level(int level)  		   initcall_command_line, __start___param,  		   __stop___param - __start___param,  		   level, level, -		   &repair_env_string); +		   NULL, &repair_env_string);  	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)  		do_one_initcall(*fn); |