diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 25 |
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 | ||
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 | ||