Make SLES9 "get_kernel_version" work on the kernel binary again
authorLinus Torvalds <torvalds@woody.osdl.org>
Mon, 11 Dec 2006 17:28:46 +0000 (09:28 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Mon, 11 Dec 2006 19:34:11 +0000 (11:34 -0800)
As reported by Andy Whitcroft, at least the SLES9 initrd build process
depends on getting the kernel version from the kernel binary.  It does
that by simply trawling the binary and looking for the signature of the
"linux_banner" string (the string "Linux version " to be exact. Which
is really broken in itself, but whatever..)

That got broken when the string was changed to allow /proc/version to
change the UTS release information dynamically, and "get_kernel_version"
thus returned "%s" (see commit a2ee8649ba6d71416712e798276bf7c40b64e6e5:
"[PATCH] Fix linux banner utsname information").

This just restores "linux_banner" as a static string, which should fix
the version finding.  And /proc/version simply uses a different string.

To avoid wasting even that miniscule amount of memory, the early boot
string should really be marked __initdata, but that just causes the same
bug in SLES9 to re-appear, since it will then find other occurrences of
"Linux version " first.

Cc: Andy Whitcroft <apw@shadowen.org>
Acked-by: Herbert Poetzl <herbert@13thfloor.at>
Cc: Andi Kleen <ak@suse.de>
Cc: Andrew Morton <akpm@osdl.org>
Cc: Steve Fox <drfickle@us.ibm.com>
Acked-by: Olaf Hering <olaf@aepfle.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/proc/proc_misc.c
include/linux/kernel.h
init/main.c
init/version.c

index dc3e580d1dcaa817b59dd1c1955db1ded46bb0e2..92ea7743fe8f59dd97f925b8e7923a463fb5b022 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/vmalloc.h>
 #include <linux/crash_dump.h>
 #include <linux/pid_namespace.h>
+#include <linux/compile.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/io.h>
@@ -253,8 +254,15 @@ static int version_read_proc(char *page, char **start, off_t off,
 {
        int len;
 
-       len = sprintf(page, linux_banner,
-               utsname()->release, utsname()->version);
+       /* FIXED STRING! Don't touch! */
+       len = snprintf(page, PAGE_SIZE,
+               "%s version %s"
+               " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
+               " (" LINUX_COMPILER ")"
+               " %s\n",
+               utsname()->sysname,
+               utsname()->release,
+               utsname()->version);
        return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
index e8bfac34d2ba1cdd6192b5c270ef9d41159df883..b0c4a05a4b0caae1fa509f767d3246ed9a484351 100644 (file)
@@ -17,8 +17,6 @@
 #include <asm/byteorder.h>
 #include <asm/bug.h>
 
-extern const char linux_banner[];
-
 #define INT_MAX                ((int)(~0U>>1))
 #define INT_MIN                (-INT_MAX - 1)
 #define UINT_MAX       (~0U)
index 036f97c0c34c80bf26a55079e69dcda8f7f0e37d..fcd9ddc3ccf5c02e15f7169b2264c9604b52eac1 100644 (file)
@@ -483,6 +483,12 @@ void __init __attribute__((weak)) smp_setup_processor_id(void)
 {
 }
 
+static const char linux_banner[] =
+       "Linux version " UTS_RELEASE
+       " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
+       " (" LINUX_COMPILER ")"
+       " " UTS_VERSION "\n";
+
 asmlinkage void __init start_kernel(void)
 {
        char * command_line;
@@ -509,7 +515,7 @@ asmlinkage void __init start_kernel(void)
        boot_cpu_init();
        page_address_init();
        printk(KERN_NOTICE);
-       printk(linux_banner, UTS_RELEASE, UTS_VERSION);
+       printk(linux_banner);
        setup_arch(&command_line);
        unwind_setup();
        setup_per_cpu_areas();
index 2a5dfcd1c2e6a373bb81dfa100b786e133066316..9d96d36501ca512d96565daab53e7eb47863a18e 100644 (file)
@@ -33,8 +33,3 @@ struct uts_namespace init_uts_ns = {
        },
 };
 EXPORT_SYMBOL_GPL(init_uts_ns);
-
-const char linux_banner[] =
-       "Linux version %s (" LINUX_COMPILE_BY "@"
-       LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") %s\n";
-