|
@@ -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,
|