Drivers: hv: vmbus: Handle channel rescind message correctly
authorK. Y. Srinivasan <kys@microsoft.com>
Fri, 15 Mar 2013 19:25:44 +0000 (12:25 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Mar 2013 19:11:51 +0000 (12:11 -0700)
Properly cleanup the channel state on receipt of the "offer rescind" message.
Starting with ws2012, the host requires that the channel "relid" be properly
cleaned up when the offer is rescinded.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel_mgmt.c

index ff1be167eb040f76950f708a308186d30615ac6f..bad8128b283a8752a11e1c3a13d02c83bb1df07b 100644 (file)
@@ -165,8 +165,19 @@ static void vmbus_process_rescind_offer(struct work_struct *work)
        struct vmbus_channel *channel = container_of(work,
                                                     struct vmbus_channel,
                                                     work);
+       unsigned long flags;
+       struct vmbus_channel_relid_released msg;
 
        vmbus_device_unregister(channel->device_obj);
+       memset(&msg, 0, sizeof(struct vmbus_channel_relid_released));
+       msg.child_relid = channel->offermsg.child_relid;
+       msg.header.msgtype = CHANNELMSG_RELID_RELEASED;
+       vmbus_post_msg(&msg, sizeof(struct vmbus_channel_relid_released));
+
+       spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
+       list_del(&channel->listentry);
+       spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
+       free_channel(channel);
 }
 
 void vmbus_free_channels(void)