• Luis R. Rodriguez's avatar
    module: add extra argument for parse_params() callback · ecc86170
    Luis R. Rodriguez authored
    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: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarLuis R. Rodriguez <mcgrof@suse.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ecc86170
module.c 98.5 KB