![Linus Torvalds](/assets/img/avatar_default.png)
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 a2ee8649ba
:
"[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>
36 lines
719 B
C
36 lines
719 B
C
/*
|
|
* linux/init/version.c
|
|
*
|
|
* Copyright (C) 1992 Theodore Ts'o
|
|
*
|
|
* May be freely distributed as part of Linux.
|
|
*/
|
|
|
|
#include <linux/compile.h>
|
|
#include <linux/module.h>
|
|
#include <linux/uts.h>
|
|
#include <linux/utsname.h>
|
|
#include <linux/utsrelease.h>
|
|
#include <linux/version.h>
|
|
#include <linux/sched.h>
|
|
|
|
#define version(a) Version_ ## a
|
|
#define version_string(a) version(a)
|
|
|
|
int version_string(LINUX_VERSION_CODE);
|
|
|
|
struct uts_namespace init_uts_ns = {
|
|
.kref = {
|
|
.refcount = ATOMIC_INIT(2),
|
|
},
|
|
.name = {
|
|
.sysname = UTS_SYSNAME,
|
|
.nodename = UTS_NODENAME,
|
|
.release = UTS_RELEASE,
|
|
.version = UTS_VERSION,
|
|
.machine = UTS_MACHINE,
|
|
.domainname = UTS_DOMAINNAME,
|
|
},
|
|
};
|
|
EXPORT_SYMBOL_GPL(init_uts_ns);
|