bonding: Acquire correct locks in alb for promisc change

Update ALB mode monitor to hold correct locks (RTNL and nothing
else) when calling dev_set_promiscuity.

Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Jay Vosburgh and committed by Jeff Garzik d0e81b7e 6603a6f2

+10 -9
+10 -9
drivers/net/bonding/bond_alb.c
··· 1455 1455 1456 1456 /* handle rlb stuff */ 1457 1457 if (bond_info->rlb_enabled) { 1458 - /* the following code changes the promiscuity of the 1459 - * the curr_active_slave. It needs to be locked with a 1460 - * write lock to protect from other code that also 1461 - * sets the promiscuity. 1462 - */ 1463 - write_lock_bh(&bond->curr_slave_lock); 1464 - 1465 1458 if (bond_info->primary_is_promisc && 1466 1459 (++bond_info->rlb_promisc_timeout_counter >= RLB_PROMISC_TIMEOUT)) { 1460 + 1461 + /* 1462 + * dev_set_promiscuity requires rtnl and 1463 + * nothing else. 1464 + */ 1465 + read_unlock(&bond->lock); 1466 + rtnl_lock(); 1467 1467 1468 1468 bond_info->rlb_promisc_timeout_counter = 0; 1469 1469 ··· 1473 1473 */ 1474 1474 dev_set_promiscuity(bond->curr_active_slave->dev, -1); 1475 1475 bond_info->primary_is_promisc = 0; 1476 - } 1477 1476 1478 - write_unlock_bh(&bond->curr_slave_lock); 1477 + rtnl_unlock(); 1478 + read_lock(&bond->lock); 1479 + } 1479 1480 1480 1481 if (bond_info->rlb_rebalance) { 1481 1482 bond_info->rlb_rebalance = 0;