aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding/bond_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r--drivers/net/bonding/bond_main.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 7bd068a6056a..171b10f167a5 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1746,6 +1746,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1746 1746
1747 bond_compute_features(bond); 1747 bond_compute_features(bond);
1748 1748
1749 bond_update_speed_duplex(new_slave);
1750
1749 read_lock(&bond->lock); 1751 read_lock(&bond->lock);
1750 1752
1751 new_slave->last_arp_rx = jiffies - 1753 new_slave->last_arp_rx = jiffies -
@@ -1798,8 +1800,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1798 new_slave->link == BOND_LINK_DOWN ? "DOWN" : 1800 new_slave->link == BOND_LINK_DOWN ? "DOWN" :
1799 (new_slave->link == BOND_LINK_UP ? "UP" : "BACK")); 1801 (new_slave->link == BOND_LINK_UP ? "UP" : "BACK"));
1800 1802
1801 bond_update_speed_duplex(new_slave);
1802
1803 if (USES_PRIMARY(bond->params.mode) && bond->params.primary[0]) { 1803 if (USES_PRIMARY(bond->params.mode) && bond->params.primary[0]) {
1804 /* if there is a primary slave, remember it */ 1804 /* if there is a primary slave, remember it */
1805 if (strcmp(bond->params.primary, new_slave->dev->name) == 0) { 1805 if (strcmp(bond->params.primary, new_slave->dev->name) == 0) {
@@ -1964,7 +1964,6 @@ static int __bond_release_one(struct net_device *bond_dev,
1964 } 1964 }
1965 1965
1966 block_netpoll_tx(); 1966 block_netpoll_tx();
1967 call_netdevice_notifiers(NETDEV_RELEASE, bond_dev);
1968 write_lock_bh(&bond->lock); 1967 write_lock_bh(&bond->lock);
1969 1968
1970 slave = bond_get_slave_by_dev(bond, slave_dev); 1969 slave = bond_get_slave_by_dev(bond, slave_dev);
@@ -1977,12 +1976,11 @@ static int __bond_release_one(struct net_device *bond_dev,
1977 return -EINVAL; 1976 return -EINVAL;
1978 } 1977 }
1979 1978
1979 write_unlock_bh(&bond->lock);
1980 /* unregister rx_handler early so bond_handle_frame wouldn't be called 1980 /* unregister rx_handler early so bond_handle_frame wouldn't be called
1981 * for this slave anymore. 1981 * for this slave anymore.
1982 */ 1982 */
1983 netdev_rx_handler_unregister(slave_dev); 1983 netdev_rx_handler_unregister(slave_dev);
1984 write_unlock_bh(&bond->lock);
1985 synchronize_net();
1986 write_lock_bh(&bond->lock); 1984 write_lock_bh(&bond->lock);
1987 1985
1988 if (!all && !bond->params.fail_over_mac) { 1986 if (!all && !bond->params.fail_over_mac) {
@@ -2066,8 +2064,10 @@ static int __bond_release_one(struct net_device *bond_dev,
2066 write_unlock_bh(&bond->lock); 2064 write_unlock_bh(&bond->lock);
2067 unblock_netpoll_tx(); 2065 unblock_netpoll_tx();
2068 2066
2069 if (bond->slave_cnt == 0) 2067 if (bond->slave_cnt == 0) {
2070 call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev); 2068 call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev);
2069 call_netdevice_notifiers(NETDEV_RELEASE, bond->dev);
2070 }
2071 2071
2072 bond_compute_features(bond); 2072 bond_compute_features(bond);
2073 if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && 2073 if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) &&
@@ -2373,8 +2373,6 @@ static void bond_miimon_commit(struct bonding *bond)
2373 bond_set_backup_slave(slave); 2373 bond_set_backup_slave(slave);
2374 } 2374 }
2375 2375
2376 bond_update_speed_duplex(slave);
2377
2378 pr_info("%s: link status definitely up for interface %s, %u Mbps %s duplex.\n", 2376 pr_info("%s: link status definitely up for interface %s, %u Mbps %s duplex.\n",
2379 bond->dev->name, slave->dev->name, 2377 bond->dev->name, slave->dev->name,
2380 slave->speed, slave->duplex ? "full" : "half"); 2378 slave->speed, slave->duplex ? "full" : "half");
@@ -4904,8 +4902,8 @@ static void __exit bonding_exit(void)
4904 4902
4905 bond_destroy_debugfs(); 4903 bond_destroy_debugfs();
4906 4904
4907 rtnl_link_unregister(&bond_link_ops);
4908 unregister_pernet_subsys(&bond_net_ops); 4905 unregister_pernet_subsys(&bond_net_ops);
4906 rtnl_link_unregister(&bond_link_ops);
4909 4907
4910#ifdef CONFIG_NET_POLL_CONTROLLER 4908#ifdef CONFIG_NET_POLL_CONTROLLER
4911 /* 4909 /*