| From: Julian Wiedmann <jwi@linux.ibm.com> |
| Date: Tue, 18 Jun 2019 20:43:01 +0200 |
| Subject: net/af_iucv: always register net_device notifier |
| |
| commit 06996c1d4088a0d5f3e7789d7f96b4653cc947cc upstream. |
| |
| 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: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| net/iucv/af_iucv.c | 27 ++++++++++++++++++++------- |
| 1 file changed, 20 insertions(+), 7 deletions(-) |
| |
| --- a/net/iucv/af_iucv.c |
| +++ b/net/iucv/af_iucv.c |
| @@ -2399,6 +2399,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; |
| @@ -2432,11 +2439,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: |
| @@ -2450,12 +2464,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); |