netdev: Add netdev->addr_list_lock protection.
[linux-2.6.git] / drivers / net / bonding / bond_main.c
index 8ae7ff3..ea71abd 100644 (file)
@@ -1568,10 +1568,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
                }
 
                netif_tx_lock_bh(bond_dev);
+               netif_addr_lock(bond_dev);
                /* upload master's mc_list to new slave */
                for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) {
                        dev_mc_add (slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
                }
+               netif_addr_unlock(bond_dev);
                netif_tx_unlock_bh(bond_dev);
        }
 
@@ -1937,7 +1939,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
 
                /* flush master's mc_list from slave */
                netif_tx_lock_bh(bond_dev);
+               netif_addr_lock(bond_dev);
                bond_mc_list_flush(bond_dev, slave_dev);
+               netif_addr_unlock(bond_dev);
                netif_tx_unlock_bh(bond_dev);
        }
 
@@ -2060,7 +2064,9 @@ static int bond_release_all(struct net_device *bond_dev)
 
                        /* flush master's mc_list from slave */
                        netif_tx_lock_bh(bond_dev);
+                       netif_addr_lock(bond_dev);
                        bond_mc_list_flush(bond_dev, slave_dev);
+                       netif_addr_unlock(bond_dev);
                        netif_tx_unlock_bh(bond_dev);
                }
 
@@ -4674,7 +4680,9 @@ static void bond_free_all(void)
 
                bond_work_cancel_all(bond);
                netif_tx_lock_bh(bond_dev);
+               netif_addr_lock(bond_dev);
                bond_mc_list_destroy(bond);
+               netif_addr_unlock(bond_dev);
                netif_tx_unlock_bh(bond_dev);
                /* Release the bonded slaves */
                bond_release_all(bond_dev);