s390/qeth: improve error reporting on IP add/removal
authorJulian Wiedmann <jwi@linux.vnet.ibm.com>
Wed, 27 Dec 2017 16:44:28 +0000 (17:44 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Jan 2018 18:52:22 +0000 (13:52 -0500)
When adding & removing IP entries for rxip/vipa/ipato/hsuid, forward any
resulting errors back to the sysfs-level caller.

Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_l3.h
drivers/s390/net/qeth_l3_main.c
drivers/s390/net/qeth_l3_sys.c

index 49f92eb..bdd45f4 100644 (file)
@@ -74,13 +74,15 @@ void qeth_l3_remove_device_attributes(struct device *);
 int qeth_l3_setrouting_v4(struct qeth_card *);
 int qeth_l3_setrouting_v6(struct qeth_card *);
 int qeth_l3_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *);
-void qeth_l3_del_ipato_entry(struct qeth_card *, enum qeth_prot_versions,
-                       u8 *, int);
+int qeth_l3_del_ipato_entry(struct qeth_card *card,
+                           enum qeth_prot_versions proto, u8 *addr,
+                           int mask_bits);
 int qeth_l3_add_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *);
-void qeth_l3_del_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *);
+int qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
+                    const u8 *addr);
 int qeth_l3_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);
-void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions,
-                       const u8 *);
+int qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
+                    const u8 *addr);
 void qeth_l3_update_ipato(struct qeth_card *card);
 struct qeth_ipaddr *qeth_l3_get_addr_buffer(enum qeth_prot_versions);
 int qeth_l3_add_ip(struct qeth_card *, struct qeth_ipaddr *);
index 92bcb02..b0c888e 100644 (file)
@@ -588,10 +588,12 @@ int qeth_l3_add_ipato_entry(struct qeth_card *card,
        return rc;
 }
 
-void qeth_l3_del_ipato_entry(struct qeth_card *card,
-               enum qeth_prot_versions proto, u8 *addr, int mask_bits)
+int qeth_l3_del_ipato_entry(struct qeth_card *card,
+                           enum qeth_prot_versions proto, u8 *addr,
+                           int mask_bits)
 {
        struct qeth_ipato_entry *ipatoe, *tmp;
+       int rc = -ENOENT;
 
        QETH_CARD_TEXT(card, 2, "delipato");
 
@@ -606,10 +608,12 @@ void qeth_l3_del_ipato_entry(struct qeth_card *card,
                        list_del(&ipatoe->entry);
                        qeth_l3_update_ipato(card);
                        kfree(ipatoe);
+                       rc = 0;
                }
        }
 
        spin_unlock_bh(&card->ip_lock);
+       return rc;
 }
 
 /*
@@ -619,7 +623,7 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
              const u8 *addr)
 {
        struct qeth_ipaddr *ipaddr;
-       int rc = 0;
+       int rc;
 
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
@@ -643,7 +647,7 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
        if (qeth_l3_ip_from_hash(card, ipaddr))
                rc = -EEXIST;
        else
-               qeth_l3_add_ip(card, ipaddr);
+               rc = qeth_l3_add_ip(card, ipaddr);
 
        spin_unlock_bh(&card->ip_lock);
 
@@ -652,10 +656,11 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
        return rc;
 }
 
-void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
-             const u8 *addr)
+int qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
+                    const u8 *addr)
 {
        struct qeth_ipaddr *ipaddr;
+       int rc;
 
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
@@ -670,13 +675,14 @@ void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
                }
                ipaddr->type = QETH_IP_TYPE_VIPA;
        } else
-               return;
+               return -ENOMEM;
 
        spin_lock_bh(&card->ip_lock);
-       qeth_l3_delete_ip(card, ipaddr);
+       rc = qeth_l3_delete_ip(card, ipaddr);
        spin_unlock_bh(&card->ip_lock);
 
        kfree(ipaddr);
+       return rc;
 }
 
 /*
@@ -686,7 +692,7 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
              const u8 *addr)
 {
        struct qeth_ipaddr *ipaddr;
-       int rc = 0;
+       int rc;
 
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
@@ -711,7 +717,7 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
        if (qeth_l3_ip_from_hash(card, ipaddr))
                rc = -EEXIST;
        else
-               qeth_l3_add_ip(card, ipaddr);
+               rc = qeth_l3_add_ip(card, ipaddr);
 
        spin_unlock_bh(&card->ip_lock);
 
@@ -720,10 +726,11 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
        return rc;
 }
 
-void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
-                       const u8 *addr)
+int qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
+                    const u8 *addr)
 {
        struct qeth_ipaddr *ipaddr;
+       int rc;
 
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
@@ -738,13 +745,14 @@ void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
                }
                ipaddr->type = QETH_IP_TYPE_RXIP;
        } else
-               return;
+               return -ENOMEM;
 
        spin_lock_bh(&card->ip_lock);
-       qeth_l3_delete_ip(card, ipaddr);
+       rc = qeth_l3_delete_ip(card, ipaddr);
        spin_unlock_bh(&card->ip_lock);
 
        kfree(ipaddr);
+       return rc;
 }
 
 static int qeth_l3_register_addr_entry(struct qeth_card *card,
index 00a10b6..f8e74b3 100644 (file)
@@ -274,7 +274,7 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
        struct qeth_card *card = dev_get_drvdata(dev);
        struct qeth_ipaddr *addr;
        char *tmp;
-       int i;
+       int rc, i;
 
        if (!card)
                return -EINVAL;
@@ -343,11 +343,11 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
                return -ENOMEM;
 
        spin_lock_bh(&card->ip_lock);
-       qeth_l3_add_ip(card, addr);
+       rc = qeth_l3_add_ip(card, addr);
        spin_unlock_bh(&card->ip_lock);
        kfree(addr);
 
-       return count;
+       return rc ? rc : count;
 }
 
 static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
@@ -585,7 +585,7 @@ static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count,
        mutex_lock(&card->conf_mutex);
        rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
        if (!rc)
-               qeth_l3_del_ipato_entry(card, proto, addr, mask_bits);
+               rc = qeth_l3_del_ipato_entry(card, proto, addr, mask_bits);
        mutex_unlock(&card->conf_mutex);
        return rc ? rc : count;
 }
@@ -796,7 +796,7 @@ static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t count,
        mutex_lock(&card->conf_mutex);
        rc = qeth_l3_parse_vipae(buf, proto, addr);
        if (!rc)
-               qeth_l3_del_vipa(card, proto, addr);
+               rc = qeth_l3_del_vipa(card, proto, addr);
        mutex_unlock(&card->conf_mutex);
        return rc ? rc : count;
 }
@@ -976,7 +976,7 @@ static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t count,
        mutex_lock(&card->conf_mutex);
        rc = qeth_l3_parse_rxipe(buf, proto, addr);
        if (!rc)
-               qeth_l3_del_rxip(card, proto, addr);
+               rc = qeth_l3_del_rxip(card, proto, addr);
        mutex_unlock(&card->conf_mutex);
        return rc ? rc : count;
 }