|
@@ -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;
|
|
|
}
|
|
|
|