aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/Kconfig2
-rw-r--r--net/core/dev.c25
-rw-r--r--net/core/net-sysfs.c7
3 files changed, 28 insertions, 6 deletions
diff --git a/net/Kconfig b/net/Kconfig
index d789d79551ae..8c3d97ca0d96 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -27,7 +27,7 @@ menu "Networking options"
27config NET_NS 27config NET_NS
28 bool "Network namespace support" 28 bool "Network namespace support"
29 default n 29 default n
30 depends on EXPERIMENTAL && !SYSFS && NAMESPACES 30 depends on EXPERIMENTAL && NAMESPACES
31 help 31 help
32 Allow user space to create what appear to be multiple instances 32 Allow user space to create what appear to be multiple instances
33 of the network stack. 33 of the network stack.
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
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 92d6b9467314..85cb8bdcfb8f 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -476,6 +476,10 @@ void netdev_unregister_kobject(struct net_device * net)
476 struct device *dev = &(net->dev); 476 struct device *dev = &(net->dev);
477 477
478 kobject_get(&dev->kobj); 478 kobject_get(&dev->kobj);
479
480 if (dev_net(net) != &init_net)
481 return;
482
479 device_del(dev); 483 device_del(dev);
480} 484}
481 485
@@ -501,6 +505,9 @@ int netdev_register_kobject(struct net_device *net)
501#endif 505#endif
502#endif /* CONFIG_SYSFS */ 506#endif /* CONFIG_SYSFS */
503 507
508 if (dev_net(net) != &init_net)
509 return 0;
510
504 return device_add(dev); 511 return device_add(dev);
505} 512}
506 513