ALSA: usb-audio: Don't resubmit pending URBs at MIDI error recovery
[pandora-kernel.git] / drivers / hv / channel.c
index 4065374..44a1ea4 100644 (file)
@@ -146,14 +146,14 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 
        if (ret != 0) {
                err = ret;
-               goto errorout;
+               goto error0;
        }
 
        ret = hv_ringbuffer_init(
                &newchannel->inbound, in, recv_ringbuffer_size);
        if (ret != 0) {
                err = ret;
-               goto errorout;
+               goto error0;
        }
 
 
@@ -168,7 +168,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 
        if (ret != 0) {
                err = ret;
-               goto errorout;
+               goto error0;
        }
 
        /* Create and init the channel open message */
@@ -177,7 +177,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
                           GFP_KERNEL);
        if (!open_info) {
                err = -ENOMEM;
-               goto errorout;
+               goto error0;
        }
 
        init_completion(&open_info->waitevent);
@@ -193,7 +193,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 
        if (userdatalen > MAX_USER_DEFINED_BYTES) {
                err = -EINVAL;
-               goto errorout;
+               goto error0;
        }
 
        if (userdatalen)
@@ -207,20 +207,21 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
        ret = vmbus_post_msg(open_msg,
                               sizeof(struct vmbus_channel_open_channel));
 
-       if (ret != 0)
-               goto cleanup;
+       if (ret != 0) {
+               err = ret;
+               goto error1;
+       }
 
        t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ);
        if (t == 0) {
                err = -ETIMEDOUT;
-               goto errorout;
+               goto error1;
        }
 
 
        if (open_info->response.open_result.status)
                err = open_info->response.open_result.status;
 
-cleanup:
        spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
        list_del(&open_info->msglistentry);
        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
@@ -228,9 +229,12 @@ cleanup:
        kfree(open_info);
        return err;
 
-errorout:
-       hv_ringbuffer_cleanup(&newchannel->outbound);
-       hv_ringbuffer_cleanup(&newchannel->inbound);
+error1:
+       spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
+       list_del(&open_info->msglistentry);
+       spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
+
+error0:
        free_pages((unsigned long)out,
                get_order(send_ringbuffer_size + recv_ringbuffer_size));
        kfree(open_info);
@@ -398,7 +402,6 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
        u32 next_gpadl_handle;
        unsigned long flags;
        int ret = 0;
-       int t;
 
        next_gpadl_handle = atomic_read(&vmbus_connection.next_gpadl_handle);
        atomic_inc(&vmbus_connection.next_gpadl_handle);
@@ -445,9 +448,7 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
 
                }
        }
-       t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ);
-       BUG_ON(t == 0);
-
+       wait_for_completion(&msginfo->waitevent);
 
        /* At this point, we received the gpadl created msg */
        *gpadl_handle = gpadlmsg->gpadl;
@@ -470,7 +471,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
        struct vmbus_channel_gpadl_teardown *msg;
        struct vmbus_channel_msginfo *info;
        unsigned long flags;
-       int ret, t;
+       int ret;
 
        info = kmalloc(sizeof(*info) +
                       sizeof(struct vmbus_channel_gpadl_teardown), GFP_KERNEL);
@@ -492,11 +493,12 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
        ret = vmbus_post_msg(msg,
                               sizeof(struct vmbus_channel_gpadl_teardown));
 
-       BUG_ON(ret != 0);
-       t = wait_for_completion_timeout(&info->waitevent, 5*HZ);
-       BUG_ON(t == 0);
+       if (ret)
+               goto post_msg_err;
 
-       /* Received a torndown response */
+       wait_for_completion(&info->waitevent);
+
+post_msg_err:
        spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
        list_del(&info->msglistentry);
        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
@@ -529,11 +531,28 @@ void vmbus_close(struct vmbus_channel *channel)
 
        ret = vmbus_post_msg(msg, sizeof(struct vmbus_channel_close_channel));
 
-       BUG_ON(ret != 0);
+       if (ret) {
+               pr_err("Close failed: close post msg return is %d\n", ret);
+               /*
+                * If we failed to post the close msg,
+                * it is perhaps better to leak memory.
+                */
+               return;
+       }
+
        /* Tear down the gpadl for the channel's ring buffer */
-       if (channel->ringbuffer_gpadlhandle)
-               vmbus_teardown_gpadl(channel,
-                                         channel->ringbuffer_gpadlhandle);
+       if (channel->ringbuffer_gpadlhandle) {
+               ret = vmbus_teardown_gpadl(channel,
+                                          channel->ringbuffer_gpadlhandle);
+               if (ret) {
+                       pr_err("Close failed: teardown gpadl return %d\n", ret);
+                       /*
+                        * If we failed to teardown gpadl,
+                        * it is perhaps better to leak memory.
+                        */
+                       return;
+               }
+       }
 
        /* Cleanup the ring buffers for this channel */
        hv_ringbuffer_cleanup(&channel->outbound);