Skip to content

Commit

Permalink
netns: Coexist with the sysfs limitations v2
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Benjamin Thery <[email protected]>
Tested-by: Serge Hallyn <[email protected]>
Acked-by: Serge Hallyn <[email protected]>
Acked-by: Daniel Lezcano <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
ebiederm authored and davem330 committed Oct 28, 2008
1 parent 7c510e4 commit 3891845
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 6 deletions.
2 changes: 1 addition & 1 deletion net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
25 changes: 20 additions & 5 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);

Expand All @@ -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);

Expand Down
7 changes: 7 additions & 0 deletions net/core/net-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,10 @@ void netdev_unregister_kobject(struct net_device * net)
struct device *dev = &(net->dev);

kobject_get(&dev->kobj);

if (dev_net(net) != &init_net)
return;

device_del(dev);
}

Expand All @@ -501,6 +505,9 @@ int netdev_register_kobject(struct net_device *net)
#endif
#endif /* CONFIG_SYSFS */

if (dev_net(net) != &init_net)
return 0;

return device_add(dev);
}

Expand Down

0 comments on commit 3891845

Please sign in to comment.