[PATCH v2 3/3] hv: vmbus_open(): reset the channel state on ENOMEM

Jason Wang jasowang at redhat.com
Mon Feb 2 09:44:04 UTC 2015



On Mon, Feb 2, 2015 at 12:37 PM, Dexuan Cui <decui at microsoft.com> wrote:
> Without this patch, the state is put to CHANNEL_OPENING_STATE, and 
> when
> the driver is loaded next time, vmbus_open() will fail immediately 
> due to
> newchannel->state != CHANNEL_OPEN_STATE.
> 
> CC: "K. Y. Srinivasan" <kys at microsoft.com>
> Signed-off-by: Dexuan Cui <decui at microsoft.com>
> ---
> 
> v2: this is a RESEND.
> 
>  drivers/hv/channel.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
> index 2978f5e..26dcf26 100644
> --- a/drivers/hv/channel.c
> +++ b/drivers/hv/channel.c
> @@ -89,9 +89,10 @@ int vmbus_open(struct vmbus_channel *newchannel, 
> u32 send_ringbuffer_size,
>  	out = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
>  		get_order(send_ringbuffer_size + recv_ringbuffer_size));
>  
> -	if (!out)
> -		return -ENOMEM;
> -
> +	if (!out) {
> +		err = -ENOMEM;
> +		goto error0;
> +	}
>  
>  	in = (void *)((unsigned long)out + send_ringbuffer_size);
>  
> @@ -199,6 +200,7 @@ error0:
>  	free_pages((unsigned long)out,
>  		get_order(send_ringbuffer_size + recv_ringbuffer_size));
>  	kfree(open_info);
> +	newchannel->state = CHANNEL_OPEN_STATE;
>  	return err;
>  }
>  EXPORT_SYMBOL_GPL(vmbus_open);
> -- 
> 1.9.1

Reviewed-by: Jason Wang <jasowang at redhat.com>



More information about the devel mailing list