summaryrefslogtreecommitdiffstats
path: root/net/iucv
diff options
context:
space:
mode:
authorCornelia Huck <cornelia.huck@de.ibm.com>2008-04-10 11:12:45 +0200
committerDavid S. Miller <davem@davemloft.net>2008-04-10 11:12:45 +0200
commit2d7bf36746b6329d9d54c6c6efe2b55666dd1f53 (patch)
treeff6c1608560d704622ba1e3400fcbbb96a3151a4 /net/iucv
parentiucv: get rid of in_atomic() use. (diff)
downloadlinux-2d7bf36746b6329d9d54c6c6efe2b55666dd1f53.tar.xz
linux-2d7bf36746b6329d9d54c6c6efe2b55666dd1f53.zip
iucv: Delay bus registration until core is ready.
If we register the iucv bus after the infrastructure is ready, userspace can start relying on it when it receives the uevent for the bus. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Ursula Braun <braunu@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/iucv')
-rw-r--r--net/iucv/iucv.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c
index a65e69eaea2f..918970762131 100644
--- a/net/iucv/iucv.c
+++ b/net/iucv/iucv.c
@@ -1608,13 +1608,10 @@ static int __init iucv_init(void)
rc = register_external_interrupt(0x4000, iucv_external_interrupt);
if (rc)
goto out;
- rc = bus_register(&iucv_bus);
- if (rc)
- goto out_int;
iucv_root = s390_root_dev_register("iucv");
if (IS_ERR(iucv_root)) {
rc = PTR_ERR(iucv_root);
- goto out_bus;
+ goto out_int;
}
for_each_online_cpu(cpu) {
@@ -1634,13 +1631,20 @@ static int __init iucv_init(void)
goto out_free;
}
}
- register_hotcpu_notifier(&iucv_cpu_notifier);
+ rc = register_hotcpu_notifier(&iucv_cpu_notifier);
+ if (rc)
+ goto out_free;
ASCEBC(iucv_error_no_listener, 16);
ASCEBC(iucv_error_no_memory, 16);
ASCEBC(iucv_error_pathid, 16);
iucv_available = 1;
+ rc = bus_register(&iucv_bus);
+ if (rc)
+ goto out_cpu;
return 0;
+out_cpu:
+ unregister_hotcpu_notifier(&iucv_cpu_notifier);
out_free:
for_each_possible_cpu(cpu) {
kfree(iucv_param[cpu]);
@@ -1649,8 +1653,6 @@ out_free:
iucv_irq_data[cpu] = NULL;
}
s390_root_dev_unregister(iucv_root);
-out_bus:
- bus_unregister(&iucv_bus);
out_int:
unregister_external_interrupt(0x4000, iucv_external_interrupt);
out: