diff options
| -rw-r--r-- | drivers/scsi/virtio_scsi.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index bcad917fd89a..308256b5e4cb 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c | |||
| @@ -237,6 +237,16 @@ static void virtscsi_req_done(struct virtqueue *vq) | |||
| 237 | virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd); | 237 | virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd); |
| 238 | }; | 238 | }; |
| 239 | 239 | ||
| 240 | static void virtscsi_poll_requests(struct virtio_scsi *vscsi) | ||
| 241 | { | ||
| 242 | int i, num_vqs; | ||
| 243 | |||
| 244 | num_vqs = vscsi->num_queues; | ||
| 245 | for (i = 0; i < num_vqs; i++) | ||
| 246 | virtscsi_vq_done(vscsi, &vscsi->req_vqs[i], | ||
| 247 | virtscsi_complete_cmd); | ||
| 248 | } | ||
| 249 | |||
| 240 | static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) | 250 | static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) |
| 241 | { | 251 | { |
| 242 | struct virtio_scsi_cmd *cmd = buf; | 252 | struct virtio_scsi_cmd *cmd = buf; |
| @@ -591,6 +601,18 @@ static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) | |||
| 591 | cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) | 601 | cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) |
| 592 | ret = SUCCESS; | 602 | ret = SUCCESS; |
| 593 | 603 | ||
| 604 | /* | ||
| 605 | * The spec guarantees that all requests related to the TMF have | ||
| 606 | * been completed, but the callback might not have run yet if | ||
| 607 | * we're using independent interrupts (e.g. MSI). Poll the | ||
| 608 | * virtqueues once. | ||
| 609 | * | ||
| 610 | * In the abort case, sc->scsi_done will do nothing, because | ||
| 611 | * the block layer must have detected a timeout and as a result | ||
| 612 | * REQ_ATOM_COMPLETE has been set. | ||
| 613 | */ | ||
| 614 | virtscsi_poll_requests(vscsi); | ||
| 615 | |||
| 594 | out: | 616 | out: |
| 595 | mempool_free(cmd, virtscsi_cmd_pool); | 617 | mempool_free(cmd, virtscsi_cmd_pool); |
| 596 | return ret; | 618 | return ret; |
