diff options
| author | Ben Hutchings <ben@decadent.org.uk> | 2011-10-24 15:12:28 +0200 | 
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2011-11-07 07:54:42 +1030 | 
| commit | 2449b8ba0745327c5fa49a8d9acffe03b2eded69 (patch) | |
| tree | 48e11288635dcfc8cdb342f3ba00fa2a2a650aa8 | |
| parent | 1cd0d6c3021c8d76641b37203f504634b87fbabc (diff) | |
| download | olio-linux-3.10-2449b8ba0745327c5fa49a8d9acffe03b2eded69.tar.xz olio-linux-3.10-2449b8ba0745327c5fa49a8d9acffe03b2eded69.zip  | |
module,bug: Add TAINT_OOT_MODULE flag for modules not built in-tree
Use of the GPL or a compatible licence doesn't necessarily make the code
any good.  We already consider staging modules to be suspect, and this
should also be true for out-of-tree modules which may receive very
little review.
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Reviewed-by: Dave Jones <davej@redhat.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (patched oops-tracing.txt)
| -rw-r--r-- | Documentation/oops-tracing.txt | 2 | ||||
| -rw-r--r-- | include/linux/kernel.h | 1 | ||||
| -rw-r--r-- | kernel/module.c | 5 | ||||
| -rw-r--r-- | kernel/panic.c | 2 | ||||
| -rw-r--r-- | scripts/mod/modpost.c | 7 | 
5 files changed, 17 insertions, 0 deletions
diff --git a/Documentation/oops-tracing.txt b/Documentation/oops-tracing.txt index 6fe9001b926..13032c0140d 100644 --- a/Documentation/oops-tracing.txt +++ b/Documentation/oops-tracing.txt @@ -263,6 +263,8 @@ characters, each representing a particular tainted value.   12: 'I' if the kernel is working around a severe bug in the platform       firmware (BIOS or similar). + 13: 'O' if an externally-built ("out-of-tree") module has been loaded. +  The primary reason for the 'Tainted: ' string is to tell kernel  debuggers if this is a clean kernel or if anything unusual has  occurred.  Tainting is permanent: even if an offending module is diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 4c0d3b2fd5f..e8b1597b5cf 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -371,6 +371,7 @@ extern enum system_states {  #define TAINT_WARN			9  #define TAINT_CRAP			10  #define TAINT_FIRMWARE_WORKAROUND	11 +#define TAINT_OOT_MODULE		12  extern const char hex_asc[];  #define hex_asc_lo(x)	hex_asc[((x) & 0x0f)] diff --git a/kernel/module.c b/kernel/module.c index 3c550964284..ef8cb70c699 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2487,6 +2487,9 @@ static int check_modinfo(struct module *mod, struct load_info *info)  		return -ENOEXEC;  	} +	if (!get_modinfo(info, "intree")) +		add_taint_module(mod, TAINT_OOT_MODULE); +  	if (get_modinfo(info, "staging")) {  		add_taint_module(mod, TAINT_CRAP);  		printk(KERN_WARNING "%s: module is from the staging directory," @@ -3255,6 +3258,8 @@ static char *module_flags(struct module *mod, char *buf)  		buf[bx++] = '(';  		if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE))  			buf[bx++] = 'P'; +		else if (mod->taints & (1 << TAINT_OOT_MODULE)) +			buf[bx++] = 'O';  		if (mod->taints & (1 << TAINT_FORCED_MODULE))  			buf[bx++] = 'F';  		if (mod->taints & (1 << TAINT_CRAP)) diff --git a/kernel/panic.c b/kernel/panic.c index d7bb6974efb..b2659360421 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -177,6 +177,7 @@ static const struct tnt tnts[] = {  	{ TAINT_WARN,			'W', ' ' },  	{ TAINT_CRAP,			'C', ' ' },  	{ TAINT_FIRMWARE_WORKAROUND,	'I', ' ' }, +	{ TAINT_OOT_MODULE,		'O', ' ' },  };  /** @@ -194,6 +195,7 @@ static const struct tnt tnts[] = {   *  'W' - Taint on warning.   *  'C' - modules from drivers/staging are loaded.   *  'I' - Working around severe firmware bug. + *  '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 a509ff8f32f..2bd594e6d1b 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -1849,6 +1849,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"; @@ -2169,6 +2175,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);  |