RE: [PATCH] storvsc: workaround for virtual DVD SCSI version
From: KY Srinivasan
Date: Tue Mar 07 2017 - 12:58:26 EST
> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen@xxxxxxxxxxxxxxxxxx]
> Sent: Tuesday, March 7, 2017 9:16 AM
> To: KY Srinivasan <kys@xxxxxxxxxxxxx>; Haiyang Zhang
> <haiyangz@xxxxxxxxxxxxx>; Long Li <longli@xxxxxxxxxxxxx>;
> martin.petersen@xxxxxxxxxx; hch@xxxxxx; hare@xxxxxxx
> Cc: linux-scsi@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> devel@xxxxxxxxxxxxxxxxxxxxxx; Stephen Hemminger
> <sthemmin@xxxxxxxxxxxxx>
> Subject: [PATCH] storvsc: workaround for virtual DVD SCSI version
>
> Hyper-V host emulation of SCSI for virtual DVD device reports SCSI
> version 0 (UNKNOWN) but is still capable of supporting REPORTLUN.
>
> Without this patch, a GEN2 Linux guest on Hyper-V will not boot 4.11
> successfully with virtual DVD ROM device. What happens is that the
> SCSI scan process falls back to doing sequential probing by INQUIRY.
> But the storvsc driver has a previous workaround that masks/blocks all
> errors reports from INQUIRY (or MODE_SENSE) commands. This workaround
> causes the scan to then populate a full set of bogus LUN's on the
> target and then sends kernel spinning off into a death spiral doing
> block reads on the non-existent LUNs.
>
> By setting the correct blacklist flags, the target with the
> DVD device is scanned with REPORTLUN and that works correctly.
>
> Patch needs to go in current 4.11, it is safe but not necessary
> in older kernels.
>
> Signed-off-by: Stephen Hemminger <sthemmin@xxxxxxxxxxxxx>
Reviewed-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx>
> ---
> drivers/scsi/storvsc_drv.c | 27 +++++++++++++++++----------
> 1 file changed, 17 insertions(+), 10 deletions(-)
>
> PS: The error handling does need to be fixed (have patches pending)
> but that is interrelated with hotplug and can wait.
>
> diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
> index 638e5f427c90..19973e874830 100644
> --- a/drivers/scsi/storvsc_drv.c
> +++ b/drivers/scsi/storvsc_drv.c
> @@ -400,8 +400,6 @@
> MODULE_PARM_DESC(storvsc_vcpus_per_sub_channel, "Ratio of VCPUs to
> subchannels")
> */
> static int storvsc_timeout = 180;
>
> -static int msft_blist_flags = BLIST_TRY_VPD_PAGES;
> -
> #if IS_ENABLED(CONFIG_SCSI_FC_ATTRS)
> static struct scsi_transport_template *fc_transport_template;
> #endif
> @@ -1383,6 +1381,22 @@ static int storvsc_do_io(struct hv_device *device,
> return ret;
> }
>
> +static int storvsc_device_alloc(struct scsi_device *sdevice)
> +{
> + /*
> + * Set blist flag to permit the reading of the VPD pages even when
> + * the target may claim SPC-2 compliance. MSFT targets currently
> + * claim SPC-2 compliance while they implement post SPC-2 features.
> + * With this flag we can correctly handle WRITE_SAME_16 issues.
> + *
> + * Hypervisor reports SCSI_UNKNOWN type for DVD ROM device but
> + * still supports REPORT LUN.
> + */
> + sdevice->sdev_bflags = BLIST_REPORTLUN2 |
> BLIST_TRY_VPD_PAGES;
> +
> + return 0;
> +}
> +
> static int storvsc_device_configure(struct scsi_device *sdevice)
> {
>
> @@ -1396,14 +1410,6 @@ static int storvsc_device_configure(struct
> scsi_device *sdevice)
> sdevice->no_write_same = 1;
>
> /*
> - * Add blist flags to permit the reading of the VPD pages even when
> - * the target may claim SPC-2 compliance. MSFT targets currently
> - * claim SPC-2 compliance while they implement post SPC-2 features.
> - * With this patch we can correctly handle WRITE_SAME_16 issues.
> - */
> - sdevice->sdev_bflags |= msft_blist_flags;
> -
> - /*
> * If the host is WIN8 or WIN8 R2, claim conformance to SPC-3
> * if the device is a MSFT virtual device. If the host is
> * WIN10 or newer, allow write_same.
> @@ -1661,6 +1667,7 @@ static struct scsi_host_template scsi_driver = {
> .eh_host_reset_handler = storvsc_host_reset_handler,
> .proc_name = "storvsc_host",
> .eh_timed_out = storvsc_eh_timed_out,
> + .slave_alloc = storvsc_device_alloc,
> .slave_configure = storvsc_device_configure,
> .cmd_per_lun = 255,
> .this_id = -1,
> --
> 2.11.0