|
@@ -924,10 +924,15 @@ int dev_change_name(struct net_device *dev, const char *newname)
|
|
|
strlcpy(dev->name, newname, IFNAMSIZ);
|
|
|
|
|
|
rollback:
|
|
|
- ret = device_rename(&dev->dev, dev->name);
|
|
|
- if (ret) {
|
|
|
- memcpy(dev->name, oldname, IFNAMSIZ);
|
|
|
- return ret;
|
|
|
+ /* For now only devices in the initial network namespace
|
|
|
+ * are in sysfs.
|
|
|
+ */
|
|
|
+ if (net == &init_net) {
|
|
|
+ ret = device_rename(&dev->dev, dev->name);
|
|
|
+ if (ret) {
|
|
|
+ memcpy(dev->name, oldname, IFNAMSIZ);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
write_lock_bh(&dev_base_lock);
|
|
@@ -4460,6 +4465,15 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
|
|
if (dev->features & NETIF_F_NETNS_LOCAL)
|
|
|
goto out;
|
|
|
|
|
|
+#ifdef CONFIG_SYSFS
|
|
|
+ /* Don't allow real devices to be moved when sysfs
|
|
|
+ * is enabled.
|
|
|
+ */
|
|
|
+ err = -EINVAL;
|
|
|
+ if (dev->dev.parent)
|
|
|
+ goto out;
|
|
|
+#endif
|
|
|
+
|
|
|
/* Ensure the device has been registrered */
|
|
|
err = -EINVAL;
|
|
|
if (dev->reg_state != NETREG_REGISTERED)
|
|
@@ -4517,6 +4531,8 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
|
|
*/
|
|
|
dev_addr_discard(dev);
|
|
|
|
|
|
+ netdev_unregister_kobject(dev);
|
|
|
+
|
|
|
/* Actually switch the network namespace */
|
|
|
dev_net_set(dev, net);
|
|
|
|
|
@@ -4533,7 +4549,6 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
|
|
}
|
|
|
|
|
|
/* Fixup kobjects */
|
|
|
- netdev_unregister_kobject(dev);
|
|
|
err = netdev_register_kobject(dev);
|
|
|
WARN_ON(err);
|
|
|
|