Revision d2ad7dd4 hw/virtio-scsi.c
b/hw/virtio-scsi.c | ||
---|---|---|
129 | 129 |
VirtIOSCSIConf *conf; |
130 | 130 |
|
131 | 131 |
SCSIBus bus; |
132 |
VirtQueue *ctrl_vq; |
|
133 |
VirtQueue *event_vq; |
|
134 |
VirtQueue *cmd_vq; |
|
135 | 132 |
uint32_t sense_size; |
136 | 133 |
uint32_t cdb_size; |
137 | 134 |
int resetting; |
135 |
VirtQueue *ctrl_vq; |
|
136 |
VirtQueue *event_vq; |
|
137 |
VirtQueue *cmd_vqs[0]; |
|
138 | 138 |
} VirtIOSCSI; |
139 | 139 |
|
140 | 140 |
typedef struct VirtIOSCSIReq { |
... | ... | |
240 | 240 |
static void virtio_scsi_save_request(QEMUFile *f, SCSIRequest *sreq) |
241 | 241 |
{ |
242 | 242 |
VirtIOSCSIReq *req = sreq->hba_private; |
243 |
uint32_t n = 0;
|
|
243 |
uint32_t n = virtio_queue_get_id(req->vq) - 2;
|
|
244 | 244 |
|
245 |
assert(n < req->dev->conf->num_queues); |
|
245 | 246 |
qemu_put_be32s(f, &n); |
246 | 247 |
qemu_put_buffer(f, (unsigned char *)&req->elem, sizeof(req->elem)); |
247 | 248 |
} |
... | ... | |
255 | 256 |
|
256 | 257 |
req = g_malloc(sizeof(*req)); |
257 | 258 |
qemu_get_be32s(f, &n); |
258 |
assert(n == 0);
|
|
259 |
assert(n < s->conf->num_queues);
|
|
259 | 260 |
qemu_get_buffer(f, (unsigned char *)&req->elem, sizeof(req->elem)); |
260 |
virtio_scsi_parse_req(s, s->cmd_vq, req); |
|
261 |
virtio_scsi_parse_req(s, s->cmd_vqs[n], req);
|
|
261 | 262 |
|
262 | 263 |
scsi_req_ref(sreq); |
263 | 264 |
req->sreq = sreq; |
... | ... | |
584 | 585 |
{ |
585 | 586 |
VirtIOSCSI *s; |
586 | 587 |
static int virtio_scsi_id; |
588 |
size_t sz; |
|
589 |
int i; |
|
587 | 590 |
|
591 |
sz = sizeof(VirtIOSCSI) + proxyconf->num_queues * sizeof(VirtQueue *); |
|
588 | 592 |
s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI, |
589 |
sizeof(VirtIOSCSIConfig), |
|
590 |
sizeof(VirtIOSCSI)); |
|
593 |
sizeof(VirtIOSCSIConfig), sz); |
|
591 | 594 |
|
592 | 595 |
s->qdev = dev; |
593 | 596 |
s->conf = proxyconf; |
... | ... | |
602 | 605 |
virtio_scsi_handle_ctrl); |
603 | 606 |
s->event_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE, |
604 | 607 |
NULL); |
605 |
s->cmd_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE, |
|
606 |
virtio_scsi_handle_cmd); |
|
608 |
for (i = 0; i < s->conf->num_queues; i++) { |
|
609 |
s->cmd_vqs[i] = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE, |
|
610 |
virtio_scsi_handle_cmd); |
|
611 |
} |
|
607 | 612 |
|
608 | 613 |
scsi_bus_new(&s->bus, dev, &virtio_scsi_scsi_info); |
609 | 614 |
if (!dev->hotplugged) { |
Also available in: Unified diff