diff options
author | Pavel Emelyanov <xemul@parallels.com> | 2012-08-08 17:52:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-09 19:18:06 -0400 |
commit | 9c7dafbfab1554705f85523fead578aa1a3d338c (patch) | |
tree | 462dc2a2b854b3c7ad80a351a0ef780b790bc109 | |
parent | b14f243a42c7aa43de71f878641acd003f223022 (diff) |
net: Allow to create links with given ifindex
Currently the RTM_NEWLINK results in -EOPNOTSUPP if the ifinfomsg->ifi_index
is not zero. I propose to allow requesting ifindices on link creation. This
is required by the checkpoint-restore to correctly restore a net namespace
(i.e. -- a container).
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/dev.c | 7 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 12 |
2 files changed, 13 insertions, 6 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index f91abf800161..3ca300d85271 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -5579,7 +5579,12 @@ int register_netdevice(struct net_device *dev) | |||
5579 | } | 5579 | } |
5580 | } | 5580 | } |
5581 | 5581 | ||
5582 | dev->ifindex = dev_new_index(net); | 5582 | ret = -EBUSY; |
5583 | if (!dev->ifindex) | ||
5584 | dev->ifindex = dev_new_index(net); | ||
5585 | else if (__dev_get_by_index(net, dev->ifindex)) | ||
5586 | goto err_uninit; | ||
5587 | |||
5583 | if (dev->iflink == -1) | 5588 | if (dev->iflink == -1) |
5584 | dev->iflink = dev->ifindex; | 5589 | dev->iflink = dev->ifindex; |
5585 | 5590 | ||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index db037c9a4c48..34d975b0f277 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1812,8 +1812,6 @@ replay: | |||
1812 | return -ENODEV; | 1812 | return -ENODEV; |
1813 | } | 1813 | } |
1814 | 1814 | ||
1815 | if (ifm->ifi_index) | ||
1816 | return -EOPNOTSUPP; | ||
1817 | if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO]) | 1815 | if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO]) |
1818 | return -EOPNOTSUPP; | 1816 | return -EOPNOTSUPP; |
1819 | 1817 | ||
@@ -1839,10 +1837,14 @@ replay: | |||
1839 | return PTR_ERR(dest_net); | 1837 | return PTR_ERR(dest_net); |
1840 | 1838 | ||
1841 | dev = rtnl_create_link(net, dest_net, ifname, ops, tb); | 1839 | dev = rtnl_create_link(net, dest_net, ifname, ops, tb); |
1842 | 1840 | if (IS_ERR(dev)) { | |
1843 | if (IS_ERR(dev)) | ||
1844 | err = PTR_ERR(dev); | 1841 | err = PTR_ERR(dev); |
1845 | else if (ops->newlink) | 1842 | goto out; |
1843 | } | ||
1844 | |||
1845 | dev->ifindex = ifm->ifi_index; | ||
1846 | |||
1847 | if (ops->newlink) | ||
1846 | err = ops->newlink(net, dev, tb, data); | 1848 | err = ops->newlink(net, dev, tb, data); |
1847 | else | 1849 | else |
1848 | err = register_netdevice(dev); | 1850 | err = register_netdevice(dev); |