diff options
| author | Martynas Pumputis <martynas@weave.works> | 2016-08-09 11:24:50 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-08-11 02:13:23 -0400 |
| commit | 4b5b9ba553f9aa5f484ab972fc9b58061885ceca (patch) | |
| tree | a49284b85664db33831c1d8a6d115a38ba045457 /net/openvswitch | |
| parent | dafa6b0db2d62164c5ef81a40312d5ba514126b9 (diff) | |
openvswitch: do not ignore netdev errors when creating tunnel vports
The creation of a tunnel vport (geneve, gre, vxlan) brings up a
corresponding netdev, a multi-step operation which can fail.
For example, changing a vxlan vport's netdev state to 'up' binds the
vport's socket to a UDP port - if the binding fails (e.g. due to the
port being in use), the error is currently ignored giving the
appearance that the tunnel vport creation completed successfully.
Signed-off-by: Martynas Pumputis <martynas@weave.works>
Acked-by: Pravin B Shelar <pshelar@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch')
| -rw-r--r-- | net/openvswitch/vport-geneve.c | 9 | ||||
| -rw-r--r-- | net/openvswitch/vport-gre.c | 11 | ||||
| -rw-r--r-- | net/openvswitch/vport-vxlan.c | 9 |
3 files changed, 25 insertions, 4 deletions
diff --git a/net/openvswitch/vport-geneve.c b/net/openvswitch/vport-geneve.c index 1a1fcec88695..5aaf3babfc3f 100644 --- a/net/openvswitch/vport-geneve.c +++ b/net/openvswitch/vport-geneve.c | |||
| @@ -93,7 +93,14 @@ static struct vport *geneve_tnl_create(const struct vport_parms *parms) | |||
| 93 | return ERR_CAST(dev); | 93 | return ERR_CAST(dev); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | dev_change_flags(dev, dev->flags | IFF_UP); | 96 | err = dev_change_flags(dev, dev->flags | IFF_UP); |
| 97 | if (err < 0) { | ||
| 98 | rtnl_delete_link(dev); | ||
| 99 | rtnl_unlock(); | ||
| 100 | ovs_vport_free(vport); | ||
| 101 | goto error; | ||
| 102 | } | ||
| 103 | |||
| 97 | rtnl_unlock(); | 104 | rtnl_unlock(); |
| 98 | return vport; | 105 | return vport; |
| 99 | error: | 106 | error: |
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 | ||
diff --git a/net/openvswitch/vport-vxlan.c b/net/openvswitch/vport-vxlan.c index 5eb7694348b5..7eb955e453e6 100644 --- a/net/openvswitch/vport-vxlan.c +++ b/net/openvswitch/vport-vxlan.c | |||
| @@ -130,7 +130,14 @@ static struct vport *vxlan_tnl_create(const struct vport_parms *parms) | |||
| 130 | return ERR_CAST(dev); | 130 | return ERR_CAST(dev); |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | dev_change_flags(dev, dev->flags | IFF_UP); | 133 | err = dev_change_flags(dev, dev->flags | IFF_UP); |
| 134 | if (err < 0) { | ||
| 135 | rtnl_delete_link(dev); | ||
| 136 | rtnl_unlock(); | ||
| 137 | ovs_vport_free(vport); | ||
| 138 | goto error; | ||
| 139 | } | ||
| 140 | |||
| 134 | rtnl_unlock(); | 141 | rtnl_unlock(); |
| 135 | return vport; | 142 | return vport; |
| 136 | error: | 143 | error: |
