aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2008-10-27 20:51:47 -0400
committerDavid S. Miller <davem@davemloft.net>2008-10-27 20:51:47 -0400
commit3891845e1ef6e6807075d4241966b26f6ecb0a5c (patch)
tree3ccf11ecce77d13d929b4f17b583e05bb3ffa495 /net/core/dev.c
parent7c510e4b730a92cecf94ada45c989d8be0200d47 (diff)
netns: Coexist with the sysfs limitations v2
To make testing of the network namespace simpler allow the network namespace code and the sysfs code to be compiled and run at the same time. To do this only virtual devices are allowed in the additional network namespaces and those virtual devices are not placed in the kobject tree. Since virtual devices don't actually do anything interesting hardware wise that needs device management there should be no loss in keeping them out of the kobject tree and by implication sysfs. The gain in ease of testing and code coverage should be significant. Changelog: v2: As pointed out by Benjamin Thery it only makes sense to call device_rename in the initial network namespace for now. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Acked-by: Benjamin Thery <benjamin.thery@bull.net> Tested-by: Serge Hallyn <serue@us.ibm.com> Acked-by: Serge Hallyn <serue@us.ibm.com> Acked-by: Daniel Lezcano <dlezcano@fr.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
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