diff options
-rw-r--r-- | net/Kconfig | 2 | ||||
-rw-r--r-- | net/core/dev.c | 25 | ||||
-rw-r--r-- | net/core/net-sysfs.c | 7 |
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" | |||
27 | config NET_NS | 27 | config 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 | ||
926 | rollback: | 926 | rollback: |
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 | ||