|
@@ -5300,6 +5300,17 @@ int dev_change_flags(struct net_device *dev, unsigned int flags)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(dev_change_flags);
|
|
EXPORT_SYMBOL(dev_change_flags);
|
|
|
|
|
|
|
|
+static int __dev_set_mtu(struct net_device *dev, int new_mtu)
|
|
|
|
+{
|
|
|
|
+ const struct net_device_ops *ops = dev->netdev_ops;
|
|
|
|
+
|
|
|
|
+ if (ops->ndo_change_mtu)
|
|
|
|
+ return ops->ndo_change_mtu(dev, new_mtu);
|
|
|
|
+
|
|
|
|
+ dev->mtu = new_mtu;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* dev_set_mtu - Change maximum transfer unit
|
|
* dev_set_mtu - Change maximum transfer unit
|
|
* @dev: device
|
|
* @dev: device
|
|
@@ -5309,8 +5320,7 @@ EXPORT_SYMBOL(dev_change_flags);
|
|
*/
|
|
*/
|
|
int dev_set_mtu(struct net_device *dev, int new_mtu)
|
|
int dev_set_mtu(struct net_device *dev, int new_mtu)
|
|
{
|
|
{
|
|
- const struct net_device_ops *ops = dev->netdev_ops;
|
|
|
|
- int err;
|
|
|
|
|
|
+ int err, orig_mtu;
|
|
|
|
|
|
if (new_mtu == dev->mtu)
|
|
if (new_mtu == dev->mtu)
|
|
return 0;
|
|
return 0;
|
|
@@ -5322,14 +5332,20 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
|
|
if (!netif_device_present(dev))
|
|
if (!netif_device_present(dev))
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
|
|
|
|
- err = 0;
|
|
|
|
- if (ops->ndo_change_mtu)
|
|
|
|
- err = ops->ndo_change_mtu(dev, new_mtu);
|
|
|
|
- else
|
|
|
|
- dev->mtu = new_mtu;
|
|
|
|
|
|
+ orig_mtu = dev->mtu;
|
|
|
|
+ err = __dev_set_mtu(dev, new_mtu);
|
|
|
|
|
|
- if (!err)
|
|
|
|
- call_netdevice_notifiers(NETDEV_CHANGEMTU, dev);
|
|
|
|
|
|
+ if (!err) {
|
|
|
|
+ err = call_netdevice_notifiers(NETDEV_CHANGEMTU, dev);
|
|
|
|
+ err = notifier_to_errno(err);
|
|
|
|
+ if (err) {
|
|
|
|
+ /* setting mtu back and notifying everyone again,
|
|
|
|
+ * so that they have a chance to revert changes.
|
|
|
|
+ */
|
|
|
|
+ __dev_set_mtu(dev, orig_mtu);
|
|
|
|
+ call_netdevice_notifiers(NETDEV_CHANGEMTU, dev);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(dev_set_mtu);
|
|
EXPORT_SYMBOL(dev_set_mtu);
|