projects
/
cascardo
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'for-2.6.26' of git://git.kernel.dk/linux-2.6-block
[cascardo/linux.git]
/
kernel
/
module.c
diff --git
a/kernel/module.c
b/kernel/module.c
index
92595ba
..
8d6cccc
100644
(file)
--- a/
kernel/module.c
+++ b/
kernel/module.c
@@
-43,7
+43,6
@@
#include <linux/mutex.h>
#include <linux/unwind.h>
#include <asm/uaccess.h>
#include <linux/mutex.h>
#include <linux/unwind.h>
#include <asm/uaccess.h>
-#include <asm/semaphore.h>
#include <asm/cacheflush.h>
#include <linux/license.h>
#include <asm/sections.h>
#include <asm/cacheflush.h>
#include <linux/license.h>
#include <asm/sections.h>
@@
-664,7
+663,7
@@
static void free_module(struct module *mod);
static void wait_for_zero_refcount(struct module *mod)
{
static void wait_for_zero_refcount(struct module *mod)
{
- /* Since we might sleep for some time,
drop the semaphore
first */
+ /* Since we might sleep for some time,
release the mutex
first */
mutex_unlock(&module_mutex);
for (;;) {
DEBUGP("Looking at refcount...\n");
mutex_unlock(&module_mutex);
for (;;) {
DEBUGP("Looking at refcount...\n");
@@
-987,12
+986,11
@@
static unsigned long resolve_symbol(Elf_Shdr *sechdrs,
return ret;
}
return ret;
}
-
/*
* /sys/module/foo/sections stuff
* J. Corbet <corbet@lwn.net>
*/
/*
* /sys/module/foo/sections stuff
* J. Corbet <corbet@lwn.net>
*/
-#if
def CONFIG_KALLSYMS
+#if
defined(CONFIG_KALLSYMS) && defined(CONFIG_SYSFS)
static ssize_t module_sect_show(struct module_attribute *mattr,
struct module *mod, char *buf)
{
static ssize_t module_sect_show(struct module_attribute *mattr,
struct module *mod, char *buf)
{
@@
-1188,7
+1186,7
@@
static inline void add_notes_attrs(struct module *mod, unsigned int nsect,
static inline void remove_notes_attrs(struct module *mod)
{
}
static inline void remove_notes_attrs(struct module *mod)
{
}
-#endif
/* CONFIG_KALLSYMS */
+#endif
#ifdef CONFIG_SYSFS
int module_add_modinfo_attrs(struct module *mod)
#ifdef CONFIG_SYSFS
int module_add_modinfo_attrs(struct module *mod)
@@
-1231,9
+1229,7
@@
void module_remove_modinfo_attrs(struct module *mod)
}
kfree(mod->modinfo_attrs);
}
}
kfree(mod->modinfo_attrs);
}
-#endif
-#ifdef CONFIG_SYSFS
int mod_sysfs_init(struct module *mod)
{
int err;
int mod_sysfs_init(struct module *mod)
{
int err;
@@
-1936,8
+1932,15
@@
static struct module *load_module(void __user *umod,
/* Set up license info based on the info section */
set_license(mod, get_modinfo(sechdrs, infoindex, "license"));
/* Set up license info based on the info section */
set_license(mod, get_modinfo(sechdrs, infoindex, "license"));
+ /*
+ * ndiswrapper is under GPL by itself, but loads proprietary modules.
+ * Don't use add_taint_module(), as it would prevent ndiswrapper from
+ * using GPL-only symbols it needs.
+ */
if (strcmp(mod->name, "ndiswrapper") == 0)
if (strcmp(mod->name, "ndiswrapper") == 0)
- add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+ add_taint(TAINT_PROPRIETARY_MODULE);
+
+ /* driverloader was caught wrongly pretending to be under GPL */
if (strcmp(mod->name, "driverloader") == 0)
add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
if (strcmp(mod->name, "driverloader") == 0)
add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
@@
-2174,10
+2177,20
@@
sys_init_module(void __user *umod,
wake_up(&module_wq);
return ret;
}
wake_up(&module_wq);
return ret;
}
+ if (ret > 0) {
+ printk(KERN_WARNING "%s: '%s'->init suspiciously returned %d, "
+ "it should follow 0/-E convention\n"
+ KERN_WARNING "%s: loading module anyway...\n",
+ __func__, mod->name, ret,
+ __func__);
+ dump_stack();
+ }
- /* Now it's a first class citizen! */
- mutex_lock(&module_mutex);
+ /* Now it's a first class citizen! Wake up anyone waiting for it. */
mod->state = MODULE_STATE_LIVE;
mod->state = MODULE_STATE_LIVE;
+ wake_up(&module_wq);
+
+ mutex_lock(&module_mutex);
/* Drop initial reference. */
module_put(mod);
unwind_remove_table(mod->unwind_info, 1);
/* Drop initial reference. */
module_put(mod);
unwind_remove_table(mod->unwind_info, 1);
@@
-2186,7
+2199,6
@@
sys_init_module(void __user *umod,
mod->init_size = 0;
mod->init_text_size = 0;
mutex_unlock(&module_mutex);
mod->init_size = 0;
mod->init_text_size = 0;
mutex_unlock(&module_mutex);
- wake_up(&module_wq);
return 0;
}
return 0;
}