diff options
Diffstat (limited to 'include/linux/moduleparam.h')
-rw-r--r-- | include/linux/moduleparam.h | 61 |
1 files changed, 9 insertions, 52 deletions
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index ab5031453807..f1fdc50520d8 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h | |||
@@ -67,6 +67,7 @@ enum { | |||
67 | 67 | ||
68 | struct kernel_param { | 68 | struct kernel_param { |
69 | const char *name; | 69 | const char *name; |
70 | struct module *mod; | ||
70 | const struct kernel_param_ops *ops; | 71 | const struct kernel_param_ops *ops; |
71 | const u16 perm; | 72 | const u16 perm; |
72 | s8 level; | 73 | s8 level; |
@@ -108,7 +109,7 @@ struct kparam_array | |||
108 | * | 109 | * |
109 | * @perm is 0 if the the variable is not to appear in sysfs, or 0444 | 110 | * @perm is 0 if the the variable is not to appear in sysfs, or 0444 |
110 | * for world-readable, 0644 for root-writable, etc. Note that if it | 111 | * for world-readable, 0644 for root-writable, etc. Note that if it |
111 | * is writable, you may need to use kparam_block_sysfs_write() around | 112 | * is writable, you may need to use kernel_param_lock() around |
112 | * accesses (esp. charp, which can be kfreed when it changes). | 113 | * accesses (esp. charp, which can be kfreed when it changes). |
113 | * | 114 | * |
114 | * The @type is simply pasted to refer to a param_ops_##type and a | 115 | * The @type is simply pasted to refer to a param_ops_##type and a |
@@ -216,12 +217,12 @@ struct kparam_array | |||
216 | parameters. */ | 217 | parameters. */ |
217 | #define __module_param_call(prefix, name, ops, arg, perm, level, flags) \ | 218 | #define __module_param_call(prefix, name, ops, arg, perm, level, flags) \ |
218 | /* Default value instead of permissions? */ \ | 219 | /* Default value instead of permissions? */ \ |
219 | static const char __param_str_##name[] = prefix #name; \ | 220 | static const char __param_str_##name[] = prefix #name; \ |
220 | static struct kernel_param __moduleparam_const __param_##name \ | 221 | static struct kernel_param __moduleparam_const __param_##name \ |
221 | __used \ | 222 | __used \ |
222 | __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \ | 223 | __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \ |
223 | = { __param_str_##name, ops, VERIFY_OCTAL_PERMISSIONS(perm), \ | 224 | = { __param_str_##name, THIS_MODULE, ops, \ |
224 | level, flags, { arg } } | 225 | VERIFY_OCTAL_PERMISSIONS(perm), level, flags, { arg } } |
225 | 226 | ||
226 | /* Obsolete - use module_param_cb() */ | 227 | /* Obsolete - use module_param_cb() */ |
227 | #define module_param_call(name, set, get, arg, perm) \ | 228 | #define module_param_call(name, set, get, arg, perm) \ |
@@ -238,58 +239,14 @@ __check_old_set_param(int (*oldset)(const char *, struct kernel_param *)) | |||
238 | return 0; | 239 | return 0; |
239 | } | 240 | } |
240 | 241 | ||
241 | /** | ||
242 | * kparam_block_sysfs_write - make sure a parameter isn't written via sysfs. | ||
243 | * @name: the name of the parameter | ||
244 | * | ||
245 | * There's no point blocking write on a paramter that isn't writable via sysfs! | ||
246 | */ | ||
247 | #define kparam_block_sysfs_write(name) \ | ||
248 | do { \ | ||
249 | BUG_ON(!(__param_##name.perm & 0222)); \ | ||
250 | __kernel_param_lock(); \ | ||
251 | } while (0) | ||
252 | |||
253 | /** | ||
254 | * kparam_unblock_sysfs_write - allows sysfs to write to a parameter again. | ||
255 | * @name: the name of the parameter | ||
256 | */ | ||
257 | #define kparam_unblock_sysfs_write(name) \ | ||
258 | do { \ | ||
259 | BUG_ON(!(__param_##name.perm & 0222)); \ | ||
260 | __kernel_param_unlock(); \ | ||
261 | } while (0) | ||
262 | |||
263 | /** | ||
264 | * kparam_block_sysfs_read - make sure a parameter isn't read via sysfs. | ||
265 | * @name: the name of the parameter | ||
266 | * | ||
267 | * This also blocks sysfs writes. | ||
268 | */ | ||
269 | #define kparam_block_sysfs_read(name) \ | ||
270 | do { \ | ||
271 | BUG_ON(!(__param_##name.perm & 0444)); \ | ||
272 | __kernel_param_lock(); \ | ||
273 | } while (0) | ||
274 | |||
275 | /** | ||
276 | * kparam_unblock_sysfs_read - allows sysfs to read a parameter again. | ||
277 | * @name: the name of the parameter | ||
278 | */ | ||
279 | #define kparam_unblock_sysfs_read(name) \ | ||
280 | do { \ | ||
281 | BUG_ON(!(__param_##name.perm & 0444)); \ | ||
282 | __kernel_param_unlock(); \ | ||
283 | } while (0) | ||
284 | |||
285 | #ifdef CONFIG_SYSFS | 242 | #ifdef CONFIG_SYSFS |
286 | extern void __kernel_param_lock(void); | 243 | extern void kernel_param_lock(struct module *mod); |
287 | extern void __kernel_param_unlock(void); | 244 | extern void kernel_param_unlock(struct module *mod); |
288 | #else | 245 | #else |
289 | static inline void __kernel_param_lock(void) | 246 | static inline void kernel_param_lock(struct module *mod) |
290 | { | 247 | { |
291 | } | 248 | } |
292 | static inline void __kernel_param_unlock(void) | 249 | static inline void kernel_param_unlock(struct module *mod) |
293 | { | 250 | { |
294 | } | 251 | } |
295 | #endif | 252 | #endif |