|
@@ -237,6 +237,16 @@ static void virtscsi_req_done(struct virtqueue *vq)
|
|
|
virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd);
|
|
|
};
|
|
|
|
|
|
+static void virtscsi_poll_requests(struct virtio_scsi *vscsi)
|
|
|
+{
|
|
|
+ int i, num_vqs;
|
|
|
+
|
|
|
+ num_vqs = vscsi->num_queues;
|
|
|
+ for (i = 0; i < num_vqs; i++)
|
|
|
+ virtscsi_vq_done(vscsi, &vscsi->req_vqs[i],
|
|
|
+ virtscsi_complete_cmd);
|
|
|
+}
|
|
|
+
|
|
|
static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf)
|
|
|
{
|
|
|
struct virtio_scsi_cmd *cmd = buf;
|
|
@@ -591,6 +601,18 @@ static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)
|
|
|
cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED)
|
|
|
ret = SUCCESS;
|
|
|
|
|
|
+ /*
|
|
|
+ * The spec guarantees that all requests related to the TMF have
|
|
|
+ * been completed, but the callback might not have run yet if
|
|
|
+ * we're using independent interrupts (e.g. MSI). Poll the
|
|
|
+ * virtqueues once.
|
|
|
+ *
|
|
|
+ * In the abort case, sc->scsi_done will do nothing, because
|
|
|
+ * the block layer must have detected a timeout and as a result
|
|
|
+ * REQ_ATOM_COMPLETE has been set.
|
|
|
+ */
|
|
|
+ virtscsi_poll_requests(vscsi);
|
|
|
+
|
|
|
out:
|
|
|
mempool_free(cmd, virtscsi_cmd_pool);
|
|
|
return ret;
|