diff options
| -rw-r--r-- | net/openvswitch/datapath.c | 30 | 
1 files changed, 18 insertions, 12 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index a4b724708a1..6980c3e6f06 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,  		return ERR_PTR(-ENOMEM);  	retval = ovs_vport_cmd_fill_info(vport, skb, portid, seq, 0, cmd); -	if (retval < 0) { -		kfree_skb(skb); -		return ERR_PTR(retval); -	} +	BUG_ON(retval < 0); +  	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)  		err = -EINVAL; +	reply = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); +	if (!reply) { +		err = -ENOMEM; +		goto exit_unlock; +	} +  	if (!err && a[OVS_VPORT_ATTR_OPTIONS])  		err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]);  	if (err) -		goto exit_unlock; +		goto exit_free; +  	if (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, -					 OVS_VPORT_CMD_NEW); -	if (IS_ERR(reply)) { -		netlink_set_err(sock_net(skb->sk)->genl_sock, 0, -				ovs_dp_vport_multicast_group.id, PTR_ERR(reply)); -		goto exit_unlock; -	} +	err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, +				      info->snd_seq, 0, OVS_VPORT_CMD_NEW); +	BUG_ON(err < 0);  	genl_notify(reply, genl_info_net(info), info->snd_portid,  		    ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL); +	rtnl_unlock(); +	return 0; + +exit_free: +	kfree_skb(reply);  exit_unlock:  	rtnl_unlock();  	return err;  |