diff options
Diffstat (limited to 'drivers/scsi/virtio_scsi.c')
-rw-r--r-- | drivers/scsi/virtio_scsi.c | 11 |
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, | |||
534 | { | 534 | { |
535 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); | 535 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); |
536 | struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc); | 536 | struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc); |
537 | unsigned long flags; | ||
537 | int req_size; | 538 | int req_size; |
539 | int ret; | ||
538 | 540 | ||
539 | BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize); | 541 | BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize); |
540 | 542 | ||
@@ -562,8 +564,15 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, | |||
562 | req_size = sizeof(cmd->req.cmd); | 564 | req_size = sizeof(cmd->req.cmd); |
563 | } | 565 | } |
564 | 566 | ||
565 | if (virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)) != 0) | 567 | ret = virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)); |
568 | if (ret == -EIO) { | ||
569 | cmd->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET; | ||
570 | spin_lock_irqsave(&req_vq->vq_lock, flags); | ||
571 | virtscsi_complete_cmd(vscsi, cmd); | ||
572 | spin_unlock_irqrestore(&req_vq->vq_lock, flags); | ||
573 | } else if (ret != 0) { | ||
566 | return SCSI_MLQUEUE_HOST_BUSY; | 574 | return SCSI_MLQUEUE_HOST_BUSY; |
575 | } | ||
567 | return 0; | 576 | return 0; |
568 | } | 577 | } |
569 | 578 | ||