Commit f52078cf authored by Dexuan Cui's avatar Dexuan Cui Committed by Greg Kroah-Hartman

Drivers: hv: vmbus: release relid on error in vmbus_process_offer()

We want to simplify vmbus_onoffer_rescind() by not invoking
hv_process_channel_removal(NULL, ...).
Signed-off-by: default avatarDexuan Cui <decui@microsoft.com>
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 34c6801e
...@@ -177,19 +177,22 @@ static void percpu_channel_deq(void *arg) ...@@ -177,19 +177,22 @@ static void percpu_channel_deq(void *arg)
} }
void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid) static void vmbus_release_relid(u32 relid)
{ {
struct vmbus_channel_relid_released msg; struct vmbus_channel_relid_released msg;
unsigned long flags;
struct vmbus_channel *primary_channel;
memset(&msg, 0, sizeof(struct vmbus_channel_relid_released)); memset(&msg, 0, sizeof(struct vmbus_channel_relid_released));
msg.child_relid = relid; msg.child_relid = relid;
msg.header.msgtype = CHANNELMSG_RELID_RELEASED; msg.header.msgtype = CHANNELMSG_RELID_RELEASED;
vmbus_post_msg(&msg, sizeof(struct vmbus_channel_relid_released)); vmbus_post_msg(&msg, sizeof(struct vmbus_channel_relid_released));
}
if (channel == NULL) void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
return; {
unsigned long flags;
struct vmbus_channel *primary_channel;
vmbus_release_relid(relid);
BUG_ON(!channel->rescind); BUG_ON(!channel->rescind);
...@@ -336,6 +339,8 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel) ...@@ -336,6 +339,8 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel)
return; return;
err_deq_chan: err_deq_chan:
vmbus_release_relid(newchannel->offermsg.child_relid);
spin_lock_irqsave(&vmbus_connection.channel_lock, flags); spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
list_del(&newchannel->listentry); list_del(&newchannel->listentry);
spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags); spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
...@@ -587,7 +592,11 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr) ...@@ -587,7 +592,11 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
channel = relid2channel(rescind->child_relid); channel = relid2channel(rescind->child_relid);
if (channel == NULL) { if (channel == NULL) {
hv_process_channel_removal(NULL, rescind->child_relid); /*
* This is very impossible, because in
* vmbus_process_offer(), we have already invoked
* vmbus_release_relid() on error.
*/
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment