| From foo@baz Wed May 31 09:13:34 JST 2017 |
| From: Ursula Braun <ubraun@linux.vnet.ibm.com> |
| Date: Wed, 10 May 2017 19:07:51 +0200 |
| Subject: s390/qeth: handle sysfs error during initialization |
| |
| From: Ursula Braun <ubraun@linux.vnet.ibm.com> |
| |
| |
| [ Upstream commit 9111e7880ccf419548c7b0887df020b08eadb075 ] |
| |
| When setting up the device from within the layer discipline's |
| probe routine, creating the layer-specific sysfs attributes can fail. |
| Report this error back to the caller, and handle it by |
| releasing the layer discipline. |
| |
| Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com> |
| [jwi: updated commit msg, moved an OSN change to a subsequent patch] |
| Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/s390/net/qeth_core_main.c | 4 +++- |
| drivers/s390/net/qeth_core_sys.c | 2 ++ |
| drivers/s390/net/qeth_l2_main.c | 5 ++++- |
| drivers/s390/net/qeth_l3_main.c | 5 ++++- |
| 4 files changed, 13 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/s390/net/qeth_core_main.c |
| +++ b/drivers/s390/net/qeth_core_main.c |
| @@ -5663,8 +5663,10 @@ static int qeth_core_set_online(struct c |
| if (rc) |
| goto err; |
| rc = card->discipline->setup(card->gdev); |
| - if (rc) |
| + if (rc) { |
| + qeth_core_free_discipline(card); |
| goto err; |
| + } |
| } |
| rc = card->discipline->set_online(gdev); |
| err: |
| --- a/drivers/s390/net/qeth_core_sys.c |
| +++ b/drivers/s390/net/qeth_core_sys.c |
| @@ -426,6 +426,8 @@ static ssize_t qeth_dev_layer2_store(str |
| goto out; |
| |
| rc = card->discipline->setup(card->gdev); |
| + if (rc) |
| + qeth_core_free_discipline(card); |
| out: |
| mutex_unlock(&card->discipline_mutex); |
| return rc ? rc : count; |
| --- a/drivers/s390/net/qeth_l2_main.c |
| +++ b/drivers/s390/net/qeth_l2_main.c |
| @@ -1024,8 +1024,11 @@ static int qeth_l2_stop(struct net_devic |
| static int qeth_l2_probe_device(struct ccwgroup_device *gdev) |
| { |
| struct qeth_card *card = dev_get_drvdata(&gdev->dev); |
| + int rc; |
| |
| - qeth_l2_create_device_attributes(&gdev->dev); |
| + rc = qeth_l2_create_device_attributes(&gdev->dev); |
| + if (rc) |
| + return rc; |
| INIT_LIST_HEAD(&card->vid_list); |
| hash_init(card->mac_htable); |
| card->options.layer2 = 1; |
| --- a/drivers/s390/net/qeth_l3_main.c |
| +++ b/drivers/s390/net/qeth_l3_main.c |
| @@ -3157,8 +3157,11 @@ static int qeth_l3_setup_netdev(struct q |
| static int qeth_l3_probe_device(struct ccwgroup_device *gdev) |
| { |
| struct qeth_card *card = dev_get_drvdata(&gdev->dev); |
| + int rc; |
| |
| - qeth_l3_create_device_attributes(&gdev->dev); |
| + rc = qeth_l3_create_device_attributes(&gdev->dev); |
| + if (rc) |
| + return rc; |
| card->options.layer2 = 0; |
| card->info.hwtrap = 0; |
| return 0; |