diff options
Diffstat (limited to 'net/openvswitch/vport-gre.c')
-rw-r--r-- | net/openvswitch/vport-gre.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/openvswitch/vport-gre.c b/net/openvswitch/vport-gre.c index 7f8897f33a67..0e72d95b0e8f 100644 --- a/net/openvswitch/vport-gre.c +++ b/net/openvswitch/vport-gre.c | |||
@@ -54,6 +54,7 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms) | |||
54 | struct net *net = ovs_dp_get_net(parms->dp); | 54 | struct net *net = ovs_dp_get_net(parms->dp); |
55 | struct net_device *dev; | 55 | struct net_device *dev; |
56 | struct vport *vport; | 56 | struct vport *vport; |
57 | int err; | ||
57 | 58 | ||
58 | vport = ovs_vport_alloc(0, &ovs_gre_vport_ops, parms); | 59 | vport = ovs_vport_alloc(0, &ovs_gre_vport_ops, parms); |
59 | if (IS_ERR(vport)) | 60 | if (IS_ERR(vport)) |
@@ -67,9 +68,15 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms) | |||
67 | return ERR_CAST(dev); | 68 | return ERR_CAST(dev); |
68 | } | 69 | } |
69 | 70 | ||
70 | dev_change_flags(dev, dev->flags | IFF_UP); | 71 | err = dev_change_flags(dev, dev->flags | IFF_UP); |
71 | rtnl_unlock(); | 72 | if (err < 0) { |
73 | rtnl_delete_link(dev); | ||
74 | rtnl_unlock(); | ||
75 | ovs_vport_free(vport); | ||
76 | return ERR_PTR(err); | ||
77 | } | ||
72 | 78 | ||
79 | rtnl_unlock(); | ||
73 | return vport; | 80 | return vport; |
74 | } | 81 | } |
75 | 82 | ||