summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@HansenPartnership.com>2017-01-28 02:15:31 +0100
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2017-01-28 02:15:31 +0100
commit6f3e71c0c3f2479e05682e2e563b75decab36591 (patch)
tree667ccb2955a059ad7c98bd59ac38c98d6ebd958c
parentMerge remote-tracking branch 'mkp-scsi/fixes' into fixes (diff)
parentscsi: virtio_scsi: Reject commands when virtqueue is broken (diff)
downloadlinux-6f3e71c0c3f2479e05682e2e563b75decab36591.tar.xz
linux-6f3e71c0c3f2479e05682e2e563b75decab36591.zip
Merge remote-tracking branch 'mkp-scsi/4.10/scsi-fixes' into fixes
-rw-r--r--drivers/scsi/virtio_scsi.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index ec91bd07f00a..c680d7641311 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -534,7 +534,9 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi,
{
struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc);
+ unsigned long flags;
int req_size;
+ int ret;
BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize);
@@ -562,8 +564,15 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi,
req_size = sizeof(cmd->req.cmd);
}
- if (virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)) != 0)
+ ret = virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd));
+ if (ret == -EIO) {
+ cmd->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET;
+ spin_lock_irqsave(&req_vq->vq_lock, flags);
+ virtscsi_complete_cmd(vscsi, cmd);
+ spin_unlock_irqrestore(&req_vq->vq_lock, flags);
+ } else if (ret != 0) {
return SCSI_MLQUEUE_HOST_BUSY;
+ }
return 0;
}