|
@@ -1963,16 +1963,21 @@ replay:
|
|
|
|
|
|
dev->ifindex = ifm->ifi_index;
|
|
dev->ifindex = ifm->ifi_index;
|
|
|
|
|
|
- if (ops->newlink)
|
|
|
|
|
|
+ if (ops->newlink) {
|
|
err = ops->newlink(net, dev, tb, data);
|
|
err = ops->newlink(net, dev, tb, data);
|
|
- else
|
|
|
|
|
|
+ /* Drivers should call free_netdev() in ->destructor
|
|
|
|
+ * and unregister it on failure so that device could be
|
|
|
|
+ * finally freed in rtnl_unlock.
|
|
|
|
+ */
|
|
|
|
+ if (err < 0)
|
|
|
|
+ goto out;
|
|
|
|
+ } else {
|
|
err = register_netdevice(dev);
|
|
err = register_netdevice(dev);
|
|
-
|
|
|
|
- if (err < 0) {
|
|
|
|
- free_netdev(dev);
|
|
|
|
- goto out;
|
|
|
|
|
|
+ if (err < 0) {
|
|
|
|
+ free_netdev(dev);
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-
|
|
|
|
err = rtnl_configure_link(dev, ifm);
|
|
err = rtnl_configure_link(dev, ifm);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
unregister_netdevice(dev);
|
|
unregister_netdevice(dev);
|