diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/kexec.c | 6 | ||||
-rw-r--r-- | kernel/ksysfs.c | 19 |
2 files changed, 22 insertions, 3 deletions
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 | ||