Commit 43638900 authored by David S. Miller's avatar David S. Miller

net: Handle unregister properly when netdev namespace change fails.

If rtnl_newlink() fails on it's call to dev_change_net_namespace(), we
have to make use of the ->dellink() method, if present, just like we
do when rtnl_configure_link() fails.

Fixes: 317f4810 ("rtnl: allow to create device with IFLA_LINK_NETNSID set")
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7768eed8
...@@ -2166,28 +2166,28 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh) ...@@ -2166,28 +2166,28 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh)
} }
} }
err = rtnl_configure_link(dev, ifm); err = rtnl_configure_link(dev, ifm);
if (err < 0) { if (err < 0)
if (ops->newlink) { goto out_unregister;
LIST_HEAD(list_kill);
ops->dellink(dev, &list_kill);
unregister_netdevice_many(&list_kill);
} else {
unregister_netdevice(dev);
}
goto out;
}
if (link_net) { if (link_net) {
err = dev_change_net_namespace(dev, dest_net, ifname); err = dev_change_net_namespace(dev, dest_net, ifname);
if (err < 0) if (err < 0)
unregister_netdevice(dev); goto out_unregister;
} }
out: out:
if (link_net) if (link_net)
put_net(link_net); put_net(link_net);
put_net(dest_net); put_net(dest_net);
return err; return err;
out_unregister:
if (ops->newlink) {
LIST_HEAD(list_kill);
ops->dellink(dev, &list_kill);
unregister_netdevice_many(&list_kill);
} else {
unregister_netdevice(dev);
}
goto out;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment