virtio-scsi: use virtqueue_map_sg() when loading requests
The VirtQueueElement struct is serialized during migration but the in_sg[]/out_sg[] iovec arrays are not usable on the destination host because the pointers are meaningless. Use virtqueue_map_sg() to refresh in_sg[]/out_sg[] to valid pointers based on in_addr[]/out_addr[] hwaddrs. Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <1438262173-11546-2-git-send-email-stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
cb48f67ad8
commit
1cc933453b
@ -217,6 +217,11 @@ static void *virtio_scsi_load_request(QEMUFile *f, SCSIRequest *sreq)
|
|||||||
assert(req->elem.in_num <= ARRAY_SIZE(req->elem.in_sg));
|
assert(req->elem.in_num <= ARRAY_SIZE(req->elem.in_sg));
|
||||||
assert(req->elem.out_num <= ARRAY_SIZE(req->elem.out_sg));
|
assert(req->elem.out_num <= ARRAY_SIZE(req->elem.out_sg));
|
||||||
|
|
||||||
|
virtqueue_map_sg(req->elem.in_sg, req->elem.in_addr,
|
||||||
|
req->elem.in_num, 1);
|
||||||
|
virtqueue_map_sg(req->elem.out_sg, req->elem.out_addr,
|
||||||
|
req->elem.out_num, 0);
|
||||||
|
|
||||||
if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICmdReq) + vs->cdb_size,
|
if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICmdReq) + vs->cdb_size,
|
||||||
sizeof(VirtIOSCSICmdResp) + vs->sense_size) < 0) {
|
sizeof(VirtIOSCSICmdResp) + vs->sense_size) < 0) {
|
||||||
error_report("invalid SCSI request migration data");
|
error_report("invalid SCSI request migration data");
|
||||||
|
Loading…
Reference in New Issue
Block a user