aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/team/team.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/team/team.c')
-rw-r--r--drivers/net/team/team.c9
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)
1741unwind: 1743unwind:
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;