2010-07-07 11:12:45 +00:00
|
|
|
From: Jeff Mahoney <jeffm@suse.com>
|
|
|
|
Subject: Make the supported flag configurable at build time
|
|
|
|
References: bnc#528097
|
|
|
|
Patch-mainline: Never, SLES feature
|
|
|
|
|
|
|
|
In the enterprise kernels, it makes sense to have the supportability
|
|
|
|
facility. For openSUSE, it's unnecessary, cumbersome, and just plain
|
|
|
|
wrong. The support commitments for the two releases are totally
|
|
|
|
different and it doesn't make any sense to pretend that they are.
|
|
|
|
|
|
|
|
This patch adds a CONFIG_ENTERPRISE_SUPPORT option, which enables the support
|
|
|
|
reporting facility. When it is disabled, the reporting and checking are too.
|
|
|
|
|
|
|
|
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
|
|
|
|
---
|
2011-04-19 20:09:59 +00:00
|
|
|
Documentation/kernel-parameters.txt | 3 +++
|
2010-07-07 11:12:45 +00:00
|
|
|
include/linux/kernel.h | 2 ++
|
|
|
|
init/Kconfig | 18 ++++++++++++++++++
|
|
|
|
kernel/ksysfs.c | 4 ++++
|
2011-04-19 20:09:59 +00:00
|
|
|
kernel/module.c | 19 ++++++++++++++++++-
|
2010-07-07 11:12:45 +00:00
|
|
|
kernel/panic.c | 2 ++
|
|
|
|
kernel/sysctl.c | 2 +-
|
|
|
|
scripts/Makefile.modpost | 5 +++--
|
2011-04-19 20:09:59 +00:00
|
|
|
8 files changed, 51 insertions(+), 4 deletions(-)
|
2010-07-07 11:12:45 +00:00
|
|
|
|
|
|
|
--- a/Documentation/kernel-parameters.txt
|
|
|
|
+++ b/Documentation/kernel-parameters.txt
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -2509,6 +2509,9 @@ and is between 256 and 4096 characters.
|
2010-07-07 11:12:45 +00:00
|
|
|
1 = warn when loading unsupported modules,
|
|
|
|
2 = don't warn.
|
|
|
|
|
|
|
|
+ CONFIG_ENTERPRISE_SUPPORT must be enabled for this
|
|
|
|
+ to have any effect.
|
2011-04-19 20:09:59 +00:00
|
|
|
+
|
|
|
|
usbcore.autosuspend=
|
|
|
|
[USB] The autosuspend time delay (in seconds) used
|
|
|
|
for newly-detected USB devices (default 2). This
|
2010-07-07 11:12:45 +00:00
|
|
|
--- a/include/linux/kernel.h
|
|
|
|
+++ b/include/linux/kernel.h
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -253,12 +253,14 @@ extern enum system_states {
|
2010-07-07 11:12:45 +00:00
|
|
|
#define TAINT_CRAP 10
|
2011-04-19 20:09:59 +00:00
|
|
|
#define TAINT_FIRMWARE_WORKAROUND 11
|
2010-07-07 11:12:45 +00:00
|
|
|
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
/*
|
|
|
|
* Take the upper bits to hopefully allow them
|
|
|
|
* to stay the same for more than one release.
|
|
|
|
*/
|
|
|
|
#define TAINT_NO_SUPPORT 30
|
|
|
|
#define TAINT_EXTERNAL_SUPPORT 31
|
|
|
|
+#endif
|
|
|
|
|
2011-04-19 20:09:59 +00:00
|
|
|
extern const char hex_asc[];
|
|
|
|
#define hex_asc_lo(x) hex_asc[((x) & 0x0f)]
|
2010-07-07 11:12:45 +00:00
|
|
|
--- a/init/Kconfig
|
|
|
|
+++ b/init/Kconfig
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -1,6 +1,23 @@
|
|
|
|
config SUSE_KERNEL
|
|
|
|
def_bool y
|
2010-07-07 11:12:45 +00:00
|
|
|
|
|
|
|
+config ENTERPRISE_SUPPORT
|
|
|
|
+ bool "Enable enterprise support facility"
|
|
|
|
+ depends on SUSE_KERNEL
|
|
|
|
+ help
|
|
|
|
+ This feature enables the handling of the "supported" module flag.
|
|
|
|
+ This flag can be used to report unsupported module loads or even
|
|
|
|
+ refuse them entirely. It is useful when ensuring that the kernel
|
|
|
|
+ remains in a state that Novell Technical Services, or its
|
|
|
|
+ technical partners, is prepared to support.
|
|
|
|
+
|
|
|
|
+ Modules in the list of supported modules will be marked supported
|
|
|
|
+ on build. The default enforcement mode is to report, but not
|
|
|
|
+ deny, loading of unsupported modules.
|
|
|
|
+
|
|
|
|
+ If you aren't building a kernel for an enterprise distribution,
|
|
|
|
+ say n.
|
|
|
|
+
|
|
|
|
config SPLIT_PACKAGE
|
|
|
|
bool "Split the kernel package into multiple RPMs"
|
|
|
|
depends on SUSE_KERNEL && MODULES
|
|
|
|
--- a/kernel/ksysfs.c
|
|
|
|
+++ b/kernel/ksysfs.c
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -157,6 +157,7 @@ static struct bin_attribute notes_attr =
|
2010-07-07 11:12:45 +00:00
|
|
|
struct kobject *kernel_kobj;
|
|
|
|
EXPORT_SYMBOL_GPL(kernel_kobj);
|
|
|
|
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
const char *supported_printable(int taint)
|
|
|
|
{
|
|
|
|
int mask = TAINT_PROPRIETARY_MODULE|TAINT_NO_SUPPORT;
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -178,6 +179,7 @@ static ssize_t supported_show(struct kob
|
2010-07-07 11:12:45 +00:00
|
|
|
return sprintf(buf, "%s\n", supported_printable(get_taint()));
|
|
|
|
}
|
|
|
|
KERNEL_ATTR_RO(supported);
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
static struct attribute * kernel_attrs[] = {
|
|
|
|
#if defined(CONFIG_HOTPLUG)
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -193,7 +195,9 @@ static struct attribute * kernel_attrs[]
|
2010-07-07 11:12:45 +00:00
|
|
|
&kexec_crash_size_attr.attr,
|
|
|
|
&vmcoreinfo_attr.attr,
|
|
|
|
#endif
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
&supported_attr.attr,
|
|
|
|
+#endif
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
--- a/kernel/module.c
|
|
|
|
+++ b/kernel/module.c
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -73,6 +73,7 @@
|
2010-07-07 11:12:45 +00:00
|
|
|
/* If this is set, the section belongs in the init part of the module */
|
|
|
|
#define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1))
|
|
|
|
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
/* Allow unsupported modules switch. */
|
|
|
|
#ifdef UNSUPPORTED_MODULES
|
|
|
|
int unsupported = UNSUPPORTED_MODULES;
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -86,6 +87,7 @@ static int __init unsupported_setup(char
|
2010-07-07 11:12:45 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
__setup("unsupported=", unsupported_setup);
|
|
|
|
+#endif
|
|
|
|
|
2011-04-19 20:09:59 +00:00
|
|
|
/*
|
|
|
|
* Mutex protects:
|
|
|
|
@@ -945,6 +947,7 @@ static struct module_attribute initstate
|
2010-07-07 11:12:45 +00:00
|
|
|
.show = show_initstate,
|
|
|
|
};
|
|
|
|
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
static void setup_modinfo_supported(struct module *mod, const char *s)
|
|
|
|
{
|
|
|
|
if (!s) {
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -969,12 +972,15 @@ static struct module_attribute modinfo_s
|
2010-07-07 11:12:45 +00:00
|
|
|
.show = show_modinfo_supported,
|
|
|
|
.setup = setup_modinfo_supported,
|
|
|
|
};
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
static struct module_attribute *modinfo_attrs[] = {
|
|
|
|
&modinfo_version,
|
|
|
|
&modinfo_srcversion,
|
|
|
|
&initstate,
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
&modinfo_supported,
|
|
|
|
+#endif
|
|
|
|
#ifdef CONFIG_MODULE_UNLOAD
|
|
|
|
&refcnt,
|
|
|
|
#endif
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -1516,6 +1522,7 @@ static int mod_sysfs_setup(struct module
|
|
|
|
add_sect_attrs(mod, info);
|
|
|
|
add_notes_attrs(mod, info);
|
2010-07-07 11:12:45 +00:00
|
|
|
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
/* We don't use add_taint() here because it also disables lockdep. */
|
|
|
|
if (mod->taints & (1 << TAINT_EXTERNAL_SUPPORT))
|
|
|
|
add_nonfatal_taint(TAINT_EXTERNAL_SUPPORT);
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -1525,7 +1532,7 @@ static int mod_sysfs_setup(struct module
|
|
|
|
"Novell, refusing to load. To override, echo "
|
|
|
|
"1 > /proc/sys/kernel/unsupported\n", mod->name);
|
|
|
|
err = -ENOEXEC;
|
|
|
|
- goto free_hdr;
|
|
|
|
+ goto out_remove_attrs;
|
|
|
|
}
|
|
|
|
add_nonfatal_taint(TAINT_NO_SUPPORT);
|
|
|
|
if (unsupported == 1) {
|
|
|
|
@@ -1535,10 +1542,16 @@ static int mod_sysfs_setup(struct module
|
2010-07-07 11:12:45 +00:00
|
|
|
"fault.\n", mod->name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+#endif
|
|
|
|
|
2011-04-19 20:09:59 +00:00
|
|
|
kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
+out_remove_attrs:
|
|
|
|
+ remove_notes_attrs(mod);
|
|
|
|
+ remove_sect_attrs(mod);
|
|
|
|
+ del_usage_links(mod);
|
|
|
|
+ module_remove_modinfo_attrs(mod);
|
|
|
|
out_unreg_param:
|
|
|
|
module_param_sysfs_remove(mod);
|
|
|
|
out_unreg_holders:
|
|
|
|
@@ -3065,10 +3078,12 @@ static char *module_flags(struct module
|
2010-07-07 11:12:45 +00:00
|
|
|
buf[bx++] = 'F';
|
|
|
|
if (mod->taints & (1 << TAINT_CRAP))
|
|
|
|
buf[bx++] = 'C';
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
if (mod->taints & (1 << TAINT_NO_SUPPORT))
|
|
|
|
buf[bx++] = 'N';
|
|
|
|
if (mod->taints & (1 << TAINT_EXTERNAL_SUPPORT))
|
|
|
|
buf[bx++] = 'X';
|
|
|
|
+#endif
|
|
|
|
/*
|
|
|
|
* TAINT_FORCED_RMMOD: could be added.
|
|
|
|
* TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -3281,7 +3296,9 @@ void print_modules(void)
|
2010-07-07 11:12:45 +00:00
|
|
|
if (last_unloaded_module[0])
|
|
|
|
printk(" [last unloaded: %s]", last_unloaded_module);
|
|
|
|
printk("\n");
|
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
printk("Supported: %s\n", supported_printable(get_taint()));
|
|
|
|
+#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef CONFIG_MODVERSIONS
|
|
|
|
--- a/kernel/panic.c
|
|
|
|
+++ b/kernel/panic.c
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -174,8 +174,10 @@ static const struct tnt tnts[] = {
|
2010-07-07 11:12:45 +00:00
|
|
|
{ TAINT_WARN, 'W', ' ' },
|
|
|
|
{ TAINT_CRAP, 'C', ' ' },
|
2011-04-19 20:09:59 +00:00
|
|
|
{ TAINT_FIRMWARE_WORKAROUND, 'I', ' ' },
|
2010-07-07 11:12:45 +00:00
|
|
|
+#ifdef CONFIG_ENTERPRISE_SUPPORT
|
|
|
|
{ TAINT_NO_SUPPORT, 'N', ' ' },
|
|
|
|
{ TAINT_EXTERNAL_SUPPORT, 'X', ' ' },
|
|
|
|
+#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
--- a/kernel/sysctl.c
|
|
|
|
+++ b/kernel/sysctl.c
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -664,7 +664,7 @@ static struct ctl_table kern_table[] = {
|
2010-07-07 11:12:45 +00:00
|
|
|
.extra1 = &pid_max_min,
|
|
|
|
.extra2 = &pid_max_max,
|
|
|
|
},
|
|
|
|
-#ifdef CONFIG_MODULES
|
|
|
|
+#if defined(CONFIG_MODULES) && defined(CONFIG_ENTERPRISE_SUPPORT)
|
|
|
|
{
|
|
|
|
.procname = "unsupported",
|
|
|
|
.data = &unsupported,
|
|
|
|
--- a/scripts/Makefile.modpost
|
|
|
|
+++ b/scripts/Makefile.modpost
|
|
|
|
@@ -82,8 +82,9 @@ modpost = scripts/mod/modpost
|
|
|
|
$(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \
|
|
|
|
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \
|
|
|
|
$(if $(cross_build),-c) \
|
|
|
|
- -N $(firstword $(wildcard $(dir $(MODVERDIR))/Module.supported \
|
|
|
|
- $(objtree)/Module.supported /dev/null))
|
|
|
|
+ $(if $(CONFIG_ENTERPRISE_SUPPORT), \
|
|
|
|
+ -N $(firstword $(wildcard $(dir $(MODVERDIR))/Module.supported \
|
|
|
|
+ $(objtree)/Module.supported /dev/null)))
|
|
|
|
|
|
|
|
quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
|
|
|
|
cmd_modpost = $(modpost) -s
|