diff -NurpP --minimal linux-2.6.27.6-vs2.3.0.35.12/net/core/dev.c linux-2.6.27.6-vs2.3.0.35.13/net/core/dev.c --- linux-2.6.27.6-vs2.3.0.35.12/net/core/dev.c 2008-10-13 14:54:20.000000000 +0200 +++ linux-2.6.27.6-vs2.3.0.35.13/net/core/dev.c 2008-11-20 15:25:30.000000000 +0100 @@ -926,10 +926,15 @@ int dev_change_name(struct net_device *d strlcpy(dev->name, newname, IFNAMSIZ); rollback: - err = device_rename(&dev->dev, dev->name); - if (err) { - memcpy(dev->name, oldname, IFNAMSIZ); - return err; + /* 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); @@ -4391,6 +4396,15 @@ int dev_change_net_namespace(struct net_ 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) @@ -4448,6 +4462,8 @@ int dev_change_net_namespace(struct net_ */ dev_addr_discard(dev); + netdev_unregister_kobject(dev); + /* Actually switch the network namespace */ dev_net_set(dev, net); @@ -4464,7 +4480,6 @@ int dev_change_net_namespace(struct net_ } /* Fixup kobjects */ - netdev_unregister_kobject(dev); err = netdev_register_kobject(dev); WARN_ON(err); diff -NurpP --minimal linux-2.6.27.6-vs2.3.0.35.12/net/core/net-sysfs.c linux-2.6.27.6-vs2.3.0.35.13/net/core/net-sysfs.c --- linux-2.6.27.6-vs2.3.0.35.12/net/core/net-sysfs.c 2008-10-13 14:52:09.000000000 +0200 +++ linux-2.6.27.6-vs2.3.0.35.13/net/core/net-sysfs.c 2008-11-20 15:21:32.000000000 +0100 @@ -440,6 +440,10 @@ void netdev_unregister_kobject(struct ne struct device *dev = &(net->dev); kobject_get(&dev->kobj); + + if (dev_net(net) != &init_net) + return; + device_del(dev); } @@ -465,6 +469,9 @@ int netdev_register_kobject(struct net_d #endif #endif /* CONFIG_SYSFS */ + if (dev_net(net) != &init_net) + return 0; + return device_add(dev); } diff -NurpP --minimal linux-2.6.27.6-vs2.3.0.35.12/net/Kconfig linux-2.6.27.6-vs2.3.0.35.13/net/Kconfig --- linux-2.6.27.6-vs2.3.0.35.12/net/Kconfig 2008-10-13 14:52:09.000000000 +0200 +++ linux-2.6.27.6-vs2.3.0.35.13/net/Kconfig 2008-11-20 15:21:32.000000000 +0100 @@ -27,7 +27,7 @@ menu "Networking options" config NET_NS bool "Network namespace support" default n - depends on EXPERIMENTAL && !SYSFS && NAMESPACES + depends on EXPERIMENTAL && NAMESPACES help Allow user space to create what appear to be multiple instances of the network stack.