Il 12/03/2012 20:14, Michael Tokarev ha scritto: > It now allows specifying offset within qiov to start from and > amount of bytes to copy. Actual implementation is just a call > to iov_to_buf(). > > Signed-off-by: Michael Tokarev <m...@tls.msk.ru> > --- > block.c | 2 +- > block/iscsi.c | 2 +- > block/qcow.c | 2 +- > block/qcow2.c | 2 +- > block/rbd.c | 2 +- > block/vdi.c | 2 +- > cutils.c | 11 +++-------- > qemu-common.h | 3 ++- > 8 files changed, 11 insertions(+), 15 deletions(-) > > diff --git a/block.c b/block.c > index 9246518..4bb5f92 100644 > --- a/block.c > +++ b/block.c > @@ -3266,7 +3266,7 @@ static BlockDriverAIOCB > *bdrv_aio_rw_vector(BlockDriverState *bs, > acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb); > > if (is_write) { > - qemu_iovec_to_buffer(acb->qiov, acb->bounce); > + qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size); > acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, > nb_sectors); > } else { > acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, > nb_sectors); > diff --git a/block/iscsi.c b/block/iscsi.c > index bd3ca11..db589f5 100644 > --- a/block/iscsi.c > +++ b/block/iscsi.c > @@ -223,7 +223,7 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, > /* this will allow us to get rid of 'buf' completely */ > size = nb_sectors * BDRV_SECTOR_SIZE; > acb->buf = g_malloc(size); > - qemu_iovec_to_buffer(acb->qiov, acb->buf); > + qemu_iovec_to_buf(acb->qiov, 0, acb->buf, size); > acb->task = iscsi_write10_task(iscsi, iscsilun->lun, acb->buf, size, > sector_qemu2lun(sector_num, iscsilun), > fua, 0, iscsilun->block_size, > diff --git a/block/qcow.c b/block/qcow.c > index 562a19c..a367459 100644 > --- a/block/qcow.c > +++ b/block/qcow.c > @@ -569,7 +569,7 @@ static coroutine_fn int qcow_co_writev(BlockDriverState > *bs, int64_t sector_num, > > if (qiov->niov > 1) { > buf = orig_buf = qemu_blockalign(bs, qiov->size); > - qemu_iovec_to_buffer(qiov, buf); > + qemu_iovec_to_buf(qiov, 0, buf, qiov->size); > } else { > orig_buf = NULL; > buf = (uint8_t *)qiov->iov->iov_base; > diff --git a/block/qcow2.c b/block/qcow2.c > index 894fb4d..88fbd73 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -604,7 +604,7 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState > *bs, > > assert(hd_qiov.size <= > QCOW_MAX_CRYPT_CLUSTERS * s->cluster_size); > - qemu_iovec_to_buffer(&hd_qiov, cluster_data); > + qemu_iovec_to_buf(&hd_qiov, 0, cluster_data, hd_qiov.size); > > qcow2_encrypt_sectors(s, sector_num, cluster_data, > cluster_data, cur_nr_sectors, 1, &s->aes_encrypt_key); > diff --git a/block/rbd.c b/block/rbd.c > index 46a8579..0191f86 100644 > --- a/block/rbd.c > +++ b/block/rbd.c > @@ -644,7 +644,7 @@ static BlockDriverAIOCB > *rbd_aio_rw_vector(BlockDriverState *bs, > acb->bh = NULL; > > if (write) { > - qemu_iovec_to_buffer(acb->qiov, acb->bounce); > + qemu_iovec_to_buffer(acb->qiov, 0, acb->bounce, qiov->size); > } > > buf = acb->bounce; > diff --git a/block/vdi.c b/block/vdi.c > index 24f4027..30a5e27 100644 > --- a/block/vdi.c > +++ b/block/vdi.c > @@ -524,7 +524,7 @@ static VdiAIOCB *vdi_aio_setup(BlockDriverState *bs, > int64_t sector_num, > acb->buf = qemu_blockalign(bs, qiov->size); > acb->orig_buf = acb->buf; > if (is_write) { > - qemu_iovec_to_buffer(qiov, acb->buf); > + qemu_iovec_to_buf(qiov, 0, acb->buf, qiov->size); > } > } else { > acb->buf = (uint8_t *)qiov->iov->iov_base; > diff --git a/cutils.c b/cutils.c > index b8fc954..df26f72 100644 > --- a/cutils.c > +++ b/cutils.c > @@ -220,15 +220,10 @@ void qemu_iovec_reset(QEMUIOVector *qiov) > qiov->size = 0; > } > > -void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf) > +size_t qemu_iovec_to_buf(QEMUIOVector *qiov, size_t offset, > + void *buf, size_t bytes) > { > - uint8_t *p = (uint8_t *)buf; > - int i; > - > - for (i = 0; i < qiov->niov; ++i) { > - memcpy(p, qiov->iov[i].iov_base, qiov->iov[i].iov_len); > - p += qiov->iov[i].iov_len; > - } > + return iov_to_buf(qiov->iov, qiov->niov, offset, buf, bytes); > } > > size_t qemu_iovec_from_buf(QEMUIOVector *qiov, size_t offset, > diff --git a/qemu-common.h b/qemu-common.h > index 31b30b5..ec9655b 100644 > --- a/qemu-common.h > +++ b/qemu-common.h > @@ -337,7 +337,8 @@ void qemu_iovec_concat(QEMUIOVector *dst, > QEMUIOVector *src, size_t soffset, size_t sbytes); > void qemu_iovec_destroy(QEMUIOVector *qiov); > void qemu_iovec_reset(QEMUIOVector *qiov); > -void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf); > +size_t qemu_iovec_to_buf(QEMUIOVector *qiov, size_t offset, > + void *buf, size_t bytes); > size_t qemu_iovec_from_buf(QEMUIOVector *qiov, size_t offset, > const void *buf, size_t bytes); > size_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset,
Looks good. Paolo