diff options
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 16 |
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 | /* |
