mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 07:30:16 +00:00
Drivers: hv: vmbus: Remove the channel from the channel list(s) on failure
Properly rollback state in vmbus_pocess_offer() in the failure paths. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2dd37cb815
commit
5b1e5b5307
@ -386,7 +386,7 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel)
|
||||
&newchannel->offermsg.offer.if_instance,
|
||||
newchannel);
|
||||
if (!newchannel->device_obj)
|
||||
goto err_free_chan;
|
||||
goto err_deq_chan;
|
||||
|
||||
/*
|
||||
* Add the new device to the bus. This will kick off device-driver
|
||||
@ -398,15 +398,26 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel)
|
||||
pr_err("unable to add child device object (relid %d)\n",
|
||||
newchannel->offermsg.child_relid);
|
||||
|
||||
spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
|
||||
list_del(&newchannel->listentry);
|
||||
spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
|
||||
kfree(newchannel->device_obj);
|
||||
goto err_free_chan;
|
||||
goto err_deq_chan;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
err_deq_chan:
|
||||
spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
|
||||
list_del(&newchannel->listentry);
|
||||
spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
|
||||
|
||||
if (newchannel->target_cpu != get_cpu()) {
|
||||
put_cpu();
|
||||
smp_call_function_single(newchannel->target_cpu,
|
||||
percpu_channel_deq, newchannel, true);
|
||||
} else {
|
||||
percpu_channel_deq(newchannel);
|
||||
put_cpu();
|
||||
}
|
||||
|
||||
err_free_chan:
|
||||
free_channel(newchannel);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user