summaryrefslogtreecommitdiff
path: root/kexec/crashdump-elf.c
diff options
context:
space:
mode:
authorDave Young <dyoung@redhat.com>2015-09-25 10:37:51 +0800
committerSimon Horman <horms@verge.net.au>2015-09-25 14:38:29 +0900
commit6fd80e245e3877a8213ca788caea58d08e40264e (patch)
tree4d74cfd1640075aaaec2da5ce630145b39b14670 /kexec/crashdump-elf.c
parent7ab842d8a004f6cd75a9d7b3528e4a70819ce4ef (diff)
fix kexec load hang in case crash notes addr read failure
While readng crash note, count_cpu variable will be never decreased in case any failure to read the sysfs file. The issue was found during I test CONFIG_KEXEC_FILE only kernel option. crash_notes are exported to sysfs only for CONFIG_KEXEC. In latest kernel we can configure kernel with CONFIG_KEXEC_FILE only in Kconfig. In this case, if you run a kernel with kexec_file only but do not specify "-s" in kexec-tools arguments, then kexec-tools will hang there. Though "-s" is mandatory for kexec_file_load, kexec should still fail out instead of hanging. Fixing the problem by always decreasing count_cpu in the for loop. Signed-off-by: Dave Young <dyoung@redhat.com> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec/crashdump-elf.c')
-rw-r--r--kexec/crashdump-elf.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c
index c869347..b8bb686 100644
--- a/kexec/crashdump-elf.c
+++ b/kexec/crashdump-elf.c
@@ -141,11 +141,12 @@ int FUNC(struct kexec_info *info,
count_cpu = nr_cpus;
for (i = 0; count_cpu > 0; i++) {
- if (get_note_info(i, &notes_addr, &notes_len) < 0) {
- /* This cpu is not present. Skip it. */
- continue;
- }
+ int ret;
+
+ ret = get_note_info(i, &notes_addr, &notes_len);
count_cpu--;
+ if (ret < 0) /* This cpu is not present. Skip it. */
+ continue;
phdr = (PHDR *) bufp;
bufp += sizeof(PHDR);