Blame view

include/linux/moduleparam.h 15.3 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
  #ifndef _LINUX_MODULE_PARAMS_H
  #define _LINUX_MODULE_PARAMS_H
  /* (C) Copyright 2001, 2002 Rusty Russell IBM Corporation */
  #include <linux/init.h>
  #include <linux/stringify.h>
  #include <linux/kernel.h>
  
  /* You can override this manually, but generally this should match the
     module name. */
  #ifdef MODULE
  #define MODULE_PARAM_PREFIX /* empty */
  #else
367cb7042   Sam Ravnborg   kbuild: un-string...
13
  #define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  #endif
730b69d22   Rusty Russell   module: check ker...
15
16
  /* Chosen so that structs with an unsigned long line up. */
  #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
  #define ___module_cat(a,b) __mod_ ## a ## b
  #define __module_cat(a,b) ___module_cat(a,b)
b75be4204   Linus Walleij   param: add null s...
19
  #ifdef MODULE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
  #define __MODULE_INFO(tag, name, info)					  \
  static const char __module_cat(name,__LINE__)[]				  \
b64727768   Jan Beulich   modules: no need ...
22
23
    __used __attribute__((section(".modinfo"), unused, aligned(1)))	  \
    = __stringify(tag) "=" info
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  #else  /* !MODULE */
b75be4204   Linus Walleij   param: add null s...
25
26
27
  /* This struct is here for syntactic coherency, it is not used */
  #define __MODULE_INFO(tag, name, info)					  \
    struct __module_cat(name,__LINE__) {}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
  #endif
  #define __MODULE_PARM_TYPE(name, _type)					  \
    __MODULE_INFO(parmtype, name##type, #name ":" _type)
639938eb6   Paul Gortmaker   module.h: relocat...
31
32
33
34
  /* One for each parameter, describing how to use it.  Some files do
     multiple of these per line, so can't just use MODULE_INFO. */
  #define MODULE_PARM_DESC(_parm, desc) \
  	__MODULE_INFO(parm, _parm, #_parm ":" desc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  struct kernel_param;
9bbb9e5a3   Rusty Russell   param: use ops in...
36
37
38
39
40
  struct kernel_param_ops {
  	/* Returns 0, or -errno.  arg is in kp->arg. */
  	int (*set)(const char *val, const struct kernel_param *kp);
  	/* Returns length written or -errno.  Buffer is 4k (ie. be short!) */
  	int (*get)(char *buffer, const struct kernel_param *kp);
e6df34a44   Rusty Russell   param: add a free...
41
42
  	/* Optional function to free kp->arg when module unloaded. */
  	void (*free)(void *arg);
9bbb9e5a3   Rusty Russell   param: use ops in...
43
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44

45fcc70c0   Rusty Russell   module_param: spl...
45
  /* Flag bits for kernel_param.flags */
fddd52012   Rusty Russell   module_param: all...
46
  #define KPARAM_ISBOOL		2
45fcc70c0   Rusty Russell   module_param: spl...
47

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
  struct kernel_param {
  	const char *name;
9bbb9e5a3   Rusty Russell   param: use ops in...
50
  	const struct kernel_param_ops *ops;
45fcc70c0   Rusty Russell   module_param: spl...
51
52
  	u16 perm;
  	u16 flags;
22e48eaf5   Jan Beulich   constify string/a...
53
54
55
56
57
  	union {
  		void *arg;
  		const struct kparam_string *str;
  		const struct kparam_array *arr;
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
61
62
63
64
65
66
67
68
69
  };
  
  /* Special one for strings we want to copy into */
  struct kparam_string {
  	unsigned int maxlen;
  	char *string;
  };
  
  /* Special one for arrays */
  struct kparam_array
  {
  	unsigned int max;
c5be0b2eb   Richard Kennedy   module: reorder k...
70
  	unsigned int elemsize;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  	unsigned int *num;
9bbb9e5a3   Rusty Russell   param: use ops in...
72
  	const struct kernel_param_ops *ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
74
  	void *elem;
  };
546970bc6   Rusty Russell   param: add kernel...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  /**
   * module_param - typesafe helper for a module/cmdline parameter
   * @value: the variable to alter, and exposed parameter name.
   * @type: the type of the parameter
   * @perm: visibility in sysfs.
   *
   * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a
   * ".") the kernel commandline parameter.  Note that - is changed to _, so
   * the user can use "foo-bar=1" even for variable "foo_bar".
   *
   * @perm is 0 if the the variable is not to appear in sysfs, or 0444
   * for world-readable, 0644 for root-writable, etc.  Note that if it
   * is writable, you may need to use kparam_block_sysfs_write() around
   * accesses (esp. charp, which can be kfreed when it changes).
   *
   * The @type is simply pasted to refer to a param_ops_##type and a
   * param_check_##type: for convenience many standard types are provided but
   * you can create your own by defining those variables.
   *
   * Standard types are:
   *	byte, short, ushort, int, uint, long, ulong
   *	charp: a character pointer
   *	bool: a bool, values 0/1, y/n, Y/N.
   *	invbool: the above, only sense-reversed (N = true).
   */
  #define module_param(name, type, perm)				\
  	module_param_named(name, name, type, perm)
  
  /**
   * module_param_named - typesafe helper for a renamed module/cmdline parameter
   * @name: a valid C identifier which is the parameter name.
   * @value: the actual lvalue to alter.
   * @type: the type of the parameter
   * @perm: visibility in sysfs.
   *
   * Usually it's a good idea to have variable names and user-exposed names the
   * same, but that's harder if the variable must be non-static or is inside a
   * structure.  This allows exposure under a different name.
   */
  #define module_param_named(name, value, type, perm)			   \
  	param_check_##type(name, &(value));				   \
  	module_param_cb(name, &param_ops_##type, &value, perm);		   \
  	__MODULE_PARM_TYPE(name, #type)
  
  /**
   * module_param_cb - general callback for a module/cmdline parameter
   * @name: a valid C identifier which is the parameter name.
   * @ops: the set & get operations for this parameter.
   * @perm: visibility in sysfs.
   *
   * The ops can have NULL set or get functions.
   */
  #define module_param_cb(name, ops, arg, perm)				      \
  	__module_param_call(MODULE_PARAM_PREFIX,			      \
a6de51b27   Rusty Russell   param: don't dere...
129
  			    name, ops, arg, __same_type((arg), bool *), perm)
546970bc6   Rusty Russell   param: add kernel...
130

91d35dd93   Ivan Kokshaysky   moduleparam: fix ...
131
132
133
134
135
136
137
138
139
  /* On alpha, ia64 and ppc64 relocations to global data cannot go into
     read-only sections (which is part of respective UNIX ABI on these
     platforms). So 'const' makes no sense and even causes compile failures
     with some compilers. */
  #if defined(CONFIG_ALPHA) || defined(CONFIG_IA64) || defined(CONFIG_PPC64)
  #define __moduleparam_const
  #else
  #define __moduleparam_const const
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
  /* This is the fundamental function for registering boot/module
546970bc6   Rusty Russell   param: add kernel...
141
     parameters. */
9bbb9e5a3   Rusty Russell   param: use ops in...
142
  #define __module_param_call(prefix, name, ops, arg, isbool, perm)	\
9774a1f54   Alexey Dobriyan   [PATCH] Compile-t...
143
144
  	/* Default value instead of permissions? */			\
  	static int __param_perm_check_##name __attribute__((unused)) =	\
730b69d22   Rusty Russell   module: check ker...
145
146
  	BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2))	\
  	+ BUILD_BUG_ON_ZERO(sizeof(""prefix) > MAX_PARAM_PREFIX_LEN);	\
22e48eaf5   Jan Beulich   constify string/a...
147
  	static const char __param_str_##name[] = prefix #name;		\
91d35dd93   Ivan Kokshaysky   moduleparam: fix ...
148
  	static struct kernel_param __moduleparam_const __param_##name	\
3ff6eecca   Adrian Bunk   remove __attribut...
149
  	__used								\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
      __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
9bbb9e5a3   Rusty Russell   param: use ops in...
151
152
153
154
155
156
157
158
159
  	= { __param_str_##name, ops, perm, isbool ? KPARAM_ISBOOL : 0,	\
  	    { arg } }
  
  /* Obsolete - use module_param_cb() */
  #define module_param_call(name, set, get, arg, perm)			\
  	static struct kernel_param_ops __param_ops_##name =		\
  		 { (void *)set, (void *)get };				\
  	__module_param_call(MODULE_PARAM_PREFIX,			\
  			    name, &__param_ops_##name, arg,		\
a6de51b27   Rusty Russell   param: don't dere...
160
  			    __same_type(arg, bool *),			\
9bbb9e5a3   Rusty Russell   param: use ops in...
161
162
163
164
165
166
167
168
  			    (perm) + sizeof(__check_old_set_param(set))*0)
  
  /* We don't get oldget: it's often a new-style param_get_uint, etc. */
  static inline int
  __check_old_set_param(int (*oldset)(const char *, struct kernel_param *))
  {
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169

907b29eb4   Rusty Russell   param: locking fo...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  /**
   * kparam_block_sysfs_write - make sure a parameter isn't written via sysfs.
   * @name: the name of the parameter
   *
   * There's no point blocking write on a paramter that isn't writable via sysfs!
   */
  #define kparam_block_sysfs_write(name)			\
  	do {						\
  		BUG_ON(!(__param_##name.perm & 0222));	\
  		__kernel_param_lock();			\
  	} while (0)
  
  /**
   * kparam_unblock_sysfs_write - allows sysfs to write to a parameter again.
   * @name: the name of the parameter
   */
  #define kparam_unblock_sysfs_write(name)		\
  	do {						\
  		BUG_ON(!(__param_##name.perm & 0222));	\
  		__kernel_param_unlock();		\
  	} while (0)
  
  /**
   * kparam_block_sysfs_read - make sure a parameter isn't read via sysfs.
   * @name: the name of the parameter
   *
   * This also blocks sysfs writes.
   */
  #define kparam_block_sysfs_read(name)			\
  	do {						\
  		BUG_ON(!(__param_##name.perm & 0444));	\
  		__kernel_param_lock();			\
  	} while (0)
  
  /**
   * kparam_unblock_sysfs_read - allows sysfs to read a parameter again.
   * @name: the name of the parameter
   */
  #define kparam_unblock_sysfs_read(name)			\
  	do {						\
  		BUG_ON(!(__param_##name.perm & 0444));	\
  		__kernel_param_unlock();		\
  	} while (0)
  
  #ifdef CONFIG_SYSFS
  extern void __kernel_param_lock(void);
  extern void __kernel_param_unlock(void);
  #else
  static inline void __kernel_param_lock(void)
  {
  }
  static inline void __kernel_param_unlock(void)
  {
  }
  #endif
67e67ceaa   Rusty Russell   core_param() for ...
225
226
227
228
229
  #ifndef MODULE
  /**
   * core_param - define a historical core kernel parameter.
   * @name: the name of the cmdline and sysfs parameter (often the same as var)
   * @var: the variable
546970bc6   Rusty Russell   param: add kernel...
230
   * @type: the type of the parameter
67e67ceaa   Rusty Russell   core_param() for ...
231
232
233
234
235
236
237
238
239
   * @perm: visibility in sysfs
   *
   * core_param is just like module_param(), but cannot be modular and
   * doesn't add a prefix (such as "printk.").  This is for compatibility
   * with __setup(), and it makes sense as truly core parameters aren't
   * tied to the particular file they're in.
   */
  #define core_param(name, var, type, perm)				\
  	param_check_##type(name, &(var));				\
9bbb9e5a3   Rusty Russell   param: use ops in...
240
  	__module_param_call("", name, &param_ops_##type,		\
fddd52012   Rusty Russell   module_param: all...
241
  			    &var, __same_type(var, bool), perm)
67e67ceaa   Rusty Russell   core_param() for ...
242
  #endif /* !MODULE */
546970bc6   Rusty Russell   param: add kernel...
243
244
245
246
247
248
249
250
251
252
  /**
   * module_param_string - a char array parameter
   * @name: the name of the parameter
   * @string: the string variable
   * @len: the maximum length of the string, incl. terminator
   * @perm: visibility in sysfs.
   *
   * This actually copies the string when it's set (unlike type charp).
   * @len is usually just sizeof(string).
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
  #define module_param_string(name, string, len, perm)			\
22e48eaf5   Jan Beulich   constify string/a...
254
  	static const struct kparam_string __param_string_##name		\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
  		= { len, string };					\
fddd52012   Rusty Russell   module_param: all...
256
  	__module_param_call(MODULE_PARAM_PREFIX, name,			\
9bbb9e5a3   Rusty Russell   param: use ops in...
257
  			    &param_ops_string,				\
fddd52012   Rusty Russell   module_param: all...
258
  			    .str = &__param_string_##name, 0, perm);	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
  	__MODULE_PARM_TYPE(name, "string")
b1e4d20cb   Michal Schmidt   params: make dash...
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  /**
   * parameq - checks if two parameter names match
   * @name1: parameter name 1
   * @name2: parameter name 2
   *
   * Returns true if the two parameter names are equal.
   * Dashes (-) are considered equal to underscores (_).
   */
  extern bool parameq(const char *name1, const char *name2);
  
  /**
   * parameqn - checks if two parameter names match
   * @name1: parameter name 1
   * @name2: parameter name 2
   * @n: the length to compare
   *
   * Similar to parameq(), except it compares @n characters.
   */
  extern bool parameqn(const char *name1, const char *name2, size_t n);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
280
281
  /* Called on module insert or kernel boot */
  extern int parse_args(const char *name,
  		      char *args,
914dcaa84   Rusty Russell   param: make param...
282
  		      const struct kernel_param *params,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
  		      unsigned num,
  		      int (*unknown)(char *param, char *val));
e180a6b77   Rusty Russell   param: fix charp ...
285
286
287
288
289
290
291
292
293
  /* Called by module remove. */
  #ifdef CONFIG_SYSFS
  extern void destroy_params(const struct kernel_param *params, unsigned num);
  #else
  static inline void destroy_params(const struct kernel_param *params,
  				  unsigned num)
  {
  }
  #endif /* !CONFIG_SYSFS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
296
297
298
  /* All the helper functions */
  /* The macros to do compile-time type checking stolen from Jakub
     Jelinek, who IIRC came up with this idea for the 2.4 module init code. */
  #define __param_check(name, p, type) \
  	static inline type *__check_##name(void) { return(p); }
9bbb9e5a3   Rusty Russell   param: use ops in...
299
300
301
  extern struct kernel_param_ops param_ops_byte;
  extern int param_set_byte(const char *val, const struct kernel_param *kp);
  extern int param_get_byte(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
  #define param_check_byte(name, p) __param_check(name, p, unsigned char)
9bbb9e5a3   Rusty Russell   param: use ops in...
303
304
305
  extern struct kernel_param_ops param_ops_short;
  extern int param_set_short(const char *val, const struct kernel_param *kp);
  extern int param_get_short(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
  #define param_check_short(name, p) __param_check(name, p, short)
9bbb9e5a3   Rusty Russell   param: use ops in...
307
308
309
  extern struct kernel_param_ops param_ops_ushort;
  extern int param_set_ushort(const char *val, const struct kernel_param *kp);
  extern int param_get_ushort(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
  #define param_check_ushort(name, p) __param_check(name, p, unsigned short)
9bbb9e5a3   Rusty Russell   param: use ops in...
311
312
313
  extern struct kernel_param_ops param_ops_int;
  extern int param_set_int(const char *val, const struct kernel_param *kp);
  extern int param_get_int(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  #define param_check_int(name, p) __param_check(name, p, int)
9bbb9e5a3   Rusty Russell   param: use ops in...
315
316
317
  extern struct kernel_param_ops param_ops_uint;
  extern int param_set_uint(const char *val, const struct kernel_param *kp);
  extern int param_get_uint(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
  #define param_check_uint(name, p) __param_check(name, p, unsigned int)
9bbb9e5a3   Rusty Russell   param: use ops in...
319
320
321
  extern struct kernel_param_ops param_ops_long;
  extern int param_set_long(const char *val, const struct kernel_param *kp);
  extern int param_get_long(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
  #define param_check_long(name, p) __param_check(name, p, long)
9bbb9e5a3   Rusty Russell   param: use ops in...
323
324
325
  extern struct kernel_param_ops param_ops_ulong;
  extern int param_set_ulong(const char *val, const struct kernel_param *kp);
  extern int param_get_ulong(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
  #define param_check_ulong(name, p) __param_check(name, p, unsigned long)
9bbb9e5a3   Rusty Russell   param: use ops in...
327
328
329
  extern struct kernel_param_ops param_ops_charp;
  extern int param_set_charp(const char *val, const struct kernel_param *kp);
  extern int param_get_charp(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
  #define param_check_charp(name, p) __param_check(name, p, char *)
72db395ff   Rusty Russell   module_param: che...
331
  /* We used to allow int as well as bool.  We're taking that away! */
9bbb9e5a3   Rusty Russell   param: use ops in...
332
333
334
  extern struct kernel_param_ops param_ops_bool;
  extern int param_set_bool(const char *val, const struct kernel_param *kp);
  extern int param_get_bool(char *buffer, const struct kernel_param *kp);
72db395ff   Rusty Russell   module_param: che...
335
  #define param_check_bool(name, p) __param_check(name, p, bool)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336

9bbb9e5a3   Rusty Russell   param: use ops in...
337
338
339
  extern struct kernel_param_ops param_ops_invbool;
  extern int param_set_invbool(const char *val, const struct kernel_param *kp);
  extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
9a71af2c3   Rusty Russell   module_param: inv...
340
  #define param_check_invbool(name, p) __param_check(name, p, bool)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341

69116f279   Rusty Russell   module_param: avo...
342
343
344
345
346
  /* An int, which can only be set like a bool (though it shows as an int). */
  extern struct kernel_param_ops param_ops_bint;
  extern int param_set_bint(const char *val, const struct kernel_param *kp);
  #define param_get_bint param_get_int
  #define param_check_bint param_check_int
546970bc6   Rusty Russell   param: add kernel...
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
  /**
   * module_param_array - a parameter which is an array of some type
   * @name: the name of the array variable
   * @type: the type, as per module_param()
   * @nump: optional pointer filled in with the number written
   * @perm: visibility in sysfs
   *
   * Input and output are as comma-separated values.  Commas inside values
   * don't work properly (eg. an array of charp).
   *
   * ARRAY_SIZE(@name) is used to determine the number of elements in the
   * array, so the definition must be visible.
   */
  #define module_param_array(name, type, nump, perm)		\
  	module_param_array_named(name, name, type, nump, perm)
  
  /**
   * module_param_array_named - renamed parameter which is an array of some type
   * @name: a valid C identifier which is the parameter name
   * @array: the name of the array variable
   * @type: the type, as per module_param()
   * @nump: optional pointer filled in with the number written
   * @perm: visibility in sysfs
   *
   * This exposes a different name than the actual variable name.  See
   * module_param_named() for why this might be necessary.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
  #define module_param_array_named(name, array, type, nump, perm)		\
bafeafeab   Rusty Russell   module_param: che...
375
  	param_check_##type(name, &(array)[0]);				\
22e48eaf5   Jan Beulich   constify string/a...
376
  	static const struct kparam_array __param_arr_##name		\
c5be0b2eb   Richard Kennedy   module: reorder k...
377
378
379
  	= { .max = ARRAY_SIZE(array), .num = nump,                      \
  	    .ops = &param_ops_##type,					\
  	    .elemsize = sizeof(array[0]), .elem = array };		\
fddd52012   Rusty Russell   module_param: all...
380
  	__module_param_call(MODULE_PARAM_PREFIX, name,			\
9bbb9e5a3   Rusty Russell   param: use ops in...
381
  			    &param_array_ops,				\
fddd52012   Rusty Russell   module_param: all...
382
383
  			    .arr = &__param_arr_##name,			\
  			    __same_type(array[0], bool), perm);		\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  	__MODULE_PARM_TYPE(name, "array of " #type)
9bbb9e5a3   Rusty Russell   param: use ops in...
385
  extern struct kernel_param_ops param_array_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386

9bbb9e5a3   Rusty Russell   param: use ops in...
387
388
389
  extern struct kernel_param_ops param_ops_string;
  extern int param_set_copystring(const char *val, const struct kernel_param *);
  extern int param_get_string(char *buffer, const struct kernel_param *kp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
393
  /* for exporting parameters in /sys/parameters */
  
  struct module;
ef665c1a0   Randy Dunlap   sysfs: fix build ...
394
  #if defined(CONFIG_SYSFS) && defined(CONFIG_MODULES)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
395
  extern int module_param_sysfs_setup(struct module *mod,
9bbb9e5a3   Rusty Russell   param: use ops in...
396
  				    const struct kernel_param *kparam,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
398
399
  				    unsigned int num_params);
  
  extern void module_param_sysfs_remove(struct module *mod);
ef665c1a0   Randy Dunlap   sysfs: fix build ...
400
401
  #else
  static inline int module_param_sysfs_setup(struct module *mod,
9bbb9e5a3   Rusty Russell   param: use ops in...
402
  			     const struct kernel_param *kparam,
ef665c1a0   Randy Dunlap   sysfs: fix build ...
403
404
405
406
407
408
409
410
  			     unsigned int num_params)
  {
  	return 0;
  }
  
  static inline void module_param_sysfs_remove(struct module *mod)
  { }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
412
  
  #endif /* _LINUX_MODULE_PARAMS_H */