|
@@ -54,6 +54,7 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms)
|
|
struct net *net = ovs_dp_get_net(parms->dp);
|
|
struct net *net = ovs_dp_get_net(parms->dp);
|
|
struct net_device *dev;
|
|
struct net_device *dev;
|
|
struct vport *vport;
|
|
struct vport *vport;
|
|
|
|
+ int err;
|
|
|
|
|
|
vport = ovs_vport_alloc(0, &ovs_gre_vport_ops, parms);
|
|
vport = ovs_vport_alloc(0, &ovs_gre_vport_ops, parms);
|
|
if (IS_ERR(vport))
|
|
if (IS_ERR(vport))
|
|
@@ -67,9 +68,15 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms)
|
|
return ERR_CAST(dev);
|
|
return ERR_CAST(dev);
|
|
}
|
|
}
|
|
|
|
|
|
- dev_change_flags(dev, dev->flags | IFF_UP);
|
|
|
|
- rtnl_unlock();
|
|
|
|
|
|
+ err = dev_change_flags(dev, dev->flags | IFF_UP);
|
|
|
|
+ if (err < 0) {
|
|
|
|
+ rtnl_delete_link(dev);
|
|
|
|
+ rtnl_unlock();
|
|
|
|
+ ovs_vport_free(vport);
|
|
|
|
+ return ERR_PTR(err);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ rtnl_unlock();
|
|
return vport;
|
|
return vport;
|
|
}
|
|
}
|
|
|
|
|