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>
This commit is contained in:
parent
9284d6c704
commit
2d7bf36746
|
@ -1608,13 +1608,10 @@ static int __init iucv_init(void)
|
||||||
rc = register_external_interrupt(0x4000, iucv_external_interrupt);
|
rc = register_external_interrupt(0x4000, iucv_external_interrupt);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
rc = bus_register(&iucv_bus);
|
|
||||||
if (rc)
|
|
||||||
goto out_int;
|
|
||||||
iucv_root = s390_root_dev_register("iucv");
|
iucv_root = s390_root_dev_register("iucv");
|
||||||
if (IS_ERR(iucv_root)) {
|
if (IS_ERR(iucv_root)) {
|
||||||
rc = PTR_ERR(iucv_root);
|
rc = PTR_ERR(iucv_root);
|
||||||
goto out_bus;
|
goto out_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_online_cpu(cpu) {
|
for_each_online_cpu(cpu) {
|
||||||
|
@ -1634,13 +1631,20 @@ static int __init iucv_init(void)
|
||||||
goto out_free;
|
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_listener, 16);
|
||||||
ASCEBC(iucv_error_no_memory, 16);
|
ASCEBC(iucv_error_no_memory, 16);
|
||||||
ASCEBC(iucv_error_pathid, 16);
|
ASCEBC(iucv_error_pathid, 16);
|
||||||
iucv_available = 1;
|
iucv_available = 1;
|
||||||
|
rc = bus_register(&iucv_bus);
|
||||||
|
if (rc)
|
||||||
|
goto out_cpu;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_cpu:
|
||||||
|
unregister_hotcpu_notifier(&iucv_cpu_notifier);
|
||||||
out_free:
|
out_free:
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
kfree(iucv_param[cpu]);
|
kfree(iucv_param[cpu]);
|
||||||
|
@ -1649,8 +1653,6 @@ out_free:
|
||||||
iucv_irq_data[cpu] = NULL;
|
iucv_irq_data[cpu] = NULL;
|
||||||
}
|
}
|
||||||
s390_root_dev_unregister(iucv_root);
|
s390_root_dev_unregister(iucv_root);
|
||||||
out_bus:
|
|
||||||
bus_unregister(&iucv_bus);
|
|
||||||
out_int:
|
out_int:
|
||||||
unregister_external_interrupt(0x4000, iucv_external_interrupt);
|
unregister_external_interrupt(0x4000, iucv_external_interrupt);
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Reference in New Issue