Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -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 *);
+22 −14
Original line number Diff line number Diff line
@@ -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,
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,
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,
+6 −6
Original line number Diff line number Diff line
@@ -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;
}