]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: storvsc: Increase the timeouts to storvsc_timeout
authorDexuan Cui <decui@microsoft.com>
Fri, 6 Jun 2025 20:57:39 +0000 (13:57 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:07:37 +0000 (11:07 +0100)
commit b2f966568faaad326de97481096d0f3dc0971c43 upstream.

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: Dexuan Cui <decui@microsoft.com>
Link: https://lore.kernel.org/r/1749243459-10419-1-git-send-email-decui@microsoft.com
Reviewed-by: Long Li <longli@microsoft.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/storvsc_drv.c

index 591186daf46f3afbfe015ed567c44d209f247e50..8bdad9c4a71a47a91d4eaaed5fc42da3790b3d9a 100644 (file)
@@ -358,7 +358,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;
@@ -764,7 +764,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;
@@ -829,7 +829,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;
 
@@ -1342,6 +1342,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;
 }
@@ -1659,7 +1661,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;