]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/qeth: don't apply takeover changes to RXIP
authorJulian Wiedmann <jwi@linux.vnet.ibm.com>
Wed, 13 Dec 2017 17:56:30 +0000 (18:56 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Jan 2018 19:35:14 +0000 (20:35 +0100)
[ Upstream commit b22d73d6689fd902a66c08ebe71ab2f3b351e22f ]

When takeover is switched off, current code clears the 'TAKEOVER' flag on
all IPs. But the flag is also used for RXIP addresses, and those should
not be affected by the takeover mode.
Fix the behaviour by consistenly applying takover logic to NORMAL
addresses only.

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_l3_main.c
drivers/s390/net/qeth_l3_sys.c

index f91e70c369ed3b647738c826b90817010ce475a8..04240cc55e2ea91f6416acf5c7db03d6dde207ad 100644 (file)
@@ -178,6 +178,8 @@ int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *card,
 
        if (!card->ipato.enabled)
                return 0;
+       if (addr->type != QETH_IP_TYPE_NORMAL)
+               return 0;
 
        qeth_l3_convert_addr_to_bits((u8 *) &addr->u, addr_bits,
                                  (addr->proto == QETH_PROT_IPV4)? 4:16);
@@ -293,8 +295,7 @@ int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *tmp_addr)
                memcpy(addr, tmp_addr, sizeof(struct qeth_ipaddr));
                addr->ref_counter = 1;
 
-               if (addr->type == QETH_IP_TYPE_NORMAL  &&
-                               qeth_l3_is_addr_covered_by_ipato(card, addr)) {
+               if (qeth_l3_is_addr_covered_by_ipato(card, addr)) {
                        QETH_CARD_TEXT(card, 2, "tkovaddr");
                        addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
                }
index b595a2bc6b37638c5bf8add25455018a9e8c9ee9..85214439d1754413539e21dedff22a12e2133958 100644 (file)
@@ -398,10 +398,11 @@ static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
        card->ipato.enabled = enable;
 
        hash_for_each(card->ip_htable, i, addr, hnode) {
+               if (addr->type != QETH_IP_TYPE_NORMAL)
+                       continue;
                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))
+               else if (qeth_l3_is_addr_covered_by_ipato(card, addr))
                        addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
        }
 out: