diff options
Diffstat (limited to 'net/openvswitch/datapath.c')
| -rw-r--r-- | net/openvswitch/datapath.c | 14 | 
1 files changed, 7 insertions, 7 deletions
| diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 832f898edb6a..9d6ef6cb9b26 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -1703,13 +1703,13 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)  	parms.port_no = OVSP_LOCAL;  	parms.upcall_portids = a[OVS_DP_ATTR_UPCALL_PID]; -	err = ovs_dp_change(dp, a); -	if (err) -		goto err_destroy_meters; -  	/* So far only local changes have been made, now need the lock. */  	ovs_lock(); +	err = ovs_dp_change(dp, a); +	if (err) +		goto err_unlock_and_destroy_meters; +  	vport = new_vport(&parms);  	if (IS_ERR(vport)) {  		err = PTR_ERR(vport); @@ -1725,8 +1725,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)  				ovs_dp_reset_user_features(skb, info);  		} -		ovs_unlock(); -		goto err_destroy_meters; +		goto err_unlock_and_destroy_meters;  	}  	err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, @@ -1741,7 +1740,8 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)  	ovs_notify(&dp_datapath_genl_family, reply, info);  	return 0; -err_destroy_meters: +err_unlock_and_destroy_meters: +	ovs_unlock();  	ovs_meters_exit(dp);  err_destroy_ports:  	kfree(dp->ports); |