qeth: avoid duplicate deletion of multicast addresses
if qeth_set_multicast_list() is performed on 2 CPUs in parallel, card->ip_list may end corrupted. Solution: In function __qeth_delete_all_mc() remove card->ip_list entry before invoking qeth_deregister_addr_entry(). Thus a 2nd invocation of qeth_set_multicast_list() cannot try to remove the same entry twice. Signed-off-by Ursula Braun <braunu@de.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
6570ebc4f5
commit
d8fae9c2f2
@ -823,14 +823,15 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
|
|||||||
again:
|
again:
|
||||||
list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
|
list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
|
||||||
if (addr->is_multicast) {
|
if (addr->is_multicast) {
|
||||||
|
list_del(&addr->entry);
|
||||||
spin_unlock_irqrestore(&card->ip_lock, *flags);
|
spin_unlock_irqrestore(&card->ip_lock, *flags);
|
||||||
rc = qeth_deregister_addr_entry(card, addr);
|
rc = qeth_deregister_addr_entry(card, addr);
|
||||||
spin_lock_irqsave(&card->ip_lock, *flags);
|
spin_lock_irqsave(&card->ip_lock, *flags);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
list_del(&addr->entry);
|
|
||||||
kfree(addr);
|
kfree(addr);
|
||||||
goto again;
|
goto again;
|
||||||
}
|
} else
|
||||||
|
list_add(&addr->entry, &card->ip_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user