aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2008-09-24 17:46:44 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-10-10 18:31:05 -0400
commit061b1bd394ca8628b7c24eb4658ba3535da4249a (patch)
tree5711de7ffa17f0f5d0084292707872d19e9b19ff /kernel
parentb922df7383749a1c0b7ea64c50fa839263d3816b (diff)
Staging: add TAINT_CRAP for all drivers/staging code
We need to add a flag for all code that is in the drivers/staging/ directory to prevent all other kernel developers from worrying about issues here, and to notify users that the drivers might not be as good as they are normally used to. Based on code from Andreas Gruenbacher and Jeff Mahoney to provide a TAINT flag for the support level of a kernel module in the Novell enterprise kernel release. This is the kernel portion of this feature, the ability for the flag to be set needs to be done in the build process and will happen in a follow-up patch. Cc: Andreas Gruenbacher <agruen@suse.de> Cc: Jeff Mahoney <jeffm@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/module.c11
-rw-r--r--kernel/panic.c6
2 files changed, 15 insertions, 2 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 9db11911e04b..152b1655bbac 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1806,6 +1806,7 @@ static noinline struct module *load_module(void __user *umod,
1806 Elf_Ehdr *hdr; 1806 Elf_Ehdr *hdr;
1807 Elf_Shdr *sechdrs; 1807 Elf_Shdr *sechdrs;
1808 char *secstrings, *args, *modmagic, *strtab = NULL; 1808 char *secstrings, *args, *modmagic, *strtab = NULL;
1809 char *staging;
1809 unsigned int i; 1810 unsigned int i;
1810 unsigned int symindex = 0; 1811 unsigned int symindex = 0;
1811 unsigned int strindex = 0; 1812 unsigned int strindex = 0;
@@ -1960,6 +1961,14 @@ static noinline struct module *load_module(void __user *umod,
1960 goto free_hdr; 1961 goto free_hdr;
1961 } 1962 }
1962 1963
1964 staging = get_modinfo(sechdrs, infoindex, "staging");
1965 if (staging) {
1966 add_taint_module(mod, TAINT_CRAP);
1967 printk(KERN_WARNING "%s: module is from the staging directory,"
1968 " the quality is unknown, you have been warned.\n",
1969 mod->name);
1970 }
1971
1963 /* Now copy in args */ 1972 /* Now copy in args */
1964 args = strndup_user(uargs, ~0UL >> 1); 1973 args = strndup_user(uargs, ~0UL >> 1);
1965 if (IS_ERR(args)) { 1974 if (IS_ERR(args)) {
@@ -2556,6 +2565,8 @@ static char *module_flags(struct module *mod, char *buf)
2556 buf[bx++] = 'P'; 2565 buf[bx++] = 'P';
2557 if (mod->taints & TAINT_FORCED_MODULE) 2566 if (mod->taints & TAINT_FORCED_MODULE)
2558 buf[bx++] = 'F'; 2567 buf[bx++] = 'F';
2568 if (mod->taints & TAINT_CRAP)
2569 buf[bx++] = 'C';
2559 /* 2570 /*
2560 * TAINT_FORCED_RMMOD: could be added. 2571 * TAINT_FORCED_RMMOD: could be added.
2561 * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't 2572 * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
diff --git a/kernel/panic.c b/kernel/panic.c
index 12c5a0a6c89b..98e2047f4db7 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -155,6 +155,7 @@ EXPORT_SYMBOL(panic);
155 * 'U' - Userspace-defined naughtiness. 155 * 'U' - Userspace-defined naughtiness.
156 * 'A' - ACPI table overridden. 156 * 'A' - ACPI table overridden.
157 * 'W' - Taint on warning. 157 * 'W' - Taint on warning.
158 * 'C' - modules from drivers/staging are loaded.
158 * 159 *
159 * The string is overwritten by the next call to print_taint(). 160 * The string is overwritten by the next call to print_taint().
160 */ 161 */
@@ -163,7 +164,7 @@ const char *print_tainted(void)
163{ 164{
164 static char buf[20]; 165 static char buf[20];
165 if (tainted) { 166 if (tainted) {
166 snprintf(buf, sizeof(buf), "Tainted: %c%c%c%c%c%c%c%c%c%c", 167 snprintf(buf, sizeof(buf), "Tainted: %c%c%c%c%c%c%c%c%c%c%c",
167 tainted & TAINT_PROPRIETARY_MODULE ? 'P' : 'G', 168 tainted & TAINT_PROPRIETARY_MODULE ? 'P' : 'G',
168 tainted & TAINT_FORCED_MODULE ? 'F' : ' ', 169 tainted & TAINT_FORCED_MODULE ? 'F' : ' ',
169 tainted & TAINT_UNSAFE_SMP ? 'S' : ' ', 170 tainted & TAINT_UNSAFE_SMP ? 'S' : ' ',
@@ -173,7 +174,8 @@ const char *print_tainted(void)
173 tainted & TAINT_USER ? 'U' : ' ', 174 tainted & TAINT_USER ? 'U' : ' ',
174 tainted & TAINT_DIE ? 'D' : ' ', 175 tainted & TAINT_DIE ? 'D' : ' ',
175 tainted & TAINT_OVERRIDDEN_ACPI_TABLE ? 'A' : ' ', 176 tainted & TAINT_OVERRIDDEN_ACPI_TABLE ? 'A' : ' ',
176 tainted & TAINT_WARN ? 'W' : ' '); 177 tainted & TAINT_WARN ? 'W' : ' ',
178 tainted & TAINT_CRAP ? 'C' : ' ');
177 } 179 }
178 else 180 else
179 snprintf(buf, sizeof(buf), "Not tainted"); 181 snprintf(buf, sizeof(buf), "Not tainted");