From d00819951546acddaece9b76f7124db8c70e95eb Mon Sep 17 00:00:00 2001 From: Doug Ledford Date: Sun, 17 Nov 2002 06:32:15 -0500 Subject: module.c: allow modules to enter themselves during mod init --- kernel/module.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'kernel') 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; } -- cgit v1.2.3