Commit b2f96656 authored by Dexuan Cui's avatar Dexuan Cui Committed by Martin K. Petersen
Browse files

scsi: storvsc: Increase the timeouts to storvsc_timeout



Currently storvsc_timeout is only used in storvsc_sdev_configure(), and
5s and 10s are used elsewhere. It turns out that rarely the 5s is not
enough on Azure, so let's use storvsc_timeout everywhere.

In case a timeout happens and storvsc_channel_init() returns an error,
close the VMBus channel so that any host-to-guest messages in the
channel's ringbuffer, which might come late, can be safely ignored.

Add a "const" to storvsc_timeout.

Cc: stable@kernel.org
Signed-off-by: default avatarDexuan Cui <decui@microsoft.com>
Link: https://lore.kernel.org/r/1749243459-10419-1-git-send-email-decui@microsoft.com


Reviewed-by: default avatarLong Li <longli@microsoft.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent a3da9388
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -362,7 +362,7 @@ MODULE_PARM_DESC(ring_avail_percent_lowater,
/*
 * Timeout in seconds for all devices managed by this driver.
 */
static int storvsc_timeout = 180;
static const int storvsc_timeout = 180;

#if IS_ENABLED(CONFIG_SCSI_FC_ATTRS)
static struct scsi_transport_template *fc_transport_template;
@@ -768,7 +768,7 @@ static void handle_multichannel_storage(struct hv_device *device, int max_chns)
		return;
	}

	t = wait_for_completion_timeout(&request->wait_event, 10*HZ);
	t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ);
	if (t == 0) {
		dev_err(dev, "Failed to create sub-channel: timed out\n");
		return;
@@ -833,7 +833,7 @@ static int storvsc_execute_vstor_op(struct hv_device *device,
	if (ret != 0)
		return ret;

	t = wait_for_completion_timeout(&request->wait_event, 5*HZ);
	t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ);
	if (t == 0)
		return -ETIMEDOUT;

@@ -1350,6 +1350,8 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size,
		return ret;

	ret = storvsc_channel_init(device, is_fc);
	if (ret)
		vmbus_close(device->channel);

	return ret;
}
@@ -1668,7 +1670,7 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd)
	if (ret != 0)
		return FAILED;

	t = wait_for_completion_timeout(&request->wait_event, 5*HZ);
	t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ);
	if (t == 0)
		return TIMEOUT_ERROR;