|
@@ -1284,19 +1284,22 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
|
|
|
if (nr_segments > 0) {
|
|
|
unsigned long i;
|
|
|
|
|
|
- /* Loading another kernel to reboot into */
|
|
|
- if ((flags & KEXEC_ON_CRASH) == 0)
|
|
|
- result = kimage_alloc_init(&image, entry, nr_segments,
|
|
|
- segments, flags);
|
|
|
- /* Loading another kernel to switch to if this one crashes */
|
|
|
- else if (flags & KEXEC_ON_CRASH) {
|
|
|
- /* Free any current crash dump kernel before
|
|
|
+ if (flags & KEXEC_ON_CRASH) {
|
|
|
+ /*
|
|
|
+ * Loading another kernel to switch to if this one
|
|
|
+ * crashes. Free any current crash dump kernel before
|
|
|
* we corrupt it.
|
|
|
*/
|
|
|
+
|
|
|
kimage_free(xchg(&kexec_crash_image, NULL));
|
|
|
result = kimage_alloc_init(&image, entry, nr_segments,
|
|
|
segments, flags);
|
|
|
crash_map_reserved_pages();
|
|
|
+ } else {
|
|
|
+ /* Loading another kernel to reboot into. */
|
|
|
+
|
|
|
+ result = kimage_alloc_init(&image, entry, nr_segments,
|
|
|
+ segments, flags);
|
|
|
}
|
|
|
if (result)
|
|
|
goto out;
|