Lines Matching refs:req

67     } req;  member
86 static void virtio_scsi_init_req(VirtIOSCSI *s, VirtQueue *vq, VirtIOSCSIReq *req) in virtio_scsi_init_req() argument
90 offsetof(VirtIOSCSIReq, resp_iov) + sizeof(req->resp_iov); in virtio_scsi_init_req()
92 req->vq = vq; in virtio_scsi_init_req()
93 req->dev = s; in virtio_scsi_init_req()
94 qemu_sglist_init(&req->qsgl, DEVICE(s), 8, vdev->dma_as); in virtio_scsi_init_req()
95 qemu_iovec_init(&req->resp_iov, 1); in virtio_scsi_init_req()
96 memset((uint8_t *)req + zero_skip, 0, sizeof(*req) - zero_skip); in virtio_scsi_init_req()
99 static void virtio_scsi_free_req(VirtIOSCSIReq *req) in virtio_scsi_free_req() argument
101 qemu_iovec_destroy(&req->resp_iov); in virtio_scsi_free_req()
102 qemu_sglist_destroy(&req->qsgl); in virtio_scsi_free_req()
103 g_free(req); in virtio_scsi_free_req()
106 static void virtio_scsi_complete_req(VirtIOSCSIReq *req, QemuMutex *vq_lock) in virtio_scsi_complete_req() argument
108 VirtIOSCSI *s = req->dev; in virtio_scsi_complete_req()
109 VirtQueue *vq = req->vq; in virtio_scsi_complete_req()
112 qemu_iovec_from_buf(&req->resp_iov, 0, &req->resp, req->resp_size); in virtio_scsi_complete_req()
118 virtqueue_push(vq, &req->elem, req->qsgl.size + req->resp_iov.size); in virtio_scsi_complete_req()
129 if (req->sreq) { in virtio_scsi_complete_req()
130 req->sreq->hba_private = NULL; in virtio_scsi_complete_req()
131 scsi_req_unref(req->sreq); in virtio_scsi_complete_req()
133 virtio_scsi_free_req(req); in virtio_scsi_complete_req()
136 static void virtio_scsi_bad_req(VirtIOSCSIReq *req, QemuMutex *vq_lock) in virtio_scsi_bad_req() argument
138 virtio_error(VIRTIO_DEVICE(req->dev), "wrong size for virtio-scsi headers"); in virtio_scsi_bad_req()
144 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_scsi_bad_req()
150 virtio_scsi_free_req(req); in virtio_scsi_bad_req()
153 static size_t qemu_sgl_concat(VirtIOSCSIReq *req, struct iovec *iov, in qemu_sgl_concat() argument
156 QEMUSGList *qsgl = &req->qsgl; in qemu_sgl_concat()
176 static int virtio_scsi_parse_req(VirtIOSCSIReq *req, in virtio_scsi_parse_req() argument
179 VirtIODevice *vdev = (VirtIODevice *) req->dev; in virtio_scsi_parse_req()
182 if (iov_to_buf(req->elem.out_sg, req->elem.out_num, 0, in virtio_scsi_parse_req()
183 &req->req, req_size) < req_size) { in virtio_scsi_parse_req()
187 if (qemu_iovec_concat_iov(&req->resp_iov, in virtio_scsi_parse_req()
188 req->elem.in_sg, req->elem.in_num, 0, in virtio_scsi_parse_req()
193 req->resp_size = resp_size; in virtio_scsi_parse_req()
206 if (req->elem.out_num) { in virtio_scsi_parse_req()
207 req_size = req->elem.out_sg[0].iov_len; in virtio_scsi_parse_req()
209 if (req->elem.in_num) { in virtio_scsi_parse_req()
210 resp_size = req->elem.in_sg[0].iov_len; in virtio_scsi_parse_req()
214 out_size = qemu_sgl_concat(req, req->elem.out_sg, in virtio_scsi_parse_req()
215 &req->elem.out_addr[0], req->elem.out_num, in virtio_scsi_parse_req()
217 in_size = qemu_sgl_concat(req, req->elem.in_sg, in virtio_scsi_parse_req()
218 &req->elem.in_addr[0], req->elem.in_num, in virtio_scsi_parse_req()
226 req->mode = SCSI_XFER_TO_DEV; in virtio_scsi_parse_req()
228 req->mode = SCSI_XFER_FROM_DEV; in virtio_scsi_parse_req()
237 VirtIOSCSIReq *req; in virtio_scsi_pop_req() local
243 req = virtqueue_pop(vq, sizeof(VirtIOSCSIReq) + vs->cdb_size); in virtio_scsi_pop_req()
249 if (!req) { in virtio_scsi_pop_req()
252 virtio_scsi_init_req(s, vq, req); in virtio_scsi_pop_req()
253 return req; in virtio_scsi_pop_req()
258 VirtIOSCSIReq *req = sreq->hba_private; in virtio_scsi_save_request() local
259 VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(req->dev); in virtio_scsi_save_request()
260 VirtIODevice *vdev = VIRTIO_DEVICE(req->dev); in virtio_scsi_save_request()
261 uint32_t n = virtio_get_queue_index(req->vq) - VIRTIO_SCSI_VQ_NUM_FIXED; in virtio_scsi_save_request()
265 qemu_put_virtqueue_element(vdev, f, &req->elem); in virtio_scsi_save_request()
274 VirtIOSCSIReq *req; in virtio_scsi_load_request() local
279 req = qemu_get_virtqueue_element(vdev, f, in virtio_scsi_load_request()
281 virtio_scsi_init_req(s, vs->cmd_vqs[n], req); in virtio_scsi_load_request()
283 if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICmdReq) + vs->cdb_size, in virtio_scsi_load_request()
290 req->sreq = sreq; in virtio_scsi_load_request()
291 if (req->sreq->cmd.mode != SCSI_XFER_NONE) { in virtio_scsi_load_request()
292 assert(req->sreq->cmd.mode == req->mode); in virtio_scsi_load_request()
294 return req; in virtio_scsi_load_request()
305 trace_virtio_scsi_tmf_resp(virtio_scsi_get_lun(tmf->req.tmf.lun), in virtio_scsi_tmf_dec_remaining()
306 tmf->req.tmf.tag, tmf->resp.tmf.response); in virtio_scsi_tmf_dec_remaining()
343 SCSIDevice *d = virtio_scsi_device_get(s, tmf->req.tmf.lun); in virtio_scsi_do_tmf_aio_context()
358 switch (tmf->req.tmf.subtype) { in virtio_scsi_do_tmf_aio_context()
378 if (match_tag && cmd_req->req.cmd.tag != tmf->req.tmf.tag) { in virtio_scsi_do_tmf_aio_context()
447 if (cmd_req->req.cmd.tag == tmf->req.tmf.tag) { in find_aio_context_for_tmf_tag()
458 static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req) in virtio_scsi_do_tmf() argument
460 SCSIDevice *d = virtio_scsi_device_get(s, req->req.tmf.lun); in virtio_scsi_do_tmf()
466 req->resp.tmf.response = VIRTIO_SCSI_S_OK; in virtio_scsi_do_tmf()
472 req->req.tmf.subtype = in virtio_scsi_do_tmf()
473 virtio_tswap32(VIRTIO_DEVICE(s), req->req.tmf.subtype); in virtio_scsi_do_tmf()
475 trace_virtio_scsi_tmf_req(virtio_scsi_get_lun(req->req.tmf.lun), in virtio_scsi_do_tmf()
476 req->req.tmf.tag, req->req.tmf.subtype); in virtio_scsi_do_tmf()
478 switch (req->req.tmf.subtype) { in virtio_scsi_do_tmf()
483 if (d->lun != virtio_scsi_get_lun(req->req.tmf.lun)) { in virtio_scsi_do_tmf()
487 ctx = find_aio_context_for_tmf_tag(d, req); in virtio_scsi_do_tmf()
489 virtio_scsi_defer_tmf_to_aio_context(req, ctx); in virtio_scsi_do_tmf()
499 if (d->lun != virtio_scsi_get_lun(req->req.tmf.lun)) { in virtio_scsi_do_tmf()
508 if (cmd_req->req.cmd.tag == req->req.tmf.tag) { in virtio_scsi_do_tmf()
514 req->resp.tmf.response = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED; in virtio_scsi_do_tmf()
524 if (d->lun != virtio_scsi_get_lun(req->req.tmf.lun)) { in virtio_scsi_do_tmf()
534 int target = req->req.tmf.lun[1]; in virtio_scsi_do_tmf()
557 if (d->lun != virtio_scsi_get_lun(req->req.tmf.lun)) { in virtio_scsi_do_tmf()
561 qatomic_inc(&req->remaining); in virtio_scsi_do_tmf()
570 virtio_scsi_defer_tmf_to_aio_context(req, ctx); in virtio_scsi_do_tmf()
573 virtio_scsi_tmf_dec_remaining(req); in virtio_scsi_do_tmf()
582 if (d->lun != virtio_scsi_get_lun(req->req.tmf.lun)) { in virtio_scsi_do_tmf()
595 req->resp.tmf.response = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED; in virtio_scsi_do_tmf()
603 req->resp.tmf.response = VIRTIO_SCSI_S_FUNCTION_REJECTED; in virtio_scsi_do_tmf()
611 req->resp.tmf.response = VIRTIO_SCSI_S_INCORRECT_LUN; in virtio_scsi_do_tmf()
616 req->resp.tmf.response = VIRTIO_SCSI_S_BAD_TARGET; in virtio_scsi_do_tmf()
621 static void virtio_scsi_handle_ctrl_req(VirtIOSCSI *s, VirtIOSCSIReq *req) in virtio_scsi_handle_ctrl_req() argument
627 if (iov_to_buf(req->elem.out_sg, req->elem.out_num, 0, in virtio_scsi_handle_ctrl_req()
629 virtio_scsi_bad_req(req, &s->ctrl_lock); in virtio_scsi_handle_ctrl_req()
635 if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICtrlTMFReq), in virtio_scsi_handle_ctrl_req()
637 virtio_scsi_bad_req(req, &s->ctrl_lock); in virtio_scsi_handle_ctrl_req()
640 r = virtio_scsi_do_tmf(s, req); in virtio_scsi_handle_ctrl_req()
645 if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICtrlANReq), in virtio_scsi_handle_ctrl_req()
647 virtio_scsi_bad_req(req, &s->ctrl_lock); in virtio_scsi_handle_ctrl_req()
650 req->req.an.event_requested = in virtio_scsi_handle_ctrl_req()
651 virtio_tswap32(VIRTIO_DEVICE(s), req->req.an.event_requested); in virtio_scsi_handle_ctrl_req()
652 trace_virtio_scsi_an_req(virtio_scsi_get_lun(req->req.an.lun), in virtio_scsi_handle_ctrl_req()
653 req->req.an.event_requested); in virtio_scsi_handle_ctrl_req()
654 req->resp.an.event_actual = 0; in virtio_scsi_handle_ctrl_req()
655 req->resp.an.response = VIRTIO_SCSI_S_OK; in virtio_scsi_handle_ctrl_req()
660 trace_virtio_scsi_tmf_resp(virtio_scsi_get_lun(req->req.tmf.lun), in virtio_scsi_handle_ctrl_req()
661 req->req.tmf.tag, in virtio_scsi_handle_ctrl_req()
662 req->resp.tmf.response); in virtio_scsi_handle_ctrl_req()
665 trace_virtio_scsi_an_resp(virtio_scsi_get_lun(req->req.an.lun), in virtio_scsi_handle_ctrl_req()
666 req->resp.an.response); in virtio_scsi_handle_ctrl_req()
667 virtio_scsi_complete_req(req, &s->ctrl_lock); in virtio_scsi_handle_ctrl_req()
675 VirtIOSCSIReq *req; in virtio_scsi_handle_ctrl_vq() local
677 while ((req = virtio_scsi_pop_req(s, vq, &s->ctrl_lock))) { in virtio_scsi_handle_ctrl_vq()
678 virtio_scsi_handle_ctrl_req(s, req); in virtio_scsi_handle_ctrl_vq()
714 static void virtio_scsi_complete_cmd_req(VirtIOSCSIReq *req) in virtio_scsi_complete_cmd_req() argument
716 trace_virtio_scsi_cmd_resp(virtio_scsi_get_lun(req->req.cmd.lun), in virtio_scsi_complete_cmd_req()
717 req->req.cmd.tag, in virtio_scsi_complete_cmd_req()
718 req->resp.cmd.response, in virtio_scsi_complete_cmd_req()
719 req->resp.cmd.status); in virtio_scsi_complete_cmd_req()
723 req->resp_size = sizeof(VirtIOSCSICmdResp); in virtio_scsi_complete_cmd_req()
724 virtio_scsi_complete_req(req, NULL); in virtio_scsi_complete_cmd_req()
729 VirtIOSCSIReq *req = r->hba_private; in virtio_scsi_command_failed() local
735 req->resp.cmd.status = GOOD; in virtio_scsi_command_failed()
738 req->resp.cmd.response = VIRTIO_SCSI_S_INCORRECT_LUN; in virtio_scsi_command_failed()
741 req->resp.cmd.response = VIRTIO_SCSI_S_BUSY; in virtio_scsi_command_failed()
745 req->resp.cmd.response = VIRTIO_SCSI_S_ABORTED; in virtio_scsi_command_failed()
748 req->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET; in virtio_scsi_command_failed()
751 req->resp.cmd.response = VIRTIO_SCSI_S_RESET; in virtio_scsi_command_failed()
754 req->resp.cmd.response = VIRTIO_SCSI_S_TRANSPORT_FAILURE; in virtio_scsi_command_failed()
757 req->resp.cmd.response = VIRTIO_SCSI_S_TARGET_FAILURE; in virtio_scsi_command_failed()
760 req->resp.cmd.response = VIRTIO_SCSI_S_NEXUS_FAILURE; in virtio_scsi_command_failed()
766 req->resp.cmd.response = VIRTIO_SCSI_S_FAILURE; in virtio_scsi_command_failed()
769 virtio_scsi_complete_cmd_req(req); in virtio_scsi_command_failed()
774 VirtIOSCSIReq *req = r->hba_private; in virtio_scsi_command_complete() local
777 VirtIODevice *vdev = VIRTIO_DEVICE(req->dev); in virtio_scsi_command_complete()
783 req->resp.cmd.response = VIRTIO_SCSI_S_OK; in virtio_scsi_command_complete()
784 req->resp.cmd.status = r->status; in virtio_scsi_command_complete()
785 if (req->resp.cmd.status == GOOD) { in virtio_scsi_command_complete()
786 req->resp.cmd.resid = virtio_tswap32(vdev, resid); in virtio_scsi_command_complete()
788 req->resp.cmd.resid = 0; in virtio_scsi_command_complete()
790 sense_len = MIN(sense_len, req->resp_iov.size - sizeof(req->resp.cmd)); in virtio_scsi_command_complete()
791 qemu_iovec_from_buf(&req->resp_iov, sizeof(req->resp.cmd), in virtio_scsi_command_complete()
793 req->resp.cmd.sense_len = virtio_tswap32(vdev, sense_len); in virtio_scsi_command_complete()
795 virtio_scsi_complete_cmd_req(req); in virtio_scsi_command_complete()
802 VirtIOSCSIReq *req = hba_private; in virtio_scsi_parse_cdb() local
812 cmd->xfer = req->qsgl.size; in virtio_scsi_parse_cdb()
813 cmd->mode = req->mode; in virtio_scsi_parse_cdb()
819 VirtIOSCSIReq *req = r->hba_private; in virtio_scsi_get_sg_list() local
821 return &req->qsgl; in virtio_scsi_get_sg_list()
826 VirtIOSCSIReq *req = r->hba_private; in virtio_scsi_request_cancelled() local
828 if (!req) { in virtio_scsi_request_cancelled()
831 if (qatomic_read(&req->dev->resetting)) { in virtio_scsi_request_cancelled()
832 req->resp.cmd.response = VIRTIO_SCSI_S_RESET; in virtio_scsi_request_cancelled()
834 req->resp.cmd.response = VIRTIO_SCSI_S_ABORTED; in virtio_scsi_request_cancelled()
836 virtio_scsi_complete_cmd_req(req); in virtio_scsi_request_cancelled()
839 static void virtio_scsi_fail_cmd_req(VirtIOSCSIReq *req) in virtio_scsi_fail_cmd_req() argument
841 req->resp.cmd.response = VIRTIO_SCSI_S_FAILURE; in virtio_scsi_fail_cmd_req()
842 virtio_scsi_complete_cmd_req(req); in virtio_scsi_fail_cmd_req()
845 static int virtio_scsi_handle_cmd_req_prepare(VirtIOSCSI *s, VirtIOSCSIReq *req) in virtio_scsi_handle_cmd_req_prepare() argument
851 rc = virtio_scsi_parse_req(req, sizeof(VirtIOSCSICmdReq) + vs->cdb_size, in virtio_scsi_handle_cmd_req_prepare()
855 virtio_scsi_fail_cmd_req(req); in virtio_scsi_handle_cmd_req_prepare()
858 virtio_scsi_bad_req(req, NULL); in virtio_scsi_handle_cmd_req_prepare()
862 trace_virtio_scsi_cmd_req(virtio_scsi_get_lun(req->req.cmd.lun), in virtio_scsi_handle_cmd_req_prepare()
863 req->req.cmd.tag, req->req.cmd.cdb[0]); in virtio_scsi_handle_cmd_req_prepare()
865 d = virtio_scsi_device_get(s, req->req.cmd.lun); in virtio_scsi_handle_cmd_req_prepare()
867 req->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET; in virtio_scsi_handle_cmd_req_prepare()
868 virtio_scsi_complete_cmd_req(req); in virtio_scsi_handle_cmd_req_prepare()
871 req->sreq = scsi_req_new(d, req->req.cmd.tag, in virtio_scsi_handle_cmd_req_prepare()
872 virtio_scsi_get_lun(req->req.cmd.lun), in virtio_scsi_handle_cmd_req_prepare()
873 req->req.cmd.cdb, vs->cdb_size, req); in virtio_scsi_handle_cmd_req_prepare()
875 if (req->sreq->cmd.mode != SCSI_XFER_NONE in virtio_scsi_handle_cmd_req_prepare()
876 && (req->sreq->cmd.mode != req->mode || in virtio_scsi_handle_cmd_req_prepare()
877 req->sreq->cmd.xfer > req->qsgl.size)) { in virtio_scsi_handle_cmd_req_prepare()
878 req->resp.cmd.response = VIRTIO_SCSI_S_OVERRUN; in virtio_scsi_handle_cmd_req_prepare()
879 virtio_scsi_complete_cmd_req(req); in virtio_scsi_handle_cmd_req_prepare()
883 scsi_req_ref(req->sreq); in virtio_scsi_handle_cmd_req_prepare()
889 static void virtio_scsi_handle_cmd_req_submit(VirtIOSCSI *s, VirtIOSCSIReq *req) in virtio_scsi_handle_cmd_req_submit() argument
891 SCSIRequest *sreq = req->sreq; in virtio_scsi_handle_cmd_req_submit()
901 VirtIOSCSIReq *req, *next; in virtio_scsi_handle_cmd_vq() local
912 while ((req = virtio_scsi_pop_req(s, vq, NULL))) { in virtio_scsi_handle_cmd_vq()
913 ret = virtio_scsi_handle_cmd_req_prepare(s, req); in virtio_scsi_handle_cmd_vq()
915 QTAILQ_INSERT_TAIL(&reqs, req, next); in virtio_scsi_handle_cmd_vq()
919 req = QTAILQ_FIRST(&reqs); in virtio_scsi_handle_cmd_vq()
920 QTAILQ_REMOVE(&reqs, req, next); in virtio_scsi_handle_cmd_vq()
922 scsi_req_unref(req->sreq); in virtio_scsi_handle_cmd_vq()
923 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_scsi_handle_cmd_vq()
924 virtio_scsi_free_req(req); in virtio_scsi_handle_cmd_vq()
934 QTAILQ_FOREACH_SAFE(req, &reqs, next, next) { in virtio_scsi_handle_cmd_vq()
935 virtio_scsi_handle_cmd_req_submit(s, req); in virtio_scsi_handle_cmd_vq()
1035 VirtIOSCSIReq *req; in virtio_scsi_push_event() local
1045 req = virtio_scsi_pop_req(s, vs->event_vq, &s->event_lock); in virtio_scsi_push_event()
1047 if (!req) { in virtio_scsi_push_event()
1058 if (virtio_scsi_parse_req(req, 0, sizeof(VirtIOSCSIEvent))) { in virtio_scsi_push_event()
1059 virtio_scsi_bad_req(req, &s->event_lock); in virtio_scsi_push_event()
1063 evt = &req->resp.event; in virtio_scsi_push_event()
1079 virtio_scsi_complete_req(req, &s->event_lock); in virtio_scsi_push_event()