diff options
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 64 | ||||
| -rw-r--r-- | include/net/bonding.h | 5 |
2 files changed, 43 insertions, 26 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index c9e519cb9214..92fe3a1bf52b 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -790,7 +790,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active) | |||
| 790 | } | 790 | } |
| 791 | 791 | ||
| 792 | new_active->delay = 0; | 792 | new_active->delay = 0; |
| 793 | new_active->link = BOND_LINK_UP; | 793 | bond_set_slave_link_state(new_active, BOND_LINK_UP); |
| 794 | 794 | ||
| 795 | if (BOND_MODE(bond) == BOND_MODE_8023AD) | 795 | if (BOND_MODE(bond) == BOND_MODE_8023AD) |
| 796 | bond_3ad_handle_link_change(new_active, BOND_LINK_UP); | 796 | bond_3ad_handle_link_change(new_active, BOND_LINK_UP); |
| @@ -1181,6 +1181,21 @@ static void bond_free_slave(struct slave *slave) | |||
| 1181 | kfree(slave); | 1181 | kfree(slave); |
| 1182 | } | 1182 | } |
| 1183 | 1183 | ||
| 1184 | static void bond_fill_ifbond(struct bonding *bond, struct ifbond *info) | ||
| 1185 | { | ||
| 1186 | info->bond_mode = BOND_MODE(bond); | ||
| 1187 | info->miimon = bond->params.miimon; | ||
| 1188 | info->num_slaves = bond->slave_cnt; | ||
| 1189 | } | ||
| 1190 | |||
| 1191 | static void bond_fill_ifslave(struct slave *slave, struct ifslave *info) | ||
| 1192 | { | ||
| 1193 | strcpy(info->slave_name, slave->dev->name); | ||
| 1194 | info->link = slave->link; | ||
| 1195 | info->state = bond_slave_state(slave); | ||
| 1196 | info->link_failure_count = slave->link_failure_count; | ||
| 1197 | } | ||
| 1198 | |||
| 1184 | /* enslave device <slave> to bond device <master> */ | 1199 | /* enslave device <slave> to bond device <master> */ |
| 1185 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | 1200 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) |
| 1186 | { | 1201 | { |
| @@ -1444,19 +1459,22 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 1444 | if (bond->params.miimon) { | 1459 | if (bond->params.miimon) { |
| 1445 | if (bond_check_dev_link(bond, slave_dev, 0) == BMSR_LSTATUS) { | 1460 | if (bond_check_dev_link(bond, slave_dev, 0) == BMSR_LSTATUS) { |
| 1446 | if (bond->params.updelay) { | 1461 | if (bond->params.updelay) { |
| 1447 | new_slave->link = BOND_LINK_BACK; | 1462 | bond_set_slave_link_state(new_slave, |
| 1463 | BOND_LINK_BACK); | ||
| 1448 | new_slave->delay = bond->params.updelay; | 1464 | new_slave->delay = bond->params.updelay; |
| 1449 | } else { | 1465 | } else { |
| 1450 | new_slave->link = BOND_LINK_UP; | 1466 | bond_set_slave_link_state(new_slave, |
| 1467 | BOND_LINK_UP); | ||
| 1451 | } | 1468 | } |
| 1452 | } else { | 1469 | } else { |
| 1453 | new_slave->link = BOND_LINK_DOWN; | 1470 | bond_set_slave_link_state(new_slave, BOND_LINK_DOWN); |
| 1454 | } | 1471 | } |
| 1455 | } else if (bond->params.arp_interval) { | 1472 | } else if (bond->params.arp_interval) { |
| 1456 | new_slave->link = (netif_carrier_ok(slave_dev) ? | 1473 | bond_set_slave_link_state(new_slave, |
| 1457 | BOND_LINK_UP : BOND_LINK_DOWN); | 1474 | (netif_carrier_ok(slave_dev) ? |
| 1475 | BOND_LINK_UP : BOND_LINK_DOWN)); | ||
| 1458 | } else { | 1476 | } else { |
| 1459 | new_slave->link = BOND_LINK_UP; | 1477 | bond_set_slave_link_state(new_slave, BOND_LINK_UP); |
| 1460 | } | 1478 | } |
| 1461 | 1479 | ||
| 1462 | if (new_slave->link != BOND_LINK_DOWN) | 1480 | if (new_slave->link != BOND_LINK_DOWN) |
| @@ -1821,11 +1839,7 @@ static int bond_release_and_destroy(struct net_device *bond_dev, | |||
| 1821 | static int bond_info_query(struct net_device *bond_dev, struct ifbond *info) | 1839 | static int bond_info_query(struct net_device *bond_dev, struct ifbond *info) |
| 1822 | { | 1840 | { |
| 1823 | struct bonding *bond = netdev_priv(bond_dev); | 1841 | struct bonding *bond = netdev_priv(bond_dev); |
| 1824 | 1842 | bond_fill_ifbond(bond, info); | |
| 1825 | info->bond_mode = BOND_MODE(bond); | ||
| 1826 | info->miimon = bond->params.miimon; | ||
| 1827 | info->num_slaves = bond->slave_cnt; | ||
| 1828 | |||
| 1829 | return 0; | 1843 | return 0; |
| 1830 | } | 1844 | } |
| 1831 | 1845 | ||
| @@ -1839,10 +1853,7 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in | |||
| 1839 | bond_for_each_slave(bond, slave, iter) { | 1853 | bond_for_each_slave(bond, slave, iter) { |
| 1840 | if (i++ == (int)info->slave_id) { | 1854 | if (i++ == (int)info->slave_id) { |
| 1841 | res = 0; | 1855 | res = 0; |
| 1842 | strcpy(info->slave_name, slave->dev->name); | 1856 | bond_fill_ifslave(slave, info); |
| 1843 | info->link = slave->link; | ||
| 1844 | info->state = bond_slave_state(slave); | ||
| 1845 | info->link_failure_count = slave->link_failure_count; | ||
| 1846 | break; | 1857 | break; |
| 1847 | } | 1858 | } |
| 1848 | } | 1859 | } |
| @@ -1872,7 +1883,7 @@ static int bond_miimon_inspect(struct bonding *bond) | |||
| 1872 | if (link_state) | 1883 | if (link_state) |
| 1873 | continue; | 1884 | continue; |
| 1874 | 1885 | ||
| 1875 | slave->link = BOND_LINK_FAIL; | 1886 | bond_set_slave_link_state(slave, BOND_LINK_FAIL); |
| 1876 | slave->delay = bond->params.downdelay; | 1887 | slave->delay = bond->params.downdelay; |
| 1877 | if (slave->delay) { | 1888 | if (slave->delay) { |
| 1878 | netdev_info(bond->dev, "link status down for %sinterface %s, disabling it in %d ms\n", | 1889 | netdev_info(bond->dev, "link status down for %sinterface %s, disabling it in %d ms\n", |
| @@ -1887,7 +1898,7 @@ static int bond_miimon_inspect(struct bonding *bond) | |||
| 1887 | case BOND_LINK_FAIL: | 1898 | case BOND_LINK_FAIL: |
| 1888 | if (link_state) { | 1899 | if (link_state) { |
| 1889 | /* recovered before downdelay expired */ | 1900 | /* recovered before downdelay expired */ |
| 1890 | slave->link = BOND_LINK_UP; | 1901 | bond_set_slave_link_state(slave, BOND_LINK_UP); |
| 1891 | slave->last_link_up = jiffies; | 1902 | slave->last_link_up = jiffies; |
| 1892 | netdev_info(bond->dev, "link status up again after %d ms for interface %s\n", | 1903 | netdev_info(bond->dev, "link status up again after %d ms for interface %s\n", |
| 1893 | (bond->params.downdelay - slave->delay) * | 1904 | (bond->params.downdelay - slave->delay) * |
| @@ -1909,7 +1920,7 @@ static int bond_miimon_inspect(struct bonding *bond) | |||
| 1909 | if (!link_state) | 1920 | if (!link_state) |
| 1910 | continue; | 1921 | continue; |
| 1911 | 1922 | ||
| 1912 | slave->link = BOND_LINK_BACK; | 1923 | bond_set_slave_link_state(slave, BOND_LINK_BACK); |
| 1913 | slave->delay = bond->params.updelay; | 1924 | slave->delay = bond->params.updelay; |
| 1914 | 1925 | ||
| 1915 | if (slave->delay) { | 1926 | if (slave->delay) { |
| @@ -1922,7 +1933,8 @@ static int bond_miimon_inspect(struct bonding *bond) | |||
| 1922 | /*FALLTHRU*/ | 1933 | /*FALLTHRU*/ |
| 1923 | case BOND_LINK_BACK: | 1934 | case BOND_LINK_BACK: |
| 1924 | if (!link_state) { | 1935 | if (!link_state) { |
| 1925 | slave->link = BOND_LINK_DOWN; | 1936 | bond_set_slave_link_state(slave, |
| 1937 | BOND_LINK_DOWN); | ||
| 1926 | netdev_info(bond->dev, "link status down again after %d ms for interface %s\n", | 1938 | netdev_info(bond->dev, "link status down again after %d ms for interface %s\n", |
| 1927 | (bond->params.updelay - slave->delay) * | 1939 | (bond->params.updelay - slave->delay) * |
| 1928 | bond->params.miimon, | 1940 | bond->params.miimon, |
| @@ -1960,7 +1972,7 @@ static void bond_miimon_commit(struct bonding *bond) | |||
| 1960 | continue; | 1972 | continue; |
| 1961 | 1973 | ||
| 1962 | case BOND_LINK_UP: | 1974 | case BOND_LINK_UP: |
| 1963 | slave->link = BOND_LINK_UP; | 1975 | bond_set_slave_link_state(slave, BOND_LINK_UP); |
| 1964 | slave->last_link_up = jiffies; | 1976 | slave->last_link_up = jiffies; |
| 1965 | 1977 | ||
| 1966 | primary = rtnl_dereference(bond->primary_slave); | 1978 | primary = rtnl_dereference(bond->primary_slave); |
| @@ -2000,7 +2012,7 @@ static void bond_miimon_commit(struct bonding *bond) | |||
| 2000 | if (slave->link_failure_count < UINT_MAX) | 2012 | if (slave->link_failure_count < UINT_MAX) |
| 2001 | slave->link_failure_count++; | 2013 | slave->link_failure_count++; |
| 2002 | 2014 | ||
| 2003 | slave->link = BOND_LINK_DOWN; | 2015 | bond_set_slave_link_state(slave, BOND_LINK_DOWN); |
| 2004 | 2016 | ||
| 2005 | if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP || | 2017 | if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP || |
| 2006 | BOND_MODE(bond) == BOND_MODE_8023AD) | 2018 | BOND_MODE(bond) == BOND_MODE_8023AD) |
| @@ -2583,7 +2595,7 @@ static void bond_ab_arp_commit(struct bonding *bond) | |||
| 2583 | struct slave *current_arp_slave; | 2595 | struct slave *current_arp_slave; |
| 2584 | 2596 | ||
| 2585 | current_arp_slave = rtnl_dereference(bond->current_arp_slave); | 2597 | current_arp_slave = rtnl_dereference(bond->current_arp_slave); |
| 2586 | slave->link = BOND_LINK_UP; | 2598 | bond_set_slave_link_state(slave, BOND_LINK_UP); |
| 2587 | if (current_arp_slave) { | 2599 | if (current_arp_slave) { |
| 2588 | bond_set_slave_inactive_flags( | 2600 | bond_set_slave_inactive_flags( |
| 2589 | current_arp_slave, | 2601 | current_arp_slave, |
| @@ -2606,7 +2618,7 @@ static void bond_ab_arp_commit(struct bonding *bond) | |||
| 2606 | if (slave->link_failure_count < UINT_MAX) | 2618 | if (slave->link_failure_count < UINT_MAX) |
| 2607 | slave->link_failure_count++; | 2619 | slave->link_failure_count++; |
| 2608 | 2620 | ||
| 2609 | slave->link = BOND_LINK_DOWN; | 2621 | bond_set_slave_link_state(slave, BOND_LINK_DOWN); |
| 2610 | bond_set_slave_inactive_flags(slave, | 2622 | bond_set_slave_inactive_flags(slave, |
| 2611 | BOND_SLAVE_NOTIFY_NOW); | 2623 | BOND_SLAVE_NOTIFY_NOW); |
| 2612 | 2624 | ||
| @@ -2685,7 +2697,7 @@ static bool bond_ab_arp_probe(struct bonding *bond) | |||
| 2685 | * up when it is actually down | 2697 | * up when it is actually down |
| 2686 | */ | 2698 | */ |
| 2687 | if (!bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) { | 2699 | if (!bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) { |
| 2688 | slave->link = BOND_LINK_DOWN; | 2700 | bond_set_slave_link_state(slave, BOND_LINK_DOWN); |
| 2689 | if (slave->link_failure_count < UINT_MAX) | 2701 | if (slave->link_failure_count < UINT_MAX) |
| 2690 | slave->link_failure_count++; | 2702 | slave->link_failure_count++; |
| 2691 | 2703 | ||
| @@ -2705,7 +2717,7 @@ static bool bond_ab_arp_probe(struct bonding *bond) | |||
| 2705 | if (!new_slave) | 2717 | if (!new_slave) |
| 2706 | goto check_state; | 2718 | goto check_state; |
| 2707 | 2719 | ||
| 2708 | new_slave->link = BOND_LINK_BACK; | 2720 | bond_set_slave_link_state(new_slave, BOND_LINK_BACK); |
| 2709 | bond_set_slave_active_flags(new_slave, BOND_SLAVE_NOTIFY_LATER); | 2721 | bond_set_slave_active_flags(new_slave, BOND_SLAVE_NOTIFY_LATER); |
| 2710 | bond_arp_send_all(bond, new_slave); | 2722 | bond_arp_send_all(bond, new_slave); |
| 2711 | new_slave->last_link_up = jiffies; | 2723 | new_slave->last_link_up = jiffies; |
diff --git a/include/net/bonding.h b/include/net/bonding.h index 29f53eacac0a..d1367ec74933 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h | |||
| @@ -490,6 +490,11 @@ static inline bool bond_is_slave_inactive(struct slave *slave) | |||
| 490 | return slave->inactive; | 490 | return slave->inactive; |
| 491 | } | 491 | } |
| 492 | 492 | ||
| 493 | static inline void bond_set_slave_link_state(struct slave *slave, int state) | ||
| 494 | { | ||
| 495 | slave->link = state; | ||
| 496 | } | ||
| 497 | |||
| 493 | static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local) | 498 | static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local) |
| 494 | { | 499 | { |
| 495 | struct in_device *in_dev; | 500 | struct in_device *in_dev; |
