This makes it easier to spot out-of-tree modules. We have enough
bugs of our own to deal with, before supporting these.
Signed-off-by: Ben Hutchings b...@decadent.org.uk
---
I want to apply this to squeeze. I've seen one too many panics with
VMware or VirtualBox modules in them, which appear to be worse than
anything in drivers/staging.
Ben.
include/linux/kernel.h |1 +
kernel/module.c|8 +++-
kernel/panic.c |2 ++
scripts/mod/modpost.c |7 +++
4 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index f4e3184..3aeb221 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -334,6 +334,7 @@ extern enum system_states {
#define TAINT_OVERRIDDEN_ACPI_TABLE8
#define TAINT_WARN 9
#define TAINT_CRAP 10
+#define TAINT_OOT_MODULE 11
extern void dump_stack(void) __cold;
diff --git a/kernel/module.c b/kernel/module.c
index 4b270e6..8d87d61 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2097,7 +2097,7 @@ static noinline struct module *load_module(void __user
*umod,
Elf_Ehdr *hdr;
Elf_Shdr *sechdrs;
char *secstrings, *args, *modmagic, *strtab = NULL;
- char *staging;
+ char *intree, *staging;
unsigned int i;
unsigned int symindex = 0;
unsigned int strindex = 0;
@@ -2208,6 +2208,10 @@ static noinline struct module *load_module(void __user
*umod,
goto free_hdr;
}
+ intree = get_modinfo(sechdrs, infoindex, intree);
+ if (!intree)
+ add_taint_module(mod, TAINT_OOT_MODULE);
+
staging = get_modinfo(sechdrs, infoindex, staging);
if (staging) {
add_taint_module(mod, TAINT_CRAP);
@@ -2893,6 +2897,8 @@ static char *module_flags(struct module *mod, char *buf)
buf[bx++] = 'F';
if (mod-taints (1 TAINT_CRAP))
buf[bx++] = 'C';
+ if (mod-taints (1 TAINT_OOT_MODULE))
+ buf[bx++] = 'O';
/*
* TAINT_FORCED_RMMOD: could be added.
* TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
diff --git a/kernel/panic.c b/kernel/panic.c
index 96b45d0..4464f61 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -161,6 +161,7 @@ static const struct tnt tnts[] = {
{ TAINT_OVERRIDDEN_ACPI_TABLE, 'A', ' ' },
{ TAINT_WARN, 'W', ' ' },
{ TAINT_CRAP, 'C', ' ' },
+ { TAINT_OOT_MODULE, 'O', ' ' },
};
/**
@@ -177,6 +178,7 @@ static const struct tnt tnts[] = {
* 'A' - ACPI table overridden.
* 'W' - Taint on warning.
* 'C' - modules from drivers/staging are loaded.
+ * 'O' - Out-of-tree module has been loaded.
*
* The string is overwritten by the next call to print_tainted().
*/
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 03efeab..d6671b0 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1746,6 +1746,12 @@ static void add_header(struct buffer *b, struct module
*mod)
buf_printf(b, };\n);
}
+static void add_intree_flag(struct buffer *b, int is_intree)
+{
+ if (is_intree)
+ buf_printf(b, \nMODULE_INFO(intree, \Y\);\n);
+}
+
static void add_staging_flag(struct buffer *b, const char *name)
{
static const char *staging_dir = drivers/staging;
@@ -2164,6 +2170,7 @@ int main(int argc, char **argv)
buf.pos = 0;
add_header(buf, mod);
+ add_intree_flag(buf, !external_module);
add_staging_flag(buf, mod-name);
err |= add_versions(buf, mod);
add_depends(buf, mod, modules);
--
1.7.2.3
signature.asc
Description: This is a digitally signed message part