|
@@ -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)
|