Signed-off-by: Jarno Rajahalme <[email protected]>
---
datapath/datapath.c | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 9fdb447..92ae66a 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -975,50 +975,50 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct
genl_info *info)
struct sw_flow_match match;
int err;
+ if (a[OVS_FLOW_ATTR_KEY]) {
+ ovs_match_init(&match, &key, NULL);
+ err = ovs_nla_get_match(&match, NULL, a[OVS_FLOW_ATTR_KEY],
+ NULL);
+ if (err)
+ return err;
+ }
+ /* Allocate before locking. We are not returning the actions, so we
+ * can pass a NULL flow pointer here. */
+ if (info->nlhdr->nlmsg_flags & NLM_F_ECHO) {
+ reply = ovs_flow_cmd_alloc_info(NULL, info,
+ 1 << OVS_FLOW_ATTR_STATS);
+ if (!reply)
+ return -ENOMEM;
+ }
+
ovs_lock();
dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
if (!dp) {
err = -ENODEV;
goto unlock;
}
-
if (!a[OVS_FLOW_ATTR_KEY]) {
err = ovs_flow_tbl_flush(&dp->table);
goto unlock;
}
- ovs_match_init(&match, &key, NULL);
- err = ovs_nla_get_match(&match, NULL, a[OVS_FLOW_ATTR_KEY], NULL);
- if (err)
- goto unlock;
-
flow = ovs_flow_tbl_lookup(&dp->table, &key);
if (!flow || !ovs_flow_cmp_unmasked_key(flow, &match)) {
err = -ENOENT;
goto unlock;
}
-
- if (info->nlhdr->nlmsg_flags & NLM_F_ECHO) {
- reply = ovs_flow_cmd_alloc_info(flow, info,
- 1 << OVS_FLOW_ATTR_STATS);
- if (!reply) {
- err = -ENOMEM;
- goto unlock;
- }
- }
ovs_flow_tbl_remove(&dp->table, flow);
+ ovs_unlock();
if (reply) {
err = ovs_flow_cmd_fill_info(flow, dp, reply, info->snd_portid,
info->snd_seq, 0, OVS_FLOW_CMD_DEL,
1 << OVS_FLOW_ATTR_STATS);
BUG_ON(err < 0);
+ ovs_notify(reply, info, &ovs_dp_flow_multicast_group);
}
ovs_flow_free(flow, true);
- ovs_unlock();
- if (reply)
- ovs_notify(reply, info, &ovs_dp_flow_multicast_group);
return 0;
unlock:
ovs_unlock();
--
1.7.10.4
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev