Skip to content

Commit

Permalink
scsi: virtio_scsi: Always try to read VPD pages
Browse files Browse the repository at this point in the history
Passed through SCSI targets 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.

This adds a workaround to address this, forcing devices attached to a
virtio-scsi controller to always check the VPD pages.  This is modelled
on a similar workaround for the storvsc (Hyper-V) SCSI controller,
although that exists for slightly different reasons.

A specific case which causes this is a volume from IBM's IPR RAID
controller (which presents as an SPC-2 device, although it does support
VPD) passed through with qemu's 'scsi-block' device.

[mkp: fixed typo]

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
David Gibson authored and Martin K. Petersen committed Apr 19, 2017
1 parent ea98ab3 commit 25d1d50
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions drivers/scsi/virtio_scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 25d1d50

Please sign in to comment.