| From 5c30d3ce5fcd829d81a1438e0da70c6bb41fe8d2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 18 Jun 2019 20:43:01 +0200 |
| Subject: net/af_iucv: always register net_device notifier |
| |
| From: Julian Wiedmann <jwi@linux.ibm.com> |
| |
| [ Upstream commit 06996c1d4088a0d5f3e7789d7f96b4653cc947cc ] |
| |
| 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 <jwi@linux.ibm.com> |
| Reviewed-by: Ursula Braun <ubraun@linux.ibm.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 c2dfc32eb9f21..02e10deef5b45 100644 |
| --- a/net/iucv/af_iucv.c |
| +++ b/net/iucv/af_iucv.c |
| @@ -2431,6 +2431,13 @@ out: |
| 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; |
| @@ -2464,11 +2471,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: |
| @@ -2482,12 +2496,11 @@ out: |
| 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.20.1 |
| |