bonding: fix double dev_add_pack
Bonding can erroneously register the same packet_type to receive ARPs (for use by ARP validation): once at device open time, and once via sysfs. Since sysfs can change the validate setting (and thus register or unregister) at any time, a flag is needed to synchronize with device open in order to avoid double registrations, and the simplest place is within the packet_type structure itself. Double unregister is not an issue. Bug reported by Ulrich Oelmann <ulrich.oelmann@web.de>. Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
Jeff Garzik
parent
c3442e2965
commit
c4f283b1f2
@@ -3423,6 +3423,9 @@ void bond_register_arp(struct bonding *bond)
|
|||||||
{
|
{
|
||||||
struct packet_type *pt = &bond->arp_mon_pt;
|
struct packet_type *pt = &bond->arp_mon_pt;
|
||||||
|
|
||||||
|
if (pt->type)
|
||||||
|
return;
|
||||||
|
|
||||||
pt->type = htons(ETH_P_ARP);
|
pt->type = htons(ETH_P_ARP);
|
||||||
pt->dev = NULL; /*bond->dev;XXX*/
|
pt->dev = NULL; /*bond->dev;XXX*/
|
||||||
pt->func = bond_arp_rcv;
|
pt->func = bond_arp_rcv;
|
||||||
@@ -3431,7 +3434,10 @@ void bond_register_arp(struct bonding *bond)
|
|||||||
|
|
||||||
void bond_unregister_arp(struct bonding *bond)
|
void bond_unregister_arp(struct bonding *bond)
|
||||||
{
|
{
|
||||||
dev_remove_pack(&bond->arp_mon_pt);
|
struct packet_type *pt = &bond->arp_mon_pt;
|
||||||
|
|
||||||
|
dev_remove_pack(pt);
|
||||||
|
pt->type = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------- Hashing Policies -----------------------------*/
|
/*---------------------------- Hashing Policies -----------------------------*/
|
||||||
|
Reference in New Issue
Block a user