aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index d9038e328cc1..3a2b8be9e67b 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -924,10 +924,15 @@ int dev_change_name(struct net_device *dev, const char *newname)
924 strlcpy(dev->name, newname, IFNAMSIZ); 924 strlcpy(dev->name, newname, IFNAMSIZ);
925 925
926rollback: 926rollback:
927 ret = device_rename(&dev->dev, dev->name); 927 /* For now only devices in the initial network namespace
928 if (ret) { 928 * are in sysfs.
929 memcpy(dev->name, oldname, IFNAMSIZ); 929 */
930 return ret; 930 if (net == &init_net) {
931 ret = device_rename(&dev->dev, dev->name);
932 if (ret) {
933 memcpy(dev->name, oldname, IFNAMSIZ);
934 return ret;
935 }
931 } 936 }
932 937
933 write_lock_bh(&dev_base_lock); 938 write_lock_bh(&dev_base_lock);
@@ -4460,6 +4465,15 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
4460 if (dev->features & NETIF_F_NETNS_LOCAL) 4465 if (dev->features & NETIF_F_NETNS_LOCAL)
4461 goto out; 4466 goto out;
4462 4467
4468#ifdef CONFIG_SYSFS
4469 /* Don't allow real devices to be moved when sysfs
4470 * is enabled.
4471 */
4472 err = -EINVAL;
4473 if (dev->dev.parent)
4474 goto out;
4475#endif
4476
4463 /* Ensure the device has been registrered */ 4477 /* Ensure the device has been registrered */
4464 err = -EINVAL; 4478 err = -EINVAL;
4465 if (dev->reg_state != NETREG_REGISTERED) 4479 if (dev->reg_state != NETREG_REGISTERED)
@@ -4517,6 +4531,8 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
4517 */ 4531 */
4518 dev_addr_discard(dev); 4532 dev_addr_discard(dev);
4519 4533
4534 netdev_unregister_kobject(dev);
4535
4520 /* Actually switch the network namespace */ 4536 /* Actually switch the network namespace */
4521 dev_net_set(dev, net); 4537 dev_net_set(dev, net);
4522 4538
@@ -4533,7 +4549,6 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
4533 } 4549 }
4534 4550
4535 /* Fixup kobjects */ 4551 /* Fixup kobjects */
4536 netdev_unregister_kobject(dev);
4537 err = netdev_register_kobject(dev); 4552 err = netdev_register_kobject(dev);
4538 WARN_ON(err); 4553 WARN_ON(err);
4539 4554