diff options
author | David S. Miller <davem@davemloft.net> | 2013-04-18 00:20:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-18 00:20:57 -0400 |
commit | ea2f2fa143ead1a9bf5ce87a3abe403694fe6d78 (patch) | |
tree | c5aedcc1ed4a9e9375e595de2cb189b8345c4d96 /net | |
parent | 96d8683483b7eb194609edd1afe9143a0467b7d3 (diff) | |
parent | d3e1101c9b75574e68380b5cb10c9395fd8855de (diff) |
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch
Jesse Gross says:
====================
Two small bug fixes for net/3.9 including the issue previously
discussed where allocation of netlink notifications can fail after
changes have been committed.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/openvswitch/datapath.c | 30 | ||||
-rw-r--r-- | net/openvswitch/flow.c | 2 |
2 files changed, 19 insertions, 13 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index a4b724708a1a..6980c3e6f066 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -1593,10 +1593,8 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 portid, | |||
1593 | return ERR_PTR(-ENOMEM); | 1593 | return ERR_PTR(-ENOMEM); |
1594 | 1594 | ||
1595 | retval = ovs_vport_cmd_fill_info(vport, skb, portid, seq, 0, cmd); | 1595 | retval = ovs_vport_cmd_fill_info(vport, skb, portid, seq, 0, cmd); |
1596 | if (retval < 0) { | 1596 | BUG_ON(retval < 0); |
1597 | kfree_skb(skb); | 1597 | |
1598 | return ERR_PTR(retval); | ||
1599 | } | ||
1600 | return skb; | 1598 | return skb; |
1601 | } | 1599 | } |
1602 | 1600 | ||
@@ -1726,24 +1724,32 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
1726 | nla_get_u32(a[OVS_VPORT_ATTR_TYPE]) != vport->ops->type) | 1724 | nla_get_u32(a[OVS_VPORT_ATTR_TYPE]) != vport->ops->type) |
1727 | err = -EINVAL; | 1725 | err = -EINVAL; |
1728 | 1726 | ||
1727 | reply = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
1728 | if (!reply) { | ||
1729 | err = -ENOMEM; | ||
1730 | goto exit_unlock; | ||
1731 | } | ||
1732 | |||
1729 | if (!err && a[OVS_VPORT_ATTR_OPTIONS]) | 1733 | if (!err && a[OVS_VPORT_ATTR_OPTIONS]) |
1730 | err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]); | 1734 | err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]); |
1731 | if (err) | 1735 | if (err) |
1732 | goto exit_unlock; | 1736 | goto exit_free; |
1737 | |||
1733 | if (a[OVS_VPORT_ATTR_UPCALL_PID]) | 1738 | if (a[OVS_VPORT_ATTR_UPCALL_PID]) |
1734 | vport->upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); | 1739 | vport->upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); |
1735 | 1740 | ||
1736 | reply = ovs_vport_cmd_build_info(vport, info->snd_portid, info->snd_seq, | 1741 | err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, |
1737 | OVS_VPORT_CMD_NEW); | 1742 | info->snd_seq, 0, OVS_VPORT_CMD_NEW); |
1738 | if (IS_ERR(reply)) { | 1743 | BUG_ON(err < 0); |
1739 | netlink_set_err(sock_net(skb->sk)->genl_sock, 0, | ||
1740 | ovs_dp_vport_multicast_group.id, PTR_ERR(reply)); | ||
1741 | goto exit_unlock; | ||
1742 | } | ||
1743 | 1744 | ||
1744 | genl_notify(reply, genl_info_net(info), info->snd_portid, | 1745 | genl_notify(reply, genl_info_net(info), info->snd_portid, |
1745 | ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); | 1746 | ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); |
1746 | 1747 | ||
1748 | rtnl_unlock(); | ||
1749 | return 0; | ||
1750 | |||
1751 | exit_free: | ||
1752 | kfree_skb(reply); | ||
1747 | exit_unlock: | 1753 | exit_unlock: |
1748 | rtnl_unlock(); | 1754 | rtnl_unlock(); |
1749 | return err; | 1755 | return err; |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index fe0e4215c73d..67a2b783fe70 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
@@ -795,9 +795,9 @@ void ovs_flow_tbl_insert(struct flow_table *table, struct sw_flow *flow) | |||
795 | 795 | ||
796 | void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow) | 796 | void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow) |
797 | { | 797 | { |
798 | BUG_ON(table->count == 0); | ||
798 | hlist_del_rcu(&flow->hash_node[table->node_ver]); | 799 | hlist_del_rcu(&flow->hash_node[table->node_ver]); |
799 | table->count--; | 800 | table->count--; |
800 | BUG_ON(table->count < 0); | ||
801 | } | 801 | } |
802 | 802 | ||
803 | /* The size of the argument for each %OVS_KEY_ATTR_* Netlink attribute. */ | 803 | /* The size of the argument for each %OVS_KEY_ATTR_* Netlink attribute. */ |