|
|
@@ -169,7 +169,9 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
|
|
|
{
|
|
|
struct vport *vport;
|
|
|
struct internal_dev *internal_dev;
|
|
|
+ struct net_device *dev;
|
|
|
int err;
|
|
|
+ bool free_vport = true;
|
|
|
|
|
|
vport = ovs_vport_alloc(0, &ovs_internal_vport_ops, parms);
|
|
|
if (IS_ERR(vport)) {
|
|
|
@@ -177,8 +179,9 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
- vport->dev = alloc_netdev(sizeof(struct internal_dev),
|
|
|
- parms->name, NET_NAME_USER, do_setup);
|
|
|
+ dev = alloc_netdev(sizeof(struct internal_dev),
|
|
|
+ parms->name, NET_NAME_USER, do_setup);
|
|
|
+ vport->dev = dev;
|
|
|
if (!vport->dev) {
|
|
|
err = -ENOMEM;
|
|
|
goto error_free_vport;
|
|
|
@@ -199,8 +202,10 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
|
|
|
|
|
|
rtnl_lock();
|
|
|
err = register_netdevice(vport->dev);
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ free_vport = false;
|
|
|
goto error_unlock;
|
|
|
+ }
|
|
|
|
|
|
dev_set_promiscuity(vport->dev, 1);
|
|
|
rtnl_unlock();
|
|
|
@@ -210,11 +215,12 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
|
|
|
|
|
|
error_unlock:
|
|
|
rtnl_unlock();
|
|
|
- free_percpu(vport->dev->tstats);
|
|
|
+ free_percpu(dev->tstats);
|
|
|
error_free_netdev:
|
|
|
- free_netdev(vport->dev);
|
|
|
+ free_netdev(dev);
|
|
|
error_free_vport:
|
|
|
- ovs_vport_free(vport);
|
|
|
+ if (free_vport)
|
|
|
+ ovs_vport_free(vport);
|
|
|
error:
|
|
|
return ERR_PTR(err);
|
|
|
}
|