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