summaryrefslogtreecommitdiffstats
path: root/drivers/s390/char
diff options
context:
space:
mode:
authorMichael Holzheu <holzheu@linux.vnet.ibm.com>2010-04-22 17:17:07 +0200
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2010-04-22 17:17:19 +0200
commit76ef964c78797f9baed7c2f9a58f696e86d8a048 (patch)
tree1f6a4e586682dc979bf8eb284049a29fd00cdac3 /drivers/s390/char
parent157a1a27d5921fc94db8c14e0d01363d13de99b5 (diff)
downloadlinux-76ef964c78797f9baed7c2f9a58f696e86d8a048.tar.gz
linux-76ef964c78797f9baed7c2f9a58f696e86d8a048.tar.bz2
linux-76ef964c78797f9baed7c2f9a58f696e86d8a048.zip
[S390] zcore: Fix reipl device detection
The reipl device information is passed from the kernel to zfcpdump using a pointer in the lowcore (0xe00) that points to the reipl information Currently if that pointer is not zero, we copy the reipl information. If the pointer is not initialized and points outside the accessible memory, it can happen that the memory copy fails. In that case we currently stop the initialization of zcore which leads to a failing kernel dump. The correct behavior is to disable the reipl after dump and continue with zcore intialization. Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/char')
-rw-r--r--drivers/s390/char/zcore.c6
1 files changed, 1 insertions, 5 deletions
diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c
index 18daf16aa357..7217966f7d31 100644
--- a/drivers/s390/char/zcore.c
+++ b/drivers/s390/char/zcore.c
@@ -638,11 +638,7 @@ static int __init zcore_reipl_init(void)
rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE);
else
rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE);
- if (rc) {
- free_page((unsigned long) ipl_block);
- return rc;
- }
- if (csum_partial(ipl_block, ipl_block->hdr.len, 0) !=
+ if (rc || csum_partial(ipl_block, ipl_block->hdr.len, 0) !=
ipib_info.checksum) {
TRACE("Checksum does not match\n");
free_page((unsigned long) ipl_block);