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>
This commit is contained in:
David S. Miller 2013-04-18 00:20:57 -04:00
commit ea2f2fa143
2 changed files with 19 additions and 13 deletions

View File

@ -1593,10 +1593,8 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 portid,
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
retval = ovs_vport_cmd_fill_info(vport, skb, portid, seq, 0, cmd); retval = ovs_vport_cmd_fill_info(vport, skb, portid, seq, 0, cmd);
if (retval < 0) { BUG_ON(retval < 0);
kfree_skb(skb);
return ERR_PTR(retval);
}
return skb; return skb;
} }
@ -1726,24 +1724,32 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info)
nla_get_u32(a[OVS_VPORT_ATTR_TYPE]) != vport->ops->type) nla_get_u32(a[OVS_VPORT_ATTR_TYPE]) != vport->ops->type)
err = -EINVAL; err = -EINVAL;
reply = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
if (!reply) {
err = -ENOMEM;
goto exit_unlock;
}
if (!err && a[OVS_VPORT_ATTR_OPTIONS]) if (!err && a[OVS_VPORT_ATTR_OPTIONS])
err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]); err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]);
if (err) if (err)
goto exit_unlock; goto exit_free;
if (a[OVS_VPORT_ATTR_UPCALL_PID]) if (a[OVS_VPORT_ATTR_UPCALL_PID])
vport->upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); vport->upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]);
reply = ovs_vport_cmd_build_info(vport, info->snd_portid, info->snd_seq, err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid,
OVS_VPORT_CMD_NEW); info->snd_seq, 0, OVS_VPORT_CMD_NEW);
if (IS_ERR(reply)) { BUG_ON(err < 0);
netlink_set_err(sock_net(skb->sk)->genl_sock, 0,
ovs_dp_vport_multicast_group.id, PTR_ERR(reply));
goto exit_unlock;
}
genl_notify(reply, genl_info_net(info), info->snd_portid, genl_notify(reply, genl_info_net(info), info->snd_portid,
ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL);
rtnl_unlock();
return 0;
exit_free:
kfree_skb(reply);
exit_unlock: exit_unlock:
rtnl_unlock(); rtnl_unlock();
return err; return err;

View File

@ -795,9 +795,9 @@ void ovs_flow_tbl_insert(struct flow_table *table, struct sw_flow *flow)
void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow) void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow)
{ {
BUG_ON(table->count == 0);
hlist_del_rcu(&flow->hash_node[table->node_ver]); hlist_del_rcu(&flow->hash_node[table->node_ver]);
table->count--; table->count--;
BUG_ON(table->count < 0);
} }
/* The size of the argument for each %OVS_KEY_ATTR_* Netlink attribute. */ /* The size of the argument for each %OVS_KEY_ATTR_* Netlink attribute. */