Skip to content

Commit

Permalink
Remove "unsafe" from module struct
Browse files Browse the repository at this point in the history
Adrian Bunk points out that "unsafe" was used to mark modules touched by
the deprecated MOD_INC_USE_COUNT interface, which has long gone.  It's time
to remove the member from the module structure, as well.

If you want a module which can't unload, don't register an exit function.

(Vlad Yasevich says SCTP is now safe to unload, so just remove the
__unsafe there).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: Shannon Nelson <shannon.nelson@intel.com>
Acked-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Cc: Sridhar Samudrala <sri@us.ibm.com>
Cc: Adrian Bunk <bunk@stusta.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Rusty Russell authored and Linus Torvalds committed Oct 17, 2007
1 parent d9c9bef commit af49d92
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 37 deletions.
9 changes: 4 additions & 5 deletions drivers/dma/iop-adma.c
Original file line number Diff line number Diff line change
Expand Up @@ -1446,21 +1446,20 @@ static struct platform_driver iop_adma_driver = {

static int __init iop_adma_init (void)
{
/* it's currently unsafe to unload this module */
/* if forced, worst case is that rmmod hangs */
__unsafe(THIS_MODULE);

return platform_driver_register(&iop_adma_driver);
}

/* it's currently unsafe to unload this module */
#if 0
static void __exit iop_adma_exit (void)
{
platform_driver_unregister(&iop_adma_driver);
return;
}
module_exit(iop_adma_exit);
#endif

module_init(iop_adma_init);
module_exit(iop_adma_exit);

MODULE_AUTHOR("Intel Corporation");
MODULE_DESCRIPTION("IOP ADMA Engine Driver");
Expand Down
15 changes: 0 additions & 15 deletions include/linux/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -312,9 +312,6 @@ struct module
/* Arch-specific module values */
struct mod_arch_specific arch;

/* Am I unsafe to unload? */
int unsafe;

unsigned int taints; /* same bits as kernel:tainted */

#ifdef CONFIG_GENERIC_BUG
Expand Down Expand Up @@ -441,16 +438,6 @@ static inline void __module_get(struct module *module)
__mod ? __mod->name : "kernel"; \
})

#define __unsafe(mod) \
do { \
if (mod && !(mod)->unsafe) { \
printk(KERN_WARNING \
"Module %s cannot be unloaded due to unsafe usage in" \
" %s:%u\n", (mod)->name, __FILE__, __LINE__); \
(mod)->unsafe = 1; \
} \
} while(0)

/* For kallsyms to ask for address resolution. NULL means not found. */
const char *module_address_lookup(unsigned long addr,
unsigned long *symbolsize,
Expand Down Expand Up @@ -518,8 +505,6 @@ static inline void module_put(struct module *module)

#define module_name(mod) "kernel"

#define __unsafe(mod)

/* For kallsyms to ask for address resolution. NULL means not found. */
static inline const char *module_address_lookup(unsigned long addr,
unsigned long *symbolsize,
Expand Down
21 changes: 5 additions & 16 deletions kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -692,8 +692,7 @@ sys_delete_module(const char __user *name_user, unsigned int flags)
}

/* If it has an init func, it must have an exit func to unload */
if ((mod->init != NULL && mod->exit == NULL)
|| mod->unsafe) {
if (mod->init && !mod->exit) {
forced = try_force_unload(flags);
if (!forced) {
/* This module can't be removed */
Expand Down Expand Up @@ -741,11 +740,6 @@ static void print_unload_info(struct seq_file *m, struct module *mod)
seq_printf(m, "%s,", use->module_which_uses->name);
}

if (mod->unsafe) {
printed_something = 1;
seq_printf(m, "[unsafe],");
}

if (mod->init != NULL && mod->exit == NULL) {
printed_something = 1;
seq_printf(m, "[permanent],");
Expand Down Expand Up @@ -2011,15 +2005,10 @@ sys_init_module(void __user *umod,
buggy refcounters. */
mod->state = MODULE_STATE_GOING;
synchronize_sched();
if (mod->unsafe)
printk(KERN_ERR "%s: module is now stuck!\n",
mod->name);
else {
module_put(mod);
mutex_lock(&module_mutex);
free_module(mod);
mutex_unlock(&module_mutex);
}
module_put(mod);
mutex_lock(&module_mutex);
free_module(mod);
mutex_unlock(&module_mutex);
return ret;
}

Expand Down
1 change: 0 additions & 1 deletion net/sctp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1228,7 +1228,6 @@ SCTP_STATIC __init int sctp_init(void)
if (status)
goto err_v6_add_protocol;

__unsafe(THIS_MODULE);
status = 0;
out:
return status;
Expand Down

0 comments on commit af49d92

Please sign in to comment.