Even when running as VM guest (ie pr_iucv != NULL), af_iucv can still
open HiperTransport-based connections. For robust operation these
connections require the af_iucv_netdev_notifier, so register it
unconditionally.

Also handle any error that register_netdevice_notifier() returns.

Fixes: 9fbd87d41392 ("af_iucv: handle netdev events")
Signed-off-by: Julian Wiedmann <j...@linux.ibm.com>
Reviewed-by: Ursula Braun <ubr...@linux.ibm.com>
---
 net/iucv/af_iucv.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
index 5264a182d2c3..09e1694b6d34 100644
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -2440,6 +2440,13 @@ static int afiucv_iucv_init(void)
        return err;
 }
 
+static void afiucv_iucv_exit(void)
+{
+       device_unregister(af_iucv_dev);
+       driver_unregister(&af_iucv_driver);
+       pr_iucv->iucv_unregister(&af_iucv_handler, 0);
+}
+
 static int __init afiucv_init(void)
 {
        int err;
@@ -2473,11 +2480,18 @@ static int __init afiucv_init(void)
                err = afiucv_iucv_init();
                if (err)
                        goto out_sock;
-       } else
-               register_netdevice_notifier(&afiucv_netdev_notifier);
+       }
+
+       err = register_netdevice_notifier(&afiucv_netdev_notifier);
+       if (err)
+               goto out_notifier;
+
        dev_add_pack(&iucv_packet_type);
        return 0;
 
+out_notifier:
+       if (pr_iucv)
+               afiucv_iucv_exit();
 out_sock:
        sock_unregister(PF_IUCV);
 out_proto:
@@ -2491,12 +2505,11 @@ static int __init afiucv_init(void)
 static void __exit afiucv_exit(void)
 {
        if (pr_iucv) {
-               device_unregister(af_iucv_dev);
-               driver_unregister(&af_iucv_driver);
-               pr_iucv->iucv_unregister(&af_iucv_handler, 0);
+               afiucv_iucv_exit();
                symbol_put(iucv_if);
-       } else
-               unregister_netdevice_notifier(&afiucv_netdev_notifier);
+       }
+
+       unregister_netdevice_notifier(&afiucv_netdev_notifier);
        dev_remove_pack(&iucv_packet_type);
        sock_unregister(PF_IUCV);
        proto_unregister(&iucv_proto);
-- 
2.17.1

Reply via email to