diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2007-02-02 16:39:12 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-02-16 15:19:15 -0800 |
commit | c353c3fb0700a3c17ea2b0237710a184232ccd7f (patch) | |
tree | 7b5fd590bd9b0a08bee8425ad074e993629683d1 /kernel/module.c | |
parent | 89790fd789e024b23eb1fbccedd84a2015441ce0 (diff) | |
download | op-kernel-dev-c353c3fb0700a3c17ea2b0237710a184232ccd7f.zip op-kernel-dev-c353c3fb0700a3c17ea2b0237710a184232ccd7f.tar.gz |
Driver core: let request_module() send a /sys/modules/kmod/-uevent
On recent systems, calls to /sbin/modprobe are handled by udev depending
on the kind of device the kernel has discovered. This patch creates an
uevent for the kernels internal request_module(), to let udev take control
over the request, instead of forking the binary directly by the kernel.
The direct execution of /sbin/modprobe can be disabled by setting:
/sys/module/kmod/mod_request_helper (/proc/sys/kernel/modprobe)
to an empty string, the same way /proc/sys/kernel/hotplug is disabled on an
udev system.
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/kernel/module.c b/kernel/module.c index 8a94e05..225501f 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -653,20 +653,11 @@ static void wait_for_zero_refcount(struct module *mod) mutex_lock(&module_mutex); } -asmlinkage long -sys_delete_module(const char __user *name_user, unsigned int flags) +int delete_module(const char *name, unsigned int flags) { struct module *mod; - char name[MODULE_NAME_LEN]; int ret, forced = 0; - if (!capable(CAP_SYS_MODULE)) - return -EPERM; - - if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) - return -EFAULT; - name[MODULE_NAME_LEN-1] = '\0'; - if (mutex_lock_interruptible(&module_mutex) != 0) return -EINTR; @@ -727,6 +718,21 @@ sys_delete_module(const char __user *name_user, unsigned int flags) return ret; } +asmlinkage long +sys_delete_module(const char __user *name_user, unsigned int flags) +{ + char name[MODULE_NAME_LEN]; + + if (!capable(CAP_SYS_MODULE)) + return -EPERM; + + if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) + return -EFAULT; + name[MODULE_NAME_LEN-1] = '\0'; + + return delete_module(name, flags); +} + static void print_unload_info(struct seq_file *m, struct module *mod) { struct module_use *use; |