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: 317f4810e4
("rtnl: allow to create device with IFLA_LINK_NETNSID set")
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7768eed8bf
commit
4363890079
|
@ -2166,28 +2166,28 @@ replay:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue