Commit b9ea5250 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: improve error reporting on IP add/removal

When adding & removing IP entries for rxip/vipa/ipato/hsuid, forward any
resulting errors back to the sysfs-level caller.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e0b10844
...@@ -74,13 +74,15 @@ void qeth_l3_remove_device_attributes(struct device *); ...@@ -74,13 +74,15 @@ void qeth_l3_remove_device_attributes(struct device *);
int qeth_l3_setrouting_v4(struct qeth_card *); int qeth_l3_setrouting_v4(struct qeth_card *);
int qeth_l3_setrouting_v6(struct qeth_card *); int qeth_l3_setrouting_v6(struct qeth_card *);
int qeth_l3_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *); 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, int qeth_l3_del_ipato_entry(struct qeth_card *card,
u8 *, int); enum qeth_prot_versions proto, u8 *addr,
int mask_bits);
int qeth_l3_add_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *); 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 *); 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, int qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
const u8 *); const u8 *addr);
void qeth_l3_update_ipato(struct qeth_card *card); void qeth_l3_update_ipato(struct qeth_card *card);
struct qeth_ipaddr *qeth_l3_get_addr_buffer(enum qeth_prot_versions); struct qeth_ipaddr *qeth_l3_get_addr_buffer(enum qeth_prot_versions);
int qeth_l3_add_ip(struct qeth_card *, struct qeth_ipaddr *); int qeth_l3_add_ip(struct qeth_card *, struct qeth_ipaddr *);
......
...@@ -588,10 +588,12 @@ int qeth_l3_add_ipato_entry(struct qeth_card *card, ...@@ -588,10 +588,12 @@ int qeth_l3_add_ipato_entry(struct qeth_card *card,
return rc; return rc;
} }
void qeth_l3_del_ipato_entry(struct qeth_card *card, int qeth_l3_del_ipato_entry(struct qeth_card *card,
enum qeth_prot_versions proto, u8 *addr, int mask_bits) enum qeth_prot_versions proto, u8 *addr,
int mask_bits)
{ {
struct qeth_ipato_entry *ipatoe, *tmp; struct qeth_ipato_entry *ipatoe, *tmp;
int rc = -ENOENT;
QETH_CARD_TEXT(card, 2, "delipato"); QETH_CARD_TEXT(card, 2, "delipato");
...@@ -606,10 +608,12 @@ void qeth_l3_del_ipato_entry(struct qeth_card *card, ...@@ -606,10 +608,12 @@ void qeth_l3_del_ipato_entry(struct qeth_card *card,
list_del(&ipatoe->entry); list_del(&ipatoe->entry);
qeth_l3_update_ipato(card); qeth_l3_update_ipato(card);
kfree(ipatoe); kfree(ipatoe);
rc = 0;
} }
} }
spin_unlock_bh(&card->ip_lock); 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, ...@@ -619,7 +623,7 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
const u8 *addr) const u8 *addr)
{ {
struct qeth_ipaddr *ipaddr; struct qeth_ipaddr *ipaddr;
int rc = 0; int rc;
ipaddr = qeth_l3_get_addr_buffer(proto); ipaddr = qeth_l3_get_addr_buffer(proto);
if (ipaddr) { if (ipaddr) {
...@@ -643,7 +647,7 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -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)) if (qeth_l3_ip_from_hash(card, ipaddr))
rc = -EEXIST; rc = -EEXIST;
else else
qeth_l3_add_ip(card, ipaddr); rc = qeth_l3_add_ip(card, ipaddr);
spin_unlock_bh(&card->ip_lock); spin_unlock_bh(&card->ip_lock);
...@@ -652,10 +656,11 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -652,10 +656,11 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
return rc; return rc;
} }
void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto, int qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
const u8 *addr) const u8 *addr)
{ {
struct qeth_ipaddr *ipaddr; struct qeth_ipaddr *ipaddr;
int rc;
ipaddr = qeth_l3_get_addr_buffer(proto); ipaddr = qeth_l3_get_addr_buffer(proto);
if (ipaddr) { if (ipaddr) {
...@@ -670,13 +675,14 @@ void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -670,13 +675,14 @@ void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
} }
ipaddr->type = QETH_IP_TYPE_VIPA; ipaddr->type = QETH_IP_TYPE_VIPA;
} else } else
return; return -ENOMEM;
spin_lock_bh(&card->ip_lock); 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); spin_unlock_bh(&card->ip_lock);
kfree(ipaddr); kfree(ipaddr);
return rc;
} }
/* /*
...@@ -686,7 +692,7 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -686,7 +692,7 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
const u8 *addr) const u8 *addr)
{ {
struct qeth_ipaddr *ipaddr; struct qeth_ipaddr *ipaddr;
int rc = 0; int rc;
ipaddr = qeth_l3_get_addr_buffer(proto); ipaddr = qeth_l3_get_addr_buffer(proto);
if (ipaddr) { if (ipaddr) {
...@@ -711,7 +717,7 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -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)) if (qeth_l3_ip_from_hash(card, ipaddr))
rc = -EEXIST; rc = -EEXIST;
else else
qeth_l3_add_ip(card, ipaddr); rc = qeth_l3_add_ip(card, ipaddr);
spin_unlock_bh(&card->ip_lock); spin_unlock_bh(&card->ip_lock);
...@@ -720,10 +726,11 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -720,10 +726,11 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
return rc; return rc;
} }
void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto, int qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
const u8 *addr) const u8 *addr)
{ {
struct qeth_ipaddr *ipaddr; struct qeth_ipaddr *ipaddr;
int rc;
ipaddr = qeth_l3_get_addr_buffer(proto); ipaddr = qeth_l3_get_addr_buffer(proto);
if (ipaddr) { if (ipaddr) {
...@@ -738,13 +745,14 @@ void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto, ...@@ -738,13 +745,14 @@ void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
} }
ipaddr->type = QETH_IP_TYPE_RXIP; ipaddr->type = QETH_IP_TYPE_RXIP;
} else } else
return; return -ENOMEM;
spin_lock_bh(&card->ip_lock); 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); spin_unlock_bh(&card->ip_lock);
kfree(ipaddr); kfree(ipaddr);
return rc;
} }
static int qeth_l3_register_addr_entry(struct qeth_card *card, static int qeth_l3_register_addr_entry(struct qeth_card *card,
......
...@@ -274,7 +274,7 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev, ...@@ -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_card *card = dev_get_drvdata(dev);
struct qeth_ipaddr *addr; struct qeth_ipaddr *addr;
char *tmp; char *tmp;
int i; int rc, i;
if (!card) if (!card)
return -EINVAL; return -EINVAL;
...@@ -343,11 +343,11 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev, ...@@ -343,11 +343,11 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
return -ENOMEM; return -ENOMEM;
spin_lock_bh(&card->ip_lock); 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); spin_unlock_bh(&card->ip_lock);
kfree(addr); kfree(addr);
return count; return rc ? rc : count;
} }
static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show, 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, ...@@ -585,7 +585,7 @@ static ssize_t qeth_l3_dev_ipato_del_store(const char *buf, size_t count,
mutex_lock(&card->conf_mutex); mutex_lock(&card->conf_mutex);
rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits); rc = qeth_l3_parse_ipatoe(buf, proto, addr, &mask_bits);
if (!rc) 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); mutex_unlock(&card->conf_mutex);
return rc ? rc : count; return rc ? rc : count;
} }
...@@ -796,7 +796,7 @@ static ssize_t qeth_l3_dev_vipa_del_store(const char *buf, size_t 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); mutex_lock(&card->conf_mutex);
rc = qeth_l3_parse_vipae(buf, proto, addr); rc = qeth_l3_parse_vipae(buf, proto, addr);
if (!rc) if (!rc)
qeth_l3_del_vipa(card, proto, addr); rc = qeth_l3_del_vipa(card, proto, addr);
mutex_unlock(&card->conf_mutex); mutex_unlock(&card->conf_mutex);
return rc ? rc : count; return rc ? rc : count;
} }
...@@ -976,7 +976,7 @@ static ssize_t qeth_l3_dev_rxip_del_store(const char *buf, size_t 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); mutex_lock(&card->conf_mutex);
rc = qeth_l3_parse_rxipe(buf, proto, addr); rc = qeth_l3_parse_rxipe(buf, proto, addr);
if (!rc) if (!rc)
qeth_l3_del_rxip(card, proto, addr); rc = qeth_l3_del_rxip(card, proto, addr);
mutex_unlock(&card->conf_mutex); mutex_unlock(&card->conf_mutex);
return rc ? rc : count; return rc ? rc : count;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment