aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2012-08-08 17:52:46 -0400
committerDavid S. Miller <davem@davemloft.net>2012-08-09 19:18:06 -0400
commit9c7dafbfab1554705f85523fead578aa1a3d338c (patch)
tree462dc2a2b854b3c7ad80a351a0ef780b790bc109
parentb14f243a42c7aa43de71f878641acd003f223022 (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.c7
-rw-r--r--net/core/rtnetlink.c12
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);