]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/3.18.103/s390-qeth-free-netdevice-when-removing-a-card.patch
Linux 4.14.95
[thirdparty/kernel/stable-queue.git] / releases / 3.18.103 / s390-qeth-free-netdevice-when-removing-a-card.patch
1 From foo@baz Thu Mar 29 08:33:08 CEST 2018
2 From: Julian Wiedmann <jwi@linux.vnet.ibm.com>
3 Date: Tue, 20 Mar 2018 07:59:12 +0100
4 Subject: s390/qeth: free netdevice when removing a card
5
6 From: Julian Wiedmann <jwi@linux.vnet.ibm.com>
7
8
9 [ Upstream commit 6be687395b3124f002a653c1a50b3260222b3cd7 ]
10
11 On removal, a qeth card's netdevice is currently not properly freed
12 because the call chain looks as follows:
13
14 qeth_core_remove_device(card)
15 lx_remove_device(card)
16 unregister_netdev(card->dev)
17 card->dev = NULL !!!
18 qeth_core_free_card(card)
19 if (card->dev) !!!
20 free_netdev(card->dev)
21
22 Fix it by free'ing the netdev straight after unregistering. This also
23 fixes the sysfs-driven layer switch case (qeth_dev_layer2_store()),
24 where the need to free the current netdevice was not considered at all.
25
26 Note that free_netdev() takes care of the netif_napi_del() for us too.
27
28 Fixes: 4a71df50047f ("qeth: new qeth device driver")
29 Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
30 Reviewed-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
31 Signed-off-by: David S. Miller <davem@davemloft.net>
32 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
33 ---
34 drivers/s390/net/qeth_core_main.c | 2 --
35 drivers/s390/net/qeth_l2_main.c | 2 +-
36 drivers/s390/net/qeth_l3_main.c | 2 +-
37 3 files changed, 2 insertions(+), 4 deletions(-)
38
39 --- a/drivers/s390/net/qeth_core_main.c
40 +++ b/drivers/s390/net/qeth_core_main.c
41 @@ -4937,8 +4937,6 @@ static void qeth_core_free_card(struct q
42 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
43 qeth_clean_channel(&card->read);
44 qeth_clean_channel(&card->write);
45 - if (card->dev)
46 - free_netdev(card->dev);
47 kfree(card->ip_tbd_list);
48 qeth_free_qdio_buffers(card);
49 unregister_service_level(&card->qeth_service_level);
50 --- a/drivers/s390/net/qeth_l2_main.c
51 +++ b/drivers/s390/net/qeth_l2_main.c
52 @@ -922,8 +922,8 @@ static void qeth_l2_remove_device(struct
53 qeth_l2_set_offline(cgdev);
54
55 if (card->dev) {
56 - netif_napi_del(&card->napi);
57 unregister_netdev(card->dev);
58 + free_netdev(card->dev);
59 card->dev = NULL;
60 }
61 return;
62 --- a/drivers/s390/net/qeth_l3_main.c
63 +++ b/drivers/s390/net/qeth_l3_main.c
64 @@ -3333,8 +3333,8 @@ static void qeth_l3_remove_device(struct
65 qeth_l3_set_offline(cgdev);
66
67 if (card->dev) {
68 - netif_napi_del(&card->napi);
69 unregister_netdev(card->dev);
70 + free_netdev(card->dev);
71 card->dev = NULL;
72 }
73