From 99aa9856bbd55c1ae96dbd33593d07b128f9c8be Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 8 Aug 2012 21:52:46 +0000 Subject: [PATCH] --- yaml --- r: 327395 b: refs/heads/master c: 9c7dafbfab1554705f85523fead578aa1a3d338c h: refs/heads/master i: 327393: 40520309ecf1dc657861d01ec9c2c65033a48a51 327391: 3ceb893ced3d1b06e3992e3b7f395837fe20d021 v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 7 ++++++- trunk/net/core/rtnetlink.c | 12 +++++++----- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 5b6f4e8495d3..4f2860eff3dd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b14f243a42c7aa43de71f878641acd003f223022 +refs/heads/master: 9c7dafbfab1554705f85523fead578aa1a3d338c diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index f91abf800161..3ca300d85271 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -5579,7 +5579,12 @@ int register_netdevice(struct net_device *dev) } } - dev->ifindex = dev_new_index(net); + ret = -EBUSY; + if (!dev->ifindex) + dev->ifindex = dev_new_index(net); + else if (__dev_get_by_index(net, dev->ifindex)) + goto err_uninit; + if (dev->iflink == -1) dev->iflink = dev->ifindex; diff --git a/trunk/net/core/rtnetlink.c b/trunk/net/core/rtnetlink.c index db037c9a4c48..34d975b0f277 100644 --- a/trunk/net/core/rtnetlink.c +++ b/trunk/net/core/rtnetlink.c @@ -1812,8 +1812,6 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) return -ENODEV; } - if (ifm->ifi_index) - return -EOPNOTSUPP; if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO]) return -EOPNOTSUPP; @@ -1839,10 +1837,14 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) return PTR_ERR(dest_net); dev = rtnl_create_link(net, dest_net, ifname, ops, tb); - - if (IS_ERR(dev)) + if (IS_ERR(dev)) { err = PTR_ERR(dev); - else if (ops->newlink) + goto out; + } + + dev->ifindex = ifm->ifi_index; + + if (ops->newlink) err = ops->newlink(net, dev, tb, data); else err = register_netdevice(dev);