]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/scsi/virtio_scsi.c
Merge tag 'for-4.12/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device...
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / virtio_scsi.c
index 939c47df73fa9756faa94fb7eede86a919f1144a..a29d068b76962df07b67f4885e0c67d4c3342f64 100644 (file)
@@ -29,6 +29,7 @@
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_tcq.h>
+#include <scsi/scsi_devinfo.h>
 #include <linux/seqlock.h>
 #include <linux/blk-mq-virtio.h>
 
@@ -705,6 +706,28 @@ static int virtscsi_device_reset(struct scsi_cmnd *sc)
        return virtscsi_tmf(vscsi, cmd);
 }
 
+static int virtscsi_device_alloc(struct scsi_device *sdevice)
+{
+       /*
+        * Passed through SCSI targets (e.g. with qemu's 'scsi-block')
+        * may have transfer limits which come from the host SCSI
+        * controller or something on the host side other than the
+        * target itself.
+        *
+        * To make this work properly, the hypervisor can adjust the
+        * target's VPD information to advertise these limits.  But
+        * for that to work, the guest has to look at the VPD pages,
+        * which we won't do by default if it is an SPC-2 device, even
+        * if it does actually support it.
+        *
+        * So, set the blist to always try to read the VPD pages.
+        */
+       sdevice->sdev_bflags = BLIST_TRY_VPD_PAGES;
+
+       return 0;
+}
+
+
 /**
  * virtscsi_change_queue_depth() - Change a virtscsi target's queue depth
  * @sdev:      Virtscsi target whose queue depth to change
@@ -783,6 +806,7 @@ static struct scsi_host_template virtscsi_host_template_single = {
        .change_queue_depth = virtscsi_change_queue_depth,
        .eh_abort_handler = virtscsi_abort,
        .eh_device_reset_handler = virtscsi_device_reset,
+       .slave_alloc = virtscsi_device_alloc,
 
        .can_queue = 1024,
        .dma_boundary = UINT_MAX,