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

Commit ffa95ed5 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

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: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarJay Vosburgh <fubar@us.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8387451e
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -1178,11 +1178,13 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
				bond_do_fail_over_mac(bond, new_active,
						      old_active);

			if (netif_running(bond->dev)) {
				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_unsolicited_na(bond);
			}

			write_unlock_bh(&bond->curr_slave_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
	 * all were sent on curr_active_slave */
	if ((USES_PRIMARY(bond->params.mode) && new_active) ||
	    bond->params.mode == BOND_MODE_ROUNDROBIN) {
	if (((USES_PRIMARY(bond->params.mode) && new_active) ||
	     bond->params.mode == BOND_MODE_ROUNDROBIN) &&
	    netif_running(bond->dev)) {
		bond->igmp_retrans = bond->params.resend_igmp;
		queue_delayed_work(bond->wq, &bond->mcast_work, 0);
	}