diff options
Diffstat (limited to 'net/openvswitch/datapath.c')
-rw-r--r-- | net/openvswitch/datapath.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 2e31d9e7f4dc..f9e556b56086 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -324,6 +324,8 @@ static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb, | |||
324 | segs = __skb_gso_segment(skb, NETIF_F_SG, false); | 324 | segs = __skb_gso_segment(skb, NETIF_F_SG, false); |
325 | if (IS_ERR(segs)) | 325 | if (IS_ERR(segs)) |
326 | return PTR_ERR(segs); | 326 | return PTR_ERR(segs); |
327 | if (segs == NULL) | ||
328 | return -EINVAL; | ||
327 | 329 | ||
328 | /* Queue all of the segments. */ | 330 | /* Queue all of the segments. */ |
329 | skb = segs; | 331 | skb = segs; |
@@ -1263,7 +1265,7 @@ static size_t ovs_dp_cmd_msg_size(void) | |||
1263 | return msgsize; | 1265 | return msgsize; |
1264 | } | 1266 | } |
1265 | 1267 | ||
1266 | /* Called with ovs_mutex or RCU read lock. */ | 1268 | /* Called with ovs_mutex. */ |
1267 | static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb, | 1269 | static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb, |
1268 | u32 portid, u32 seq, u32 flags, u8 cmd) | 1270 | u32 portid, u32 seq, u32 flags, u8 cmd) |
1269 | { | 1271 | { |
@@ -1553,7 +1555,7 @@ static int ovs_dp_cmd_get(struct sk_buff *skb, struct genl_info *info) | |||
1553 | if (!reply) | 1555 | if (!reply) |
1554 | return -ENOMEM; | 1556 | return -ENOMEM; |
1555 | 1557 | ||
1556 | rcu_read_lock(); | 1558 | ovs_lock(); |
1557 | dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); | 1559 | dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); |
1558 | if (IS_ERR(dp)) { | 1560 | if (IS_ERR(dp)) { |
1559 | err = PTR_ERR(dp); | 1561 | err = PTR_ERR(dp); |
@@ -1562,12 +1564,12 @@ static int ovs_dp_cmd_get(struct sk_buff *skb, struct genl_info *info) | |||
1562 | err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, | 1564 | err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, |
1563 | info->snd_seq, 0, OVS_DP_CMD_NEW); | 1565 | info->snd_seq, 0, OVS_DP_CMD_NEW); |
1564 | BUG_ON(err < 0); | 1566 | BUG_ON(err < 0); |
1565 | rcu_read_unlock(); | 1567 | ovs_unlock(); |
1566 | 1568 | ||
1567 | return genlmsg_reply(reply, info); | 1569 | return genlmsg_reply(reply, info); |
1568 | 1570 | ||
1569 | err_unlock_free: | 1571 | err_unlock_free: |
1570 | rcu_read_unlock(); | 1572 | ovs_unlock(); |
1571 | kfree_skb(reply); | 1573 | kfree_skb(reply); |
1572 | return err; | 1574 | return err; |
1573 | } | 1575 | } |
@@ -1579,8 +1581,8 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1579 | int skip = cb->args[0]; | 1581 | int skip = cb->args[0]; |
1580 | int i = 0; | 1582 | int i = 0; |
1581 | 1583 | ||
1582 | rcu_read_lock(); | 1584 | ovs_lock(); |
1583 | list_for_each_entry_rcu(dp, &ovs_net->dps, list_node) { | 1585 | list_for_each_entry(dp, &ovs_net->dps, list_node) { |
1584 | if (i >= skip && | 1586 | if (i >= skip && |
1585 | ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid, | 1587 | ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid, |
1586 | cb->nlh->nlmsg_seq, NLM_F_MULTI, | 1588 | cb->nlh->nlmsg_seq, NLM_F_MULTI, |
@@ -1588,7 +1590,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1588 | break; | 1590 | break; |
1589 | i++; | 1591 | i++; |
1590 | } | 1592 | } |
1591 | rcu_read_unlock(); | 1593 | ovs_unlock(); |
1592 | 1594 | ||
1593 | cb->args[0] = i; | 1595 | cb->args[0] = i; |
1594 | 1596 | ||