| From foo@baz Sun Dec 31 11:13:15 CET 2017 |
| From: Julian Wiedmann <jwi@linux.vnet.ibm.com> |
| Date: Wed, 13 Dec 2017 18:56:29 +0100 |
| Subject: s390/qeth: apply takeover changes when mode is toggled |
| |
| From: Julian Wiedmann <jwi@linux.vnet.ibm.com> |
| |
| |
| [ Upstream commit 7fbd9493f0eeae8cef58300505a9ef5c8fce6313 ] |
| |
| Just as for an explicit enable/disable, toggling the takeover mode also |
| requires that the IP addresses get updated. Otherwise all IPs that were |
| added to the table before the mode-toggle, get registered with the old |
| settings. |
| |
| 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.h | 2 +- |
| drivers/s390/net/qeth_core_main.c | 2 +- |
| drivers/s390/net/qeth_l3_sys.c | 35 +++++++++++++++++------------------ |
| 3 files changed, 19 insertions(+), 20 deletions(-) |
| |
| --- a/drivers/s390/net/qeth_core.h |
| +++ b/drivers/s390/net/qeth_core.h |
| @@ -576,7 +576,7 @@ enum qeth_cq { |
| }; |
| |
| struct qeth_ipato { |
| - int enabled; |
| + bool enabled; |
| int invert4; |
| int invert6; |
| struct list_head entries; |
| --- a/drivers/s390/net/qeth_core_main.c |
| +++ b/drivers/s390/net/qeth_core_main.c |
| @@ -1475,7 +1475,7 @@ static int qeth_setup_card(struct qeth_c |
| qeth_set_intial_options(card); |
| /* IP address takeover */ |
| INIT_LIST_HEAD(&card->ipato.entries); |
| - card->ipato.enabled = 0; |
| + card->ipato.enabled = false; |
| card->ipato.invert4 = 0; |
| card->ipato.invert6 = 0; |
| /* init QDIO stuff */ |
| --- a/drivers/s390/net/qeth_l3_sys.c |
| +++ b/drivers/s390/net/qeth_l3_sys.c |
| @@ -374,6 +374,7 @@ static ssize_t qeth_l3_dev_ipato_enable_ |
| struct qeth_card *card = dev_get_drvdata(dev); |
| struct qeth_ipaddr *addr; |
| int i, rc = 0; |
| + bool enable; |
| |
| if (!card) |
| return -EINVAL; |
| @@ -386,25 +387,23 @@ static ssize_t qeth_l3_dev_ipato_enable_ |
| } |
| |
| if (sysfs_streq(buf, "toggle")) { |
| - card->ipato.enabled = (card->ipato.enabled)? 0 : 1; |
| - } else if (sysfs_streq(buf, "1")) { |
| - card->ipato.enabled = 1; |
| - hash_for_each(card->ip_htable, i, addr, hnode) { |
| - if ((addr->type == QETH_IP_TYPE_NORMAL) && |
| - qeth_l3_is_addr_covered_by_ipato(card, addr)) |
| - addr->set_flags |= |
| - QETH_IPA_SETIP_TAKEOVER_FLAG; |
| - } |
| - } else if (sysfs_streq(buf, "0")) { |
| - card->ipato.enabled = 0; |
| - hash_for_each(card->ip_htable, i, addr, hnode) { |
| - if (addr->set_flags & |
| - QETH_IPA_SETIP_TAKEOVER_FLAG) |
| - addr->set_flags &= |
| - ~QETH_IPA_SETIP_TAKEOVER_FLAG; |
| - } |
| - } else |
| + enable = !card->ipato.enabled; |
| + } else if (kstrtobool(buf, &enable)) { |
| rc = -EINVAL; |
| + goto out; |
| + } |
| + |
| + if (card->ipato.enabled == enable) |
| + goto out; |
| + card->ipato.enabled = enable; |
| + |
| + hash_for_each(card->ip_htable, i, addr, hnode) { |
| + if (!enable) |
| + addr->set_flags &= ~QETH_IPA_SETIP_TAKEOVER_FLAG; |
| + else if (addr->type == QETH_IP_TYPE_NORMAL && |
| + qeth_l3_is_addr_covered_by_ipato(card, addr)) |
| + addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG; |
| + } |
| out: |
| mutex_unlock(&card->conf_mutex); |
| return rc ? rc : count; |