diff options
Diffstat (limited to 'drivers/net/team/team.c')
-rw-r--r-- | drivers/net/team/team.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 33008c1d1d67..ce4989be86d9 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -1724,6 +1724,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu) | |||
1724 | * to traverse list in reverse under rcu_read_lock | 1724 | * to traverse list in reverse under rcu_read_lock |
1725 | */ | 1725 | */ |
1726 | mutex_lock(&team->lock); | 1726 | mutex_lock(&team->lock); |
1727 | team->port_mtu_change_allowed = true; | ||
1727 | list_for_each_entry(port, &team->port_list, list) { | 1728 | list_for_each_entry(port, &team->port_list, list) { |
1728 | err = dev_set_mtu(port->dev, new_mtu); | 1729 | err = dev_set_mtu(port->dev, new_mtu); |
1729 | if (err) { | 1730 | if (err) { |
@@ -1732,6 +1733,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu) | |||
1732 | goto unwind; | 1733 | goto unwind; |
1733 | } | 1734 | } |
1734 | } | 1735 | } |
1736 | team->port_mtu_change_allowed = false; | ||
1735 | mutex_unlock(&team->lock); | 1737 | mutex_unlock(&team->lock); |
1736 | 1738 | ||
1737 | dev->mtu = new_mtu; | 1739 | dev->mtu = new_mtu; |
@@ -1741,6 +1743,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu) | |||
1741 | unwind: | 1743 | unwind: |
1742 | list_for_each_entry_continue_reverse(port, &team->port_list, list) | 1744 | list_for_each_entry_continue_reverse(port, &team->port_list, list) |
1743 | dev_set_mtu(port->dev, dev->mtu); | 1745 | dev_set_mtu(port->dev, dev->mtu); |
1746 | team->port_mtu_change_allowed = false; | ||
1744 | mutex_unlock(&team->lock); | 1747 | mutex_unlock(&team->lock); |
1745 | 1748 | ||
1746 | return err; | 1749 | return err; |
@@ -2834,8 +2837,10 @@ static int team_device_event(struct notifier_block *unused, | |||
2834 | case NETDEV_UP: | 2837 | case NETDEV_UP: |
2835 | if (netif_carrier_ok(dev)) | 2838 | if (netif_carrier_ok(dev)) |
2836 | team_port_change_check(port, true); | 2839 | team_port_change_check(port, true); |
2840 | break; | ||
2837 | case NETDEV_DOWN: | 2841 | case NETDEV_DOWN: |
2838 | team_port_change_check(port, false); | 2842 | team_port_change_check(port, false); |
2843 | break; | ||
2839 | case NETDEV_CHANGE: | 2844 | case NETDEV_CHANGE: |
2840 | if (netif_running(port->dev)) | 2845 | if (netif_running(port->dev)) |
2841 | team_port_change_check(port, | 2846 | team_port_change_check(port, |
@@ -2849,7 +2854,9 @@ static int team_device_event(struct notifier_block *unused, | |||
2849 | break; | 2854 | break; |
2850 | case NETDEV_PRECHANGEMTU: | 2855 | case NETDEV_PRECHANGEMTU: |
2851 | /* Forbid to change mtu of underlaying device */ | 2856 | /* Forbid to change mtu of underlaying device */ |
2852 | return NOTIFY_BAD; | 2857 | if (!port->team->port_mtu_change_allowed) |
2858 | return NOTIFY_BAD; | ||
2859 | break; | ||
2853 | case NETDEV_PRE_TYPE_CHANGE: | 2860 | case NETDEV_PRE_TYPE_CHANGE: |
2854 | /* Forbid to change type of underlaying device */ | 2861 | /* Forbid to change type of underlaying device */ |
2855 | return NOTIFY_BAD; | 2862 | return NOTIFY_BAD; |