Lines Matching refs:req
43 VirtIOBlockReq *req) in virtio_blk_init_request() argument
45 req->dev = s; in virtio_blk_init_request()
46 req->vq = vq; in virtio_blk_init_request()
47 req->qiov.size = 0; in virtio_blk_init_request()
48 req->in_len = 0; in virtio_blk_init_request()
49 req->next = NULL; in virtio_blk_init_request()
50 req->mr_next = NULL; in virtio_blk_init_request()
53 static void virtio_blk_free_request(VirtIOBlockReq *req) in virtio_blk_free_request() argument
55 g_free(req); in virtio_blk_free_request()
58 static void virtio_blk_req_complete(VirtIOBlockReq *req, unsigned char status) in virtio_blk_req_complete() argument
60 VirtIOBlock *s = req->dev; in virtio_blk_req_complete()
63 trace_virtio_blk_req_complete(vdev, req, status); in virtio_blk_req_complete()
65 stb_p(&req->in->status, status); in virtio_blk_req_complete()
66 iov_discard_undo(&req->inhdr_undo); in virtio_blk_req_complete()
67 iov_discard_undo(&req->outhdr_undo); in virtio_blk_req_complete()
68 virtqueue_push(req->vq, &req->elem, req->in_len); in virtio_blk_req_complete()
70 virtio_notify_irqfd(vdev, req->vq); in virtio_blk_req_complete()
72 virtio_notify(vdev, req->vq); in virtio_blk_req_complete()
76 static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error, in virtio_blk_handle_rw_error() argument
79 VirtIOBlock *s = req->dev; in virtio_blk_handle_rw_error()
85 req->mr_next = NULL; in virtio_blk_handle_rw_error()
88 req->next = s->rq; in virtio_blk_handle_rw_error()
89 s->rq = req; in virtio_blk_handle_rw_error()
92 virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); in virtio_blk_handle_rw_error()
94 block_acct_failed(blk_get_stats(s->blk), &req->acct); in virtio_blk_handle_rw_error()
96 virtio_blk_free_request(req); in virtio_blk_handle_rw_error()
110 VirtIOBlockReq *req = next; in virtio_blk_rw_complete() local
111 next = req->mr_next; in virtio_blk_rw_complete()
112 trace_virtio_blk_rw_complete(vdev, req, ret); in virtio_blk_rw_complete()
114 if (req->qiov.nalloc != -1) { in virtio_blk_rw_complete()
118 qemu_iovec_destroy(&req->qiov); in virtio_blk_rw_complete()
122 int p = virtio_ldl_p(VIRTIO_DEVICE(s), &req->out.type); in virtio_blk_rw_complete()
132 if (virtio_blk_handle_rw_error(req, -ret, is_read, true)) { in virtio_blk_rw_complete()
137 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_rw_complete()
138 block_acct_done(blk_get_stats(s->blk), &req->acct); in virtio_blk_rw_complete()
139 virtio_blk_free_request(req); in virtio_blk_rw_complete()
145 VirtIOBlockReq *req = opaque; in virtio_blk_flush_complete() local
146 VirtIOBlock *s = req->dev; in virtio_blk_flush_complete()
148 if (ret && virtio_blk_handle_rw_error(req, -ret, 0, true)) { in virtio_blk_flush_complete()
152 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_flush_complete()
153 block_acct_done(blk_get_stats(s->blk), &req->acct); in virtio_blk_flush_complete()
154 virtio_blk_free_request(req); in virtio_blk_flush_complete()
159 VirtIOBlockReq *req = opaque; in virtio_blk_discard_write_zeroes_complete() local
160 VirtIOBlock *s = req->dev; in virtio_blk_discard_write_zeroes_complete()
161 bool is_write_zeroes = (virtio_ldl_p(VIRTIO_DEVICE(s), &req->out.type) & in virtio_blk_discard_write_zeroes_complete()
164 if (ret && virtio_blk_handle_rw_error(req, -ret, false, is_write_zeroes)) { in virtio_blk_discard_write_zeroes_complete()
168 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_discard_write_zeroes_complete()
170 block_acct_done(blk_get_stats(s->blk), &req->acct); in virtio_blk_discard_write_zeroes_complete()
172 virtio_blk_free_request(req); in virtio_blk_discard_write_zeroes_complete()
177 VirtIOBlockReq *req = virtqueue_pop(vq, sizeof(VirtIOBlockReq)); in virtio_blk_get_request() local
179 if (req) { in virtio_blk_get_request()
180 virtio_blk_init_request(s, vq, req); in virtio_blk_get_request()
182 return req; in virtio_blk_get_request()
185 static void virtio_blk_handle_scsi(VirtIOBlockReq *req) in virtio_blk_handle_scsi() argument
189 VirtIOBlock *blk = req->dev; in virtio_blk_handle_scsi()
191 VirtQueueElement *elem = &req->elem; in virtio_blk_handle_scsi()
216 virtio_blk_req_complete(req, status); in virtio_blk_handle_scsi()
217 virtio_blk_free_request(req); in virtio_blk_handle_scsi()
309 VirtIOBlockReq *req = mrb->reqs[i]; in virtio_blk_submit_multireq() local
317 if (sector_num + nb_sectors != req->sector_num || in virtio_blk_submit_multireq()
318 niov > blk_get_max_iov(s->blk) - req->qiov.niov || in virtio_blk_submit_multireq()
319 req->qiov.size > max_transfer || in virtio_blk_submit_multireq()
321 req->qiov.size) / BDRV_SECTOR_SIZE) { in virtio_blk_submit_multireq()
328 sector_num = req->sector_num; in virtio_blk_submit_multireq()
333 nb_sectors += req->qiov.size / BDRV_SECTOR_SIZE; in virtio_blk_submit_multireq()
334 niov += req->qiov.niov; in virtio_blk_submit_multireq()
342 static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer *mrb) in virtio_blk_handle_flush() argument
344 VirtIOBlock *s = req->dev; in virtio_blk_handle_flush()
346 block_acct_start(blk_get_stats(s->blk), &req->acct, 0, in virtio_blk_handle_flush()
355 blk_aio_flush(s->blk, virtio_blk_flush_complete, req); in virtio_blk_handle_flush()
380 static uint8_t virtio_blk_handle_discard_write_zeroes(VirtIOBlockReq *req, in virtio_blk_handle_discard_write_zeroes() argument
383 VirtIOBlock *s = req->dev; in virtio_blk_handle_discard_write_zeroes()
429 block_acct_start(blk_get_stats(s->blk), &req->acct, bytes, in virtio_blk_handle_discard_write_zeroes()
434 virtio_blk_discard_write_zeroes_complete, req); in virtio_blk_handle_discard_write_zeroes()
446 virtio_blk_discard_write_zeroes_complete, req); in virtio_blk_handle_discard_write_zeroes()
459 VirtIOBlockReq *req; member
523 VirtIOBlockReq *req = data->req; in virtio_blk_zone_report_complete() local
524 VirtIODevice *vdev = VIRTIO_DEVICE(req->dev); in virtio_blk_zone_report_complete()
534 trace_virtio_blk_zone_report_complete(vdev, req, nz, ret); in virtio_blk_zone_report_complete()
614 virtio_blk_req_complete(req, err_status); in virtio_blk_zone_report_complete()
615 virtio_blk_free_request(req); in virtio_blk_zone_report_complete()
620 static void virtio_blk_handle_zone_report(VirtIOBlockReq *req, in virtio_blk_handle_zone_report() argument
624 VirtIOBlock *s = req->dev; in virtio_blk_handle_zone_report()
631 if (req->in_len < sizeof(struct virtio_blk_inhdr) + in virtio_blk_handle_zone_report()
640 offset = virtio_ldq_p(vdev, &req->out.sector) << BDRV_SECTOR_BITS; in virtio_blk_handle_zone_report()
644 nr_zones = (req->in_len - sizeof(struct virtio_blk_inhdr) - in virtio_blk_handle_zone_report()
647 trace_virtio_blk_handle_zone_report(vdev, req, in virtio_blk_handle_zone_report()
652 data->req = req; in virtio_blk_handle_zone_report()
663 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_zone_report()
664 virtio_blk_free_request(req); in virtio_blk_handle_zone_report()
669 VirtIOBlockReq *req = opaque; in virtio_blk_zone_mgmt_complete() local
670 VirtIOBlock *s = req->dev; in virtio_blk_zone_mgmt_complete()
673 trace_virtio_blk_zone_mgmt_complete(vdev, req,ret); in virtio_blk_zone_mgmt_complete()
679 virtio_blk_req_complete(req, err_status); in virtio_blk_zone_mgmt_complete()
680 virtio_blk_free_request(req); in virtio_blk_zone_mgmt_complete()
683 static int virtio_blk_handle_zone_mgmt(VirtIOBlockReq *req, BlockZoneOp op) in virtio_blk_handle_zone_mgmt() argument
685 VirtIOBlock *s = req->dev; in virtio_blk_handle_zone_mgmt()
688 int64_t offset = virtio_ldq_p(vdev, &req->out.sector) << BDRV_SECTOR_BITS; in virtio_blk_handle_zone_mgmt()
693 uint32_t type = virtio_ldl_p(vdev, &req->out.type); in virtio_blk_handle_zone_mgmt()
698 trace_virtio_blk_handle_zone_reset_all(vdev, req, 0, in virtio_blk_handle_zone_mgmt()
707 trace_virtio_blk_handle_zone_mgmt(vdev, req, op, in virtio_blk_handle_zone_mgmt()
717 virtio_blk_zone_mgmt_complete, req); in virtio_blk_handle_zone_mgmt()
721 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_zone_mgmt()
722 virtio_blk_free_request(req); in virtio_blk_handle_zone_mgmt()
729 VirtIOBlockReq *req = data->req; in virtio_blk_zone_append_complete() local
730 VirtIODevice *vdev = VIRTIO_DEVICE(req->dev); in virtio_blk_zone_append_complete()
749 trace_virtio_blk_zone_append_complete(vdev, req, append_sector, ret); in virtio_blk_zone_append_complete()
752 virtio_blk_req_complete(req, err_status); in virtio_blk_zone_append_complete()
753 virtio_blk_free_request(req); in virtio_blk_zone_append_complete()
757 static int virtio_blk_handle_zone_append(VirtIOBlockReq *req, in virtio_blk_handle_zone_append() argument
762 VirtIOBlock *s = req->dev; in virtio_blk_handle_zone_append()
766 int64_t offset = virtio_ldq_p(vdev, &req->out.sector) << BDRV_SECTOR_BITS; in virtio_blk_handle_zone_append()
770 trace_virtio_blk_handle_zone_append(vdev, req, offset >> BDRV_SECTOR_BITS); in virtio_blk_handle_zone_append()
776 data->req = req; in virtio_blk_handle_zone_append()
780 qemu_iovec_init_external(&req->qiov, out_iov, out_num); in virtio_blk_handle_zone_append()
782 block_acct_start(blk_get_stats(s->blk), &req->acct, len, in virtio_blk_handle_zone_append()
785 blk_aio_zone_append(s->blk, &data->zone_append_data.offset, &req->qiov, 0, in virtio_blk_handle_zone_append()
790 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_zone_append()
791 virtio_blk_free_request(req); in virtio_blk_handle_zone_append()
795 static int virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb) in virtio_blk_handle_request() argument
798 struct iovec *in_iov = req->elem.in_sg; in virtio_blk_handle_request()
799 struct iovec *out_iov = req->elem.out_sg; in virtio_blk_handle_request()
800 unsigned in_num = req->elem.in_num; in virtio_blk_handle_request()
801 unsigned out_num = req->elem.out_num; in virtio_blk_handle_request()
802 VirtIOBlock *s = req->dev; in virtio_blk_handle_request()
805 if (req->elem.out_num < 1 || req->elem.in_num < 1) { in virtio_blk_handle_request()
810 if (unlikely(iov_to_buf(out_iov, out_num, 0, &req->out, in virtio_blk_handle_request()
811 sizeof(req->out)) != sizeof(req->out))) { in virtio_blk_handle_request()
816 iov_discard_front_undoable(&out_iov, &out_num, sizeof(req->out), in virtio_blk_handle_request()
817 &req->outhdr_undo); in virtio_blk_handle_request()
821 iov_discard_undo(&req->outhdr_undo); in virtio_blk_handle_request()
826 req->in_len = iov_size(in_iov, in_num); in virtio_blk_handle_request()
827 req->in = (void *)in_iov[in_num - 1].iov_base in virtio_blk_handle_request()
831 &req->inhdr_undo); in virtio_blk_handle_request()
833 type = virtio_ldl_p(vdev, &req->out.type); in virtio_blk_handle_request()
842 req->sector_num = virtio_ldq_p(vdev, &req->out.sector); in virtio_blk_handle_request()
845 qemu_iovec_init_external(&req->qiov, out_iov, out_num); in virtio_blk_handle_request()
846 trace_virtio_blk_handle_write(vdev, req, req->sector_num, in virtio_blk_handle_request()
847 req->qiov.size / BDRV_SECTOR_SIZE); in virtio_blk_handle_request()
849 qemu_iovec_init_external(&req->qiov, in_iov, in_num); in virtio_blk_handle_request()
850 trace_virtio_blk_handle_read(vdev, req, req->sector_num, in virtio_blk_handle_request()
851 req->qiov.size / BDRV_SECTOR_SIZE); in virtio_blk_handle_request()
854 if (!virtio_blk_sect_range_ok(s, req->sector_num, req->qiov.size)) { in virtio_blk_handle_request()
855 virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); in virtio_blk_handle_request()
858 virtio_blk_free_request(req); in virtio_blk_handle_request()
862 block_acct_start(blk_get_stats(s->blk), &req->acct, req->qiov.size, in virtio_blk_handle_request()
874 mrb->reqs[mrb->num_reqs++] = req; in virtio_blk_handle_request()
879 virtio_blk_handle_flush(req, mrb); in virtio_blk_handle_request()
882 virtio_blk_handle_zone_report(req, in_iov, in_num); in virtio_blk_handle_request()
885 virtio_blk_handle_zone_mgmt(req, BLK_ZO_OPEN); in virtio_blk_handle_request()
888 virtio_blk_handle_zone_mgmt(req, BLK_ZO_CLOSE); in virtio_blk_handle_request()
891 virtio_blk_handle_zone_mgmt(req, BLK_ZO_FINISH); in virtio_blk_handle_request()
894 virtio_blk_handle_zone_mgmt(req, BLK_ZO_RESET); in virtio_blk_handle_request()
897 virtio_blk_handle_zone_mgmt(req, BLK_ZO_RESET); in virtio_blk_handle_request()
900 virtio_blk_handle_scsi(req); in virtio_blk_handle_request()
913 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); in virtio_blk_handle_request()
914 virtio_blk_free_request(req); in virtio_blk_handle_request()
923 virtio_blk_handle_zone_append(req, out_iov, in_iov, out_num, in_num); in virtio_blk_handle_request()
945 virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP); in virtio_blk_handle_request()
946 virtio_blk_free_request(req); in virtio_blk_handle_request()
952 iov_discard_undo(&req->inhdr_undo); in virtio_blk_handle_request()
953 iov_discard_undo(&req->outhdr_undo); in virtio_blk_handle_request()
959 err_status = virtio_blk_handle_discard_write_zeroes(req, &dwz_hdr, in virtio_blk_handle_request()
962 virtio_blk_req_complete(req, err_status); in virtio_blk_handle_request()
963 virtio_blk_free_request(req); in virtio_blk_handle_request()
969 virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP); in virtio_blk_handle_request()
970 virtio_blk_free_request(req); in virtio_blk_handle_request()
977 VirtIOBlockReq *req; in virtio_blk_handle_vq() local
988 while ((req = virtio_blk_get_request(s, vq))) { in virtio_blk_handle_vq()
989 if (virtio_blk_handle_request(req, &mrb)) { in virtio_blk_handle_vq()
990 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_blk_handle_vq()
991 virtio_blk_free_request(req); in virtio_blk_handle_vq()
1027 VirtIOBlockReq *req = opaque; in virtio_blk_dma_restart_bh() local
1028 VirtIOBlock *s = req->dev; /* we're called with at least one request */ in virtio_blk_dma_restart_bh()
1032 while (req) { in virtio_blk_dma_restart_bh()
1033 VirtIOBlockReq *next = req->next; in virtio_blk_dma_restart_bh()
1034 if (virtio_blk_handle_request(req, &mrb)) { in virtio_blk_dma_restart_bh()
1038 while (req) { in virtio_blk_dma_restart_bh()
1039 next = req->next; in virtio_blk_dma_restart_bh()
1040 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_blk_dma_restart_bh()
1041 virtio_blk_free_request(req); in virtio_blk_dma_restart_bh()
1042 req = next; in virtio_blk_dma_restart_bh()
1046 req = next; in virtio_blk_dma_restart_bh()
1106 VirtIOBlockReq *req; in virtio_blk_reset() local
1118 req = s->rq; in virtio_blk_reset()
1119 s->rq = req->next; in virtio_blk_reset()
1122 virtqueue_detach_element(req->vq, &req->elem, 0); in virtio_blk_reset()
1124 virtio_blk_free_request(req); in virtio_blk_reset()
1306 VirtIOBlockReq *req = s->rq; in virtio_blk_save_device() local
1308 while (req) { in virtio_blk_save_device()
1312 qemu_put_be32(f, virtio_get_queue_index(req->vq)); in virtio_blk_save_device()
1315 qemu_put_virtqueue_element(vdev, f, &req->elem); in virtio_blk_save_device()
1316 req = req->next; in virtio_blk_save_device()
1331 VirtIOBlockReq *req; in virtio_blk_load_device() local
1343 req = qemu_get_virtqueue_element(vdev, f, sizeof(VirtIOBlockReq)); in virtio_blk_load_device()
1344 virtio_blk_init_request(s, virtio_get_queue(vdev, vq_idx), req); in virtio_blk_load_device()
1347 req->next = s->rq; in virtio_blk_load_device()
1348 s->rq = req; in virtio_blk_load_device()