| From f1c635b439a5c01776fe3a25b1e2dc546ea82e6f Mon Sep 17 00:00:00 2001 |
| From: Stephen Hemminger <stephen@networkplumber.org> |
| Date: Tue, 7 Mar 2017 09:15:53 -0800 |
| Subject: [PATCH] scsi: storvsc: Workaround for virtual DVD SCSI version |
| |
| commit f1c635b439a5c01776fe3a25b1e2dc546ea82e6f upstream. |
| |
| 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@microsoft.com> |
| Reviewed-by: K. Y. Srinivasan <kys@microsoft.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| |
| diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c |
| index 585e54f6512c..f555174f2cb7 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.12.0 |
| |