Lines Matching refs:req
44 VirtIOBlockReq *req) in virtio_blk_init_request() argument
46 req->dev = s; in virtio_blk_init_request()
47 req->vq = vq; in virtio_blk_init_request()
48 req->qiov.size = 0; in virtio_blk_init_request()
49 req->in_len = 0; in virtio_blk_init_request()
50 req->next = NULL; in virtio_blk_init_request()
51 req->mr_next = NULL; in virtio_blk_init_request()
54 void virtio_blk_req_complete(VirtIOBlockReq *req, unsigned char status) in virtio_blk_req_complete() argument
56 VirtIOBlock *s = req->dev; in virtio_blk_req_complete()
59 trace_virtio_blk_req_complete(vdev, req, status); in virtio_blk_req_complete()
61 stb_p(&req->in->status, status); in virtio_blk_req_complete()
62 iov_discard_undo(&req->inhdr_undo); in virtio_blk_req_complete()
63 iov_discard_undo(&req->outhdr_undo); in virtio_blk_req_complete()
64 virtqueue_push(req->vq, &req->elem, req->in_len); in virtio_blk_req_complete()
66 virtio_notify_irqfd(vdev, req->vq); in virtio_blk_req_complete()
68 virtio_notify(vdev, req->vq); in virtio_blk_req_complete()
72 static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error, in virtio_blk_handle_rw_error() argument
75 VirtIOBlock *s = req->dev; in virtio_blk_handle_rw_error()
81 req->mr_next = NULL; in virtio_blk_handle_rw_error()
84 req->next = s->rq; in virtio_blk_handle_rw_error()
85 s->rq = req; in virtio_blk_handle_rw_error()
88 virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); in virtio_blk_handle_rw_error()
90 block_acct_failed(blk_get_stats(s->blk), &req->acct); in virtio_blk_handle_rw_error()
92 g_free(req); in virtio_blk_handle_rw_error()
106 VirtIOBlockReq *req = next; in virtio_blk_rw_complete() local
107 next = req->mr_next; in virtio_blk_rw_complete()
108 trace_virtio_blk_rw_complete(vdev, req, ret); in virtio_blk_rw_complete()
110 if (req->qiov.nalloc != -1) { in virtio_blk_rw_complete()
114 qemu_iovec_destroy(&req->qiov); in virtio_blk_rw_complete()
118 int p = virtio_ldl_p(VIRTIO_DEVICE(s), &req->out.type); in virtio_blk_rw_complete()
128 if (virtio_blk_handle_rw_error(req, -ret, is_read, true)) { in virtio_blk_rw_complete()
133 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_rw_complete()
134 block_acct_done(blk_get_stats(s->blk), &req->acct); in virtio_blk_rw_complete()
135 g_free(req); in virtio_blk_rw_complete()
141 VirtIOBlockReq *req = opaque; in virtio_blk_flush_complete() local
142 VirtIOBlock *s = req->dev; in virtio_blk_flush_complete()
144 if (ret && virtio_blk_handle_rw_error(req, -ret, 0, true)) { in virtio_blk_flush_complete()
148 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_flush_complete()
149 block_acct_done(blk_get_stats(s->blk), &req->acct); in virtio_blk_flush_complete()
150 g_free(req); in virtio_blk_flush_complete()
155 VirtIOBlockReq *req = opaque; in virtio_blk_discard_write_zeroes_complete() local
156 VirtIOBlock *s = req->dev; in virtio_blk_discard_write_zeroes_complete()
157 bool is_write_zeroes = (virtio_ldl_p(VIRTIO_DEVICE(s), &req->out.type) & in virtio_blk_discard_write_zeroes_complete()
160 if (ret && virtio_blk_handle_rw_error(req, -ret, false, is_write_zeroes)) { in virtio_blk_discard_write_zeroes_complete()
164 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_discard_write_zeroes_complete()
166 block_acct_done(blk_get_stats(s->blk), &req->acct); in virtio_blk_discard_write_zeroes_complete()
168 g_free(req); in virtio_blk_discard_write_zeroes_complete()
173 VirtIOBlockReq *req = virtqueue_pop(vq, sizeof(VirtIOBlockReq)); in virtio_blk_get_request() local
175 if (req) { in virtio_blk_get_request()
176 virtio_blk_init_request(s, vq, req); in virtio_blk_get_request()
178 return req; in virtio_blk_get_request()
181 static void virtio_blk_handle_scsi(VirtIOBlockReq *req) in virtio_blk_handle_scsi() argument
185 VirtIOBlock *blk = req->dev; in virtio_blk_handle_scsi()
187 VirtQueueElement *elem = &req->elem; in virtio_blk_handle_scsi()
212 virtio_blk_req_complete(req, status); in virtio_blk_handle_scsi()
213 g_free(req); in virtio_blk_handle_scsi()
305 VirtIOBlockReq *req = mrb->reqs[i]; in virtio_blk_submit_multireq() local
313 if (sector_num + nb_sectors != req->sector_num || in virtio_blk_submit_multireq()
314 niov > blk_get_max_iov(s->blk) - req->qiov.niov || in virtio_blk_submit_multireq()
315 req->qiov.size > max_transfer || in virtio_blk_submit_multireq()
317 req->qiov.size) / BDRV_SECTOR_SIZE) { in virtio_blk_submit_multireq()
324 sector_num = req->sector_num; in virtio_blk_submit_multireq()
329 nb_sectors += req->qiov.size / BDRV_SECTOR_SIZE; in virtio_blk_submit_multireq()
330 niov += req->qiov.niov; in virtio_blk_submit_multireq()
338 static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer *mrb) in virtio_blk_handle_flush() argument
340 VirtIOBlock *s = req->dev; in virtio_blk_handle_flush()
342 block_acct_start(blk_get_stats(s->blk), &req->acct, 0, in virtio_blk_handle_flush()
351 blk_aio_flush(s->blk, virtio_blk_flush_complete, req); in virtio_blk_handle_flush()
376 static uint8_t virtio_blk_handle_discard_write_zeroes(VirtIOBlockReq *req, in virtio_blk_handle_discard_write_zeroes() argument
379 VirtIOBlock *s = req->dev; in virtio_blk_handle_discard_write_zeroes()
425 block_acct_start(blk_get_stats(s->blk), &req->acct, bytes, in virtio_blk_handle_discard_write_zeroes()
430 virtio_blk_discard_write_zeroes_complete, req); in virtio_blk_handle_discard_write_zeroes()
442 virtio_blk_discard_write_zeroes_complete, req); in virtio_blk_handle_discard_write_zeroes()
455 VirtIOBlockReq *req; member
519 VirtIOBlockReq *req = data->req; in virtio_blk_zone_report_complete() local
520 VirtIODevice *vdev = VIRTIO_DEVICE(req->dev); in virtio_blk_zone_report_complete()
530 trace_virtio_blk_zone_report_complete(vdev, req, nz, ret); in virtio_blk_zone_report_complete()
610 virtio_blk_req_complete(req, err_status); in virtio_blk_zone_report_complete()
611 g_free(req); in virtio_blk_zone_report_complete()
616 static void virtio_blk_handle_zone_report(VirtIOBlockReq *req, in virtio_blk_handle_zone_report() argument
620 VirtIOBlock *s = req->dev; in virtio_blk_handle_zone_report()
627 if (req->in_len < sizeof(struct virtio_blk_inhdr) + in virtio_blk_handle_zone_report()
636 offset = virtio_ldq_p(vdev, &req->out.sector) << BDRV_SECTOR_BITS; in virtio_blk_handle_zone_report()
640 nr_zones = (req->in_len - sizeof(struct virtio_blk_inhdr) - in virtio_blk_handle_zone_report()
643 trace_virtio_blk_handle_zone_report(vdev, req, in virtio_blk_handle_zone_report()
648 data->req = req; in virtio_blk_handle_zone_report()
659 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_zone_report()
660 g_free(req); in virtio_blk_handle_zone_report()
665 VirtIOBlockReq *req = opaque; in virtio_blk_zone_mgmt_complete() local
666 VirtIOBlock *s = req->dev; in virtio_blk_zone_mgmt_complete()
669 trace_virtio_blk_zone_mgmt_complete(vdev, req,ret); in virtio_blk_zone_mgmt_complete()
675 virtio_blk_req_complete(req, err_status); in virtio_blk_zone_mgmt_complete()
676 g_free(req); in virtio_blk_zone_mgmt_complete()
679 static int virtio_blk_handle_zone_mgmt(VirtIOBlockReq *req, BlockZoneOp op) in virtio_blk_handle_zone_mgmt() argument
681 VirtIOBlock *s = req->dev; in virtio_blk_handle_zone_mgmt()
684 int64_t offset = virtio_ldq_p(vdev, &req->out.sector) << BDRV_SECTOR_BITS; in virtio_blk_handle_zone_mgmt()
689 uint32_t type = virtio_ldl_p(vdev, &req->out.type); in virtio_blk_handle_zone_mgmt()
694 trace_virtio_blk_handle_zone_reset_all(vdev, req, 0, in virtio_blk_handle_zone_mgmt()
703 trace_virtio_blk_handle_zone_mgmt(vdev, req, op, in virtio_blk_handle_zone_mgmt()
713 virtio_blk_zone_mgmt_complete, req); in virtio_blk_handle_zone_mgmt()
717 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_zone_mgmt()
718 g_free(req); in virtio_blk_handle_zone_mgmt()
725 VirtIOBlockReq *req = data->req; in virtio_blk_zone_append_complete() local
726 VirtIODevice *vdev = VIRTIO_DEVICE(req->dev); in virtio_blk_zone_append_complete()
745 trace_virtio_blk_zone_append_complete(vdev, req, append_sector, ret); in virtio_blk_zone_append_complete()
748 virtio_blk_req_complete(req, err_status); in virtio_blk_zone_append_complete()
749 g_free(req); in virtio_blk_zone_append_complete()
753 static int virtio_blk_handle_zone_append(VirtIOBlockReq *req, in virtio_blk_handle_zone_append() argument
758 VirtIOBlock *s = req->dev; in virtio_blk_handle_zone_append()
762 int64_t offset = virtio_ldq_p(vdev, &req->out.sector) << BDRV_SECTOR_BITS; in virtio_blk_handle_zone_append()
766 trace_virtio_blk_handle_zone_append(vdev, req, offset >> BDRV_SECTOR_BITS); in virtio_blk_handle_zone_append()
772 data->req = req; in virtio_blk_handle_zone_append()
776 qemu_iovec_init_external(&req->qiov, out_iov, out_num); in virtio_blk_handle_zone_append()
778 block_acct_start(blk_get_stats(s->blk), &req->acct, len, in virtio_blk_handle_zone_append()
781 blk_aio_zone_append(s->blk, &data->zone_append_data.offset, &req->qiov, 0, in virtio_blk_handle_zone_append()
786 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_zone_append()
787 g_free(req); in virtio_blk_handle_zone_append()
791 static int virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb) in virtio_blk_handle_request() argument
794 struct iovec *in_iov = req->elem.in_sg; in virtio_blk_handle_request()
795 struct iovec *out_iov = req->elem.out_sg; in virtio_blk_handle_request()
796 unsigned in_num = req->elem.in_num; in virtio_blk_handle_request()
797 unsigned out_num = req->elem.out_num; in virtio_blk_handle_request()
798 VirtIOBlock *s = req->dev; in virtio_blk_handle_request()
801 if (req->elem.out_num < 1 || req->elem.in_num < 1) { in virtio_blk_handle_request()
806 if (unlikely(iov_to_buf(out_iov, out_num, 0, &req->out, in virtio_blk_handle_request()
807 sizeof(req->out)) != sizeof(req->out))) { in virtio_blk_handle_request()
812 iov_discard_front_undoable(&out_iov, &out_num, sizeof(req->out), in virtio_blk_handle_request()
813 &req->outhdr_undo); in virtio_blk_handle_request()
817 iov_discard_undo(&req->outhdr_undo); in virtio_blk_handle_request()
822 req->in_len = iov_size(in_iov, in_num); in virtio_blk_handle_request()
823 req->in = (void *)in_iov[in_num - 1].iov_base in virtio_blk_handle_request()
827 &req->inhdr_undo); in virtio_blk_handle_request()
829 type = virtio_ldl_p(vdev, &req->out.type); in virtio_blk_handle_request()
838 req->sector_num = virtio_ldq_p(vdev, &req->out.sector); in virtio_blk_handle_request()
841 qemu_iovec_init_external(&req->qiov, out_iov, out_num); in virtio_blk_handle_request()
842 trace_virtio_blk_handle_write(vdev, req, req->sector_num, in virtio_blk_handle_request()
843 req->qiov.size / BDRV_SECTOR_SIZE); in virtio_blk_handle_request()
845 qemu_iovec_init_external(&req->qiov, in_iov, in_num); in virtio_blk_handle_request()
846 trace_virtio_blk_handle_read(vdev, req, req->sector_num, in virtio_blk_handle_request()
847 req->qiov.size / BDRV_SECTOR_SIZE); in virtio_blk_handle_request()
850 if (!virtio_blk_sect_range_ok(s, req->sector_num, req->qiov.size)) { in virtio_blk_handle_request()
851 virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); in virtio_blk_handle_request()
854 g_free(req); in virtio_blk_handle_request()
858 block_acct_start(blk_get_stats(s->blk), &req->acct, req->qiov.size, in virtio_blk_handle_request()
870 mrb->reqs[mrb->num_reqs++] = req; in virtio_blk_handle_request()
875 virtio_blk_handle_flush(req, mrb); in virtio_blk_handle_request()
878 virtio_blk_handle_zone_report(req, in_iov, in_num); in virtio_blk_handle_request()
881 virtio_blk_handle_zone_mgmt(req, BLK_ZO_OPEN); in virtio_blk_handle_request()
884 virtio_blk_handle_zone_mgmt(req, BLK_ZO_CLOSE); in virtio_blk_handle_request()
887 virtio_blk_handle_zone_mgmt(req, BLK_ZO_FINISH); in virtio_blk_handle_request()
890 virtio_blk_handle_zone_mgmt(req, BLK_ZO_RESET); in virtio_blk_handle_request()
893 virtio_blk_handle_zone_mgmt(req, BLK_ZO_RESET); in virtio_blk_handle_request()
896 virtio_blk_handle_scsi(req); in virtio_blk_handle_request()
909 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_handle_request()
910 g_free(req); in virtio_blk_handle_request()
919 virtio_blk_handle_zone_append(req, out_iov, in_iov, out_num, in_num); in virtio_blk_handle_request()
941 virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP); in virtio_blk_handle_request()
942 g_free(req); in virtio_blk_handle_request()
948 iov_discard_undo(&req->inhdr_undo); in virtio_blk_handle_request()
949 iov_discard_undo(&req->outhdr_undo); in virtio_blk_handle_request()
955 err_status = virtio_blk_handle_discard_write_zeroes(req, &dwz_hdr, in virtio_blk_handle_request()
958 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_request()
959 g_free(req); in virtio_blk_handle_request()
972 !vbk->handle_unknown_request(req, mrb, type)) { in virtio_blk_handle_request()
973 virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP); in virtio_blk_handle_request()
974 g_free(req); in virtio_blk_handle_request()
983 VirtIOBlockReq *req; in virtio_blk_handle_vq() local
994 while ((req = virtio_blk_get_request(s, vq))) { in virtio_blk_handle_vq()
995 if (virtio_blk_handle_request(req, &mrb)) { in virtio_blk_handle_vq()
996 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_blk_handle_vq()
997 g_free(req); in virtio_blk_handle_vq()
1033 VirtIOBlockReq *req = opaque; in virtio_blk_dma_restart_bh() local
1034 VirtIOBlock *s = req->dev; /* we're called with at least one request */ in virtio_blk_dma_restart_bh()
1038 while (req) { in virtio_blk_dma_restart_bh()
1039 VirtIOBlockReq *next = req->next; in virtio_blk_dma_restart_bh()
1040 if (virtio_blk_handle_request(req, &mrb)) { in virtio_blk_dma_restart_bh()
1044 while (req) { in virtio_blk_dma_restart_bh()
1045 next = req->next; in virtio_blk_dma_restart_bh()
1046 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_blk_dma_restart_bh()
1047 g_free(req); in virtio_blk_dma_restart_bh()
1048 req = next; in virtio_blk_dma_restart_bh()
1052 req = next; in virtio_blk_dma_restart_bh()
1112 VirtIOBlockReq *req; in virtio_blk_reset() local
1124 req = s->rq; in virtio_blk_reset()
1125 s->rq = req->next; in virtio_blk_reset()
1128 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_blk_reset()
1130 g_free(req); in virtio_blk_reset()
1313 VirtIOBlockReq *req = s->rq; in virtio_blk_save_device() local
1315 while (req) { in virtio_blk_save_device()
1319 qemu_put_be32(f, virtio_get_queue_index(req->vq)); in virtio_blk_save_device()
1322 qemu_put_virtqueue_element(vdev, f, &req->elem); in virtio_blk_save_device()
1323 req = req->next; in virtio_blk_save_device()
1338 VirtIOBlockReq *req; in virtio_blk_load_device() local
1350 req = qemu_get_virtqueue_element(vdev, f, sizeof(VirtIOBlockReq)); in virtio_blk_load_device()
1351 virtio_blk_init_request(s, virtio_get_queue(vdev, vq_idx), req); in virtio_blk_load_device()
1354 req->next = s->rq; in virtio_blk_load_device()
1355 s->rq = req; in virtio_blk_load_device()