diff options
author | David S. Miller <davem@davemloft.net> | 2011-12-02 13:49:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-02 13:49:21 -0500 |
commit | b3613118eb30a589d971e4eccbbb2a1314f5dfd4 (patch) | |
tree | 868c1ee59e1b5c19a4f2e43716400d0001a994e5 /drivers/net/bonding | |
parent | 7505afe28c16a8d386624930a018d0052c75d687 (diff) | |
parent | 5983fe2b29df5885880d7fa3b91aca306c7564ef (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 33 |
1 files changed, 6 insertions, 27 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 25a44d94be17..3216c514fdc8 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2554,30 +2554,6 @@ re_arm: | |||
2554 | } | 2554 | } |
2555 | } | 2555 | } |
2556 | 2556 | ||
2557 | static __be32 bond_glean_dev_ip(struct net_device *dev) | ||
2558 | { | ||
2559 | struct in_device *idev; | ||
2560 | struct in_ifaddr *ifa; | ||
2561 | __be32 addr = 0; | ||
2562 | |||
2563 | if (!dev) | ||
2564 | return 0; | ||
2565 | |||
2566 | rcu_read_lock(); | ||
2567 | idev = __in_dev_get_rcu(dev); | ||
2568 | if (!idev) | ||
2569 | goto out; | ||
2570 | |||
2571 | ifa = idev->ifa_list; | ||
2572 | if (!ifa) | ||
2573 | goto out; | ||
2574 | |||
2575 | addr = ifa->ifa_local; | ||
2576 | out: | ||
2577 | rcu_read_unlock(); | ||
2578 | return addr; | ||
2579 | } | ||
2580 | |||
2581 | static int bond_has_this_ip(struct bonding *bond, __be32 ip) | 2557 | static int bond_has_this_ip(struct bonding *bond, __be32 ip) |
2582 | { | 2558 | { |
2583 | struct vlan_entry *vlan; | 2559 | struct vlan_entry *vlan; |
@@ -3323,6 +3299,10 @@ static int bond_inetaddr_event(struct notifier_block *this, unsigned long event, | |||
3323 | struct bonding *bond; | 3299 | struct bonding *bond; |
3324 | struct vlan_entry *vlan; | 3300 | struct vlan_entry *vlan; |
3325 | 3301 | ||
3302 | /* we only care about primary address */ | ||
3303 | if(ifa->ifa_flags & IFA_F_SECONDARY) | ||
3304 | return NOTIFY_DONE; | ||
3305 | |||
3326 | list_for_each_entry(bond, &bn->dev_list, bond_list) { | 3306 | list_for_each_entry(bond, &bn->dev_list, bond_list) { |
3327 | if (bond->dev == event_dev) { | 3307 | if (bond->dev == event_dev) { |
3328 | switch (event) { | 3308 | switch (event) { |
@@ -3330,7 +3310,7 @@ static int bond_inetaddr_event(struct notifier_block *this, unsigned long event, | |||
3330 | bond->master_ip = ifa->ifa_local; | 3310 | bond->master_ip = ifa->ifa_local; |
3331 | return NOTIFY_OK; | 3311 | return NOTIFY_OK; |
3332 | case NETDEV_DOWN: | 3312 | case NETDEV_DOWN: |
3333 | bond->master_ip = bond_glean_dev_ip(bond->dev); | 3313 | bond->master_ip = 0; |
3334 | return NOTIFY_OK; | 3314 | return NOTIFY_OK; |
3335 | default: | 3315 | default: |
3336 | return NOTIFY_DONE; | 3316 | return NOTIFY_DONE; |
@@ -3346,8 +3326,7 @@ static int bond_inetaddr_event(struct notifier_block *this, unsigned long event, | |||
3346 | vlan->vlan_ip = ifa->ifa_local; | 3326 | vlan->vlan_ip = ifa->ifa_local; |
3347 | return NOTIFY_OK; | 3327 | return NOTIFY_OK; |
3348 | case NETDEV_DOWN: | 3328 | case NETDEV_DOWN: |
3349 | vlan->vlan_ip = | 3329 | vlan->vlan_ip = 0; |
3350 | bond_glean_dev_ip(vlan_dev); | ||
3351 | return NOTIFY_OK; | 3330 | return NOTIFY_OK; |
3352 | default: | 3331 | default: |
3353 | return NOTIFY_DONE; | 3332 | return NOTIFY_DONE; |