Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b1e5b53 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman
Browse files

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: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2dd37cb8
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -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);
}