virtio-scsi: add extra argument and return type to qemu_sgl_concat

Will be used for anylayout support.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2014-06-10 16:39:24 +02:00
parent b0b4ea17dc
commit 57fbae6e2c
1 changed files with 19 additions and 6 deletions

View File

@ -95,14 +95,27 @@ static void virtio_scsi_bad_req(void)
exit(1);
}
static void qemu_sgl_concat(VirtIOSCSIReq *req, struct iovec *sg,
hwaddr *addr, int num)
static size_t qemu_sgl_concat(VirtIOSCSIReq *req, struct iovec *iov,
hwaddr *addr, int num, size_t skip)
{
QEMUSGList *qsgl = &req->qsgl;
size_t copied = 0;
while (num--) {
qemu_sglist_add(qsgl, *(addr++), (sg++)->iov_len);
while (num) {
if (skip >= iov->iov_len) {
skip -= iov->iov_len;
} else {
qemu_sglist_add(qsgl, *addr + skip, iov->iov_len - skip);
copied += iov->iov_len - skip;
skip = 0;
}
iov++;
addr++;
num--;
}
assert(skip == 0);
return copied;
}
static int virtio_scsi_parse_req(VirtIOSCSIReq *req,
@ -127,11 +140,11 @@ static int virtio_scsi_parse_req(VirtIOSCSIReq *req,
if (req->elem.out_num > 1) {
qemu_sgl_concat(req, &req->elem.out_sg[1],
&req->elem.out_addr[1],
req->elem.out_num - 1);
req->elem.out_num - 1, 0);
} else {
qemu_sgl_concat(req, &req->elem.in_sg[1],
&req->elem.in_addr[1],
req->elem.in_num - 1);
req->elem.in_num - 1, 0);
}
return 0;