diff options
author | Jeff Moyer <jmoyer@redhat.com> | 2006-06-23 05:05:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-23 10:43:02 -0400 |
commit | c330dda908b5a46469a997eea90b66f2f9f02b34 (patch) | |
tree | aad52aa4e127c366ca185c2122650d7dbb3437a0 | |
parent | 24bbb1faf3f0420eb252dd0fdc1e477b1d4d73bd (diff) |
[PATCH] Add a sysfs file to determine if a kexec kernel is loaded
Create two files in /sys/kernel, kexec_loaded and kexec_crash_loaded. Each
file contains a simple boolean value indicating whether the relevant kernel
has been loaded into memory. The motivation for this is geared around
support.
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | include/linux/kexec.h | 1 | ||||
-rw-r--r-- | kernel/kexec.c | 6 | ||||
-rw-r--r-- | kernel/ksysfs.c | 19 |
3 files changed, 23 insertions, 3 deletions
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index cfb3410e32b1..6427949ddf99 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -106,6 +106,7 @@ extern struct page *kimage_alloc_control_pages(struct kimage *image, | |||
106 | extern void crash_kexec(struct pt_regs *); | 106 | extern void crash_kexec(struct pt_regs *); |
107 | int kexec_should_crash(struct task_struct *); | 107 | int kexec_should_crash(struct task_struct *); |
108 | extern struct kimage *kexec_image; | 108 | extern struct kimage *kexec_image; |
109 | extern struct kimage *kexec_crash_image; | ||
109 | 110 | ||
110 | #define KEXEC_ON_CRASH 0x00000001 | 111 | #define KEXEC_ON_CRASH 0x00000001 |
111 | #define KEXEC_ARCH_MASK 0xffff0000 | 112 | #define KEXEC_ARCH_MASK 0xffff0000 |
diff --git a/kernel/kexec.c b/kernel/kexec.c index bf39d28e4c0e..58f0f382597c 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -902,14 +902,14 @@ static int kimage_load_segment(struct kimage *image, | |||
902 | * kexec does not sync, or unmount filesystems so if you need | 902 | * kexec does not sync, or unmount filesystems so if you need |
903 | * that to happen you need to do that yourself. | 903 | * that to happen you need to do that yourself. |
904 | */ | 904 | */ |
905 | struct kimage *kexec_image = NULL; | 905 | struct kimage *kexec_image; |
906 | static struct kimage *kexec_crash_image = NULL; | 906 | struct kimage *kexec_crash_image; |
907 | /* | 907 | /* |
908 | * A home grown binary mutex. | 908 | * A home grown binary mutex. |
909 | * Nothing can wait so this mutex is safe to use | 909 | * Nothing can wait so this mutex is safe to use |
910 | * in interrupt context :) | 910 | * in interrupt context :) |
911 | */ | 911 | */ |
912 | static int kexec_lock = 0; | 912 | static int kexec_lock; |
913 | 913 | ||
914 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | 914 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, |
915 | struct kexec_segment __user *segments, | 915 | struct kexec_segment __user *segments, |
diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index f119e098e67b..9e28478a17a5 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/sysfs.h> | 14 | #include <linux/sysfs.h> |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/kexec.h> | ||
17 | 18 | ||
18 | #define KERNEL_ATTR_RO(_name) \ | 19 | #define KERNEL_ATTR_RO(_name) \ |
19 | static struct subsys_attribute _name##_attr = __ATTR_RO(_name) | 20 | static struct subsys_attribute _name##_attr = __ATTR_RO(_name) |
@@ -48,6 +49,20 @@ static ssize_t uevent_helper_store(struct subsystem *subsys, const char *page, s | |||
48 | KERNEL_ATTR_RW(uevent_helper); | 49 | KERNEL_ATTR_RW(uevent_helper); |
49 | #endif | 50 | #endif |
50 | 51 | ||
52 | #ifdef CONFIG_KEXEC | ||
53 | static ssize_t kexec_loaded_show(struct subsystem *subsys, char *page) | ||
54 | { | ||
55 | return sprintf(page, "%d\n", !!kexec_image); | ||
56 | } | ||
57 | KERNEL_ATTR_RO(kexec_loaded); | ||
58 | |||
59 | static ssize_t kexec_crash_loaded_show(struct subsystem *subsys, char *page) | ||
60 | { | ||
61 | return sprintf(page, "%d\n", !!kexec_crash_image); | ||
62 | } | ||
63 | KERNEL_ATTR_RO(kexec_crash_loaded); | ||
64 | #endif /* CONFIG_KEXEC */ | ||
65 | |||
51 | decl_subsys(kernel, NULL, NULL); | 66 | decl_subsys(kernel, NULL, NULL); |
52 | EXPORT_SYMBOL_GPL(kernel_subsys); | 67 | EXPORT_SYMBOL_GPL(kernel_subsys); |
53 | 68 | ||
@@ -56,6 +71,10 @@ static struct attribute * kernel_attrs[] = { | |||
56 | &uevent_seqnum_attr.attr, | 71 | &uevent_seqnum_attr.attr, |
57 | &uevent_helper_attr.attr, | 72 | &uevent_helper_attr.attr, |
58 | #endif | 73 | #endif |
74 | #ifdef CONFIG_KEXEC | ||
75 | &kexec_loaded_attr.attr, | ||
76 | &kexec_crash_loaded_attr.attr, | ||
77 | #endif | ||
59 | NULL | 78 | NULL |
60 | }; | 79 | }; |
61 | 80 | ||