X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=kernel%2Fkexec_file.c;h=037c321c56188f9fbb35193072f08052d6e4771f;hb=15301a570754c7af60335d094dd2d1808b0641a5;hp=c72d2ff5896e9f37e21c789d45d7b2cc058be9f0;hpb=8c57a5e7b2820f349c95b8c8393fec1e0f4070d2;p=deliverable%2Flinux.git diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index c72d2ff5896e..037c321c5618 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -274,8 +274,11 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd, return -EBUSY; dest_image = &kexec_image; - if (flags & KEXEC_FILE_ON_CRASH) + if (flags & KEXEC_FILE_ON_CRASH) { dest_image = &kexec_crash_image; + if (kexec_crash_image) + arch_kexec_unprotect_crashkres(); + } if (flags & KEXEC_FILE_UNLOAD) goto exchange; @@ -324,6 +327,9 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd, exchange: image = xchg(dest_image, image); out: + if ((flags & KEXEC_FILE_ON_CRASH) && kexec_crash_image) + arch_kexec_protect_crashkres(); + mutex_unlock(&kexec_mutex); kimage_free(image); return ret; @@ -881,7 +887,10 @@ int kexec_load_purgatory(struct kimage *image, unsigned long min, return 0; out: vfree(pi->sechdrs); + pi->sechdrs = NULL; + vfree(pi->purgatory_buf); + pi->purgatory_buf = NULL; return ret; }