bonding: Change active slave quietly when bond is down
bond_change_active_slave() may be called when a slave is added, even if the bond has not been brought up yet. It may then attempt to send packets, and further it may use mcast_work which is uninitialised before the bond is brought up. Add the necessary checks for netif_running(bond->dev). Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
8387451e55
commit
ffa95ed50f
@@ -1178,11 +1178,13 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||||||
bond_do_fail_over_mac(bond, new_active,
|
bond_do_fail_over_mac(bond, new_active,
|
||||||
old_active);
|
old_active);
|
||||||
|
|
||||||
bond->send_grat_arp = bond->params.num_grat_arp;
|
if (netif_running(bond->dev)) {
|
||||||
bond_send_gratuitous_arp(bond);
|
bond->send_grat_arp = bond->params.num_grat_arp;
|
||||||
|
bond_send_gratuitous_arp(bond);
|
||||||
|
|
||||||
bond->send_unsol_na = bond->params.num_unsol_na;
|
bond->send_unsol_na = bond->params.num_unsol_na;
|
||||||
bond_send_unsolicited_na(bond);
|
bond_send_unsolicited_na(bond);
|
||||||
|
}
|
||||||
|
|
||||||
write_unlock_bh(&bond->curr_slave_lock);
|
write_unlock_bh(&bond->curr_slave_lock);
|
||||||
read_unlock(&bond->lock);
|
read_unlock(&bond->lock);
|
||||||
@@ -1196,8 +1198,9 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||||||
|
|
||||||
/* resend IGMP joins since active slave has changed or
|
/* resend IGMP joins since active slave has changed or
|
||||||
* all were sent on curr_active_slave */
|
* all were sent on curr_active_slave */
|
||||||
if ((USES_PRIMARY(bond->params.mode) && new_active) ||
|
if (((USES_PRIMARY(bond->params.mode) && new_active) ||
|
||||||
bond->params.mode == BOND_MODE_ROUNDROBIN) {
|
bond->params.mode == BOND_MODE_ROUNDROBIN) &&
|
||||||
|
netif_running(bond->dev)) {
|
||||||
bond->igmp_retrans = bond->params.resend_igmp;
|
bond->igmp_retrans = bond->params.resend_igmp;
|
||||||
queue_delayed_work(bond->wq, &bond->mcast_work, 0);
|
queue_delayed_work(bond->wq, &bond->mcast_work, 0);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user