diff options
-rw-r--r-- | drivers/net/bonding/bond_main.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 1d26d6700c1d..e1ccefce9a9d 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -625,6 +625,23 @@ static void bond_set_dev_addr(struct net_device *bond_dev, | |||
625 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); | 625 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); |
626 | } | 626 | } |
627 | 627 | ||
628 | static struct slave *bond_get_old_active(struct bonding *bond, | ||
629 | struct slave *new_active) | ||
630 | { | ||
631 | struct slave *slave; | ||
632 | struct list_head *iter; | ||
633 | |||
634 | bond_for_each_slave(bond, slave, iter) { | ||
635 | if (slave == new_active) | ||
636 | continue; | ||
637 | |||
638 | if (ether_addr_equal(bond->dev->dev_addr, slave->dev->dev_addr)) | ||
639 | return slave; | ||
640 | } | ||
641 | |||
642 | return NULL; | ||
643 | } | ||
644 | |||
628 | /* bond_do_fail_over_mac | 645 | /* bond_do_fail_over_mac |
629 | * | 646 | * |
630 | * Perform special MAC address swapping for fail_over_mac settings | 647 | * Perform special MAC address swapping for fail_over_mac settings |
@@ -652,6 +669,9 @@ static void bond_do_fail_over_mac(struct bonding *bond, | |||
652 | if (!new_active) | 669 | if (!new_active) |
653 | return; | 670 | return; |
654 | 671 | ||
672 | if (!old_active) | ||
673 | old_active = bond_get_old_active(bond, new_active); | ||
674 | |||
655 | if (old_active) { | 675 | if (old_active) { |
656 | ether_addr_copy(tmp_mac, new_active->dev->dev_addr); | 676 | ether_addr_copy(tmp_mac, new_active->dev->dev_addr); |
657 | ether_addr_copy(saddr.sa_data, | 677 | ether_addr_copy(saddr.sa_data, |