|
@@ -1724,6 +1724,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu)
|
|
* to traverse list in reverse under rcu_read_lock
|
|
* to traverse list in reverse under rcu_read_lock
|
|
*/
|
|
*/
|
|
mutex_lock(&team->lock);
|
|
mutex_lock(&team->lock);
|
|
|
|
+ team->port_mtu_change_allowed = true;
|
|
list_for_each_entry(port, &team->port_list, list) {
|
|
list_for_each_entry(port, &team->port_list, list) {
|
|
err = dev_set_mtu(port->dev, new_mtu);
|
|
err = dev_set_mtu(port->dev, new_mtu);
|
|
if (err) {
|
|
if (err) {
|
|
@@ -1732,6 +1733,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu)
|
|
goto unwind;
|
|
goto unwind;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ team->port_mtu_change_allowed = false;
|
|
mutex_unlock(&team->lock);
|
|
mutex_unlock(&team->lock);
|
|
|
|
|
|
dev->mtu = new_mtu;
|
|
dev->mtu = new_mtu;
|
|
@@ -1741,6 +1743,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu)
|
|
unwind:
|
|
unwind:
|
|
list_for_each_entry_continue_reverse(port, &team->port_list, list)
|
|
list_for_each_entry_continue_reverse(port, &team->port_list, list)
|
|
dev_set_mtu(port->dev, dev->mtu);
|
|
dev_set_mtu(port->dev, dev->mtu);
|
|
|
|
+ team->port_mtu_change_allowed = false;
|
|
mutex_unlock(&team->lock);
|
|
mutex_unlock(&team->lock);
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -2851,7 +2854,9 @@ static int team_device_event(struct notifier_block *unused,
|
|
break;
|
|
break;
|
|
case NETDEV_PRECHANGEMTU:
|
|
case NETDEV_PRECHANGEMTU:
|
|
/* Forbid to change mtu of underlaying device */
|
|
/* Forbid to change mtu of underlaying device */
|
|
- return NOTIFY_BAD;
|
|
|
|
|
|
+ if (!port->team->port_mtu_change_allowed)
|
|
|
|
+ return NOTIFY_BAD;
|
|
|
|
+ break;
|
|
case NETDEV_PRE_TYPE_CHANGE:
|
|
case NETDEV_PRE_TYPE_CHANGE:
|
|
/* Forbid to change type of underlaying device */
|
|
/* Forbid to change type of underlaying device */
|
|
return NOTIFY_BAD;
|
|
return NOTIFY_BAD;
|