iucv: Delay bus registration until core is ready.
authorCornelia Huck <cornelia.huck@de.ibm.com>
Thu, 10 Apr 2008 09:12:45 +0000 (02:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Apr 2008 09:12:45 +0000 (02:12 -0700)
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>
net/iucv/iucv.c

index a65e69e..9189707 100644 (file)
@@ -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: