diff options
| author | Doug Ledford <dledford@aladin.rdu.redhat.com> | 2002-11-17 06:32:15 -0500 |
|---|---|---|
| committer | Doug Ledford <dledford@flossy.devel.redhat.com> | 2002-11-17 06:32:15 -0500 |
| commit | d00819951546acddaece9b76f7124db8c70e95eb (patch) | |
| tree | 6ed445bd425f142033b1f1a638f038e475adb19c /kernel/module.c | |
| parent | fed60d4e14bed914be665d64ad219e87c7176777 (diff) | |
module.c: allow modules to enter themselves during mod init
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/module.c b/kernel/module.c index 668406fa22cd..9b8212cd32e1 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1058,6 +1058,15 @@ sys_init_module(void *umod, list_add(&mod->extable.list, &extables); spin_unlock_irq(&modlist_lock); + /* Note, setting the mod->live to 1 here is safe because we haven't + * linked the module into the system's kernel symbol table yet, + * which means that the only way any other kernel code can call + * into this module right now is if this module hands out entry + * pointers to the other code. We assume that no module hands out + * entry pointers to the rest of the kernel unless it is ready to + * have them used. + */ + mod->live = 1; /* Start the module */ ret = mod->init ? mod->init() : 0; if (ret < 0) { @@ -1070,9 +1079,10 @@ sys_init_module(void *umod, /* Mark it "live" so that they can force deletion later, and we don't keep getting woken on every decrement. */ - mod->live = 1; - } else + } else { + mod->live = 0; free_module(mod); + } up(&module_mutex); return ret; } @@ -1087,7 +1097,6 @@ sys_init_module(void *umod, mod->module_init = NULL; /* All ok! */ - mod->live = 1; up(&module_mutex); return 0; } |
