diff options
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 94c9f68dd16b..6d00c3de1a83 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1653,7 +1653,8 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de | |||
1653 | int old_features = bond_dev->features; | 1653 | int old_features = bond_dev->features; |
1654 | int res = 0; | 1654 | int res = 0; |
1655 | 1655 | ||
1656 | if (slave_dev->do_ioctl == NULL) { | 1656 | if (!bond->params.use_carrier && slave_dev->ethtool_ops == NULL && |
1657 | slave_dev->do_ioctl == NULL) { | ||
1657 | printk(KERN_WARNING DRV_NAME | 1658 | printk(KERN_WARNING DRV_NAME |
1658 | ": Warning : no link monitoring support for %s\n", | 1659 | ": Warning : no link monitoring support for %s\n", |
1659 | slave_dev->name); | 1660 | slave_dev->name); |
@@ -2879,6 +2880,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2879 | * This target is not on a VLAN | 2880 | * This target is not on a VLAN |
2880 | */ | 2881 | */ |
2881 | if (rt->u.dst.dev == bond->dev) { | 2882 | if (rt->u.dst.dev == bond->dev) { |
2883 | ip_rt_put(rt); | ||
2882 | dprintk("basa: rtdev == bond->dev: arp_send\n"); | 2884 | dprintk("basa: rtdev == bond->dev: arp_send\n"); |
2883 | bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i], | 2885 | bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i], |
2884 | bond->master_ip, 0); | 2886 | bond->master_ip, 0); |
@@ -2898,6 +2900,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2898 | } | 2900 | } |
2899 | 2901 | ||
2900 | if (vlan_id) { | 2902 | if (vlan_id) { |
2903 | ip_rt_put(rt); | ||
2901 | bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i], | 2904 | bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i], |
2902 | vlan->vlan_ip, vlan_id); | 2905 | vlan->vlan_ip, vlan_id); |
2903 | continue; | 2906 | continue; |
@@ -2909,6 +2912,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2909 | bond->dev->name, NIPQUAD(fl.fl4_dst), | 2912 | bond->dev->name, NIPQUAD(fl.fl4_dst), |
2910 | rt->u.dst.dev ? rt->u.dst.dev->name : "NULL"); | 2913 | rt->u.dst.dev ? rt->u.dst.dev->name : "NULL"); |
2911 | } | 2914 | } |
2915 | ip_rt_put(rt); | ||
2912 | } | 2916 | } |
2913 | } | 2917 | } |
2914 | 2918 | ||
@@ -5036,6 +5040,14 @@ static int __init bonding_init(void) | |||
5036 | return 0; | 5040 | return 0; |
5037 | 5041 | ||
5038 | out_err: | 5042 | out_err: |
5043 | /* | ||
5044 | * rtnl_unlock() will run netdev_run_todo(), putting the | ||
5045 | * thus-far-registered bonding devices into a state which | ||
5046 | * unregigister_netdevice() will accept | ||
5047 | */ | ||
5048 | rtnl_unlock(); | ||
5049 | rtnl_lock(); | ||
5050 | |||
5039 | /* free and unregister all bonds that were successfully added */ | 5051 | /* free and unregister all bonds that were successfully added */ |
5040 | bond_free_all(); | 5052 | bond_free_all(); |
5041 | 5053 | ||