summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2009-10-29 15:04:10 +0100
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2009-10-29 15:05:12 +0100
commit4a0fb4c44573759f878fc65f6ddbd46080748f8b (patch)
tree4fbd49410c12f2643dd60586faf9a7ce0cb74be9
parent4f8048ee734dab7c463574797b820c0c68c80791 (diff)
downloadlinux-4a0fb4c44573759f878fc65f6ddbd46080748f8b.tar.gz
linux-4a0fb4c44573759f878fc65f6ddbd46080748f8b.tar.bz2
linux-4a0fb4c44573759f878fc65f6ddbd46080748f8b.zip
[S390] call home: fix error handling in init function
Fix missing unregister_sysctl_table in case the SCLP doesn't provide the requested feature. Also simplify the whole error handling while at it. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--drivers/s390/char/sclp_async.c28
1 files changed, 10 insertions, 18 deletions
diff --git a/drivers/s390/char/sclp_async.c b/drivers/s390/char/sclp_async.c
index bf4a9f455d8e..3c20aa131180 100644
--- a/drivers/s390/char/sclp_async.c
+++ b/drivers/s390/char/sclp_async.c
@@ -170,39 +170,31 @@ static int __init sclp_async_init(void)
rc = sclp_register(&sclp_async_register);
if (rc)
return rc;
- callhome_sysctl_header = register_sysctl_table(kern_dir_table);
- if (!callhome_sysctl_header) {
- rc = -ENOMEM;
- goto out_sclp;
- }
- if (!(sclp_async_register.sclp_receive_mask & EVTYP_ASYNC_MASK)) {
- rc = -EOPNOTSUPP;
+ rc = -EOPNOTSUPP;
+ if (!(sclp_async_register.sclp_receive_mask & EVTYP_ASYNC_MASK))
goto out_sclp;
- }
rc = -ENOMEM;
+ callhome_sysctl_header = register_sysctl_table(kern_dir_table);
+ if (!callhome_sysctl_header)
+ goto out_sclp;
request = kzalloc(sizeof(struct sclp_req), GFP_KERNEL);
- if (!request)
- goto out_sys;
sccb = (struct sclp_async_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
- if (!sccb)
+ if (!request || !sccb)
goto out_mem;
- rc = atomic_notifier_chain_register(&panic_notifier_list,
- &call_home_panic_nb);
+ rc = atomic_notifier_chain_register(&panic_notifier_list,
+ &call_home_panic_nb);
if (rc)
goto out_mem;
-
strncpy(nodename, init_utsname()->nodename, 64);
- return 0;
-
+ goto out;
out_mem:
kfree(request);
free_page((unsigned long) sccb);
-out_sys:
unregister_sysctl_table(callhome_sysctl_header);
out_sclp:
sclp_unregister(&sclp_async_register);
+out:
return rc;
-
}
module_init(sclp_async_init);