Il 12/03/2012 20:14, Michael Tokarev ha scritto: > This patch combines two functions into one, and replaces > the implementation with already existing iov_memset() from > iov.c. > > The new prototype of qemu_iovec_memset(): > size_t qemu_iovec_memset(qiov, size_t offset, int c, size_t bytes) > It is different from former qemu_iovec_memset_skip(), and > I want to make other functions to be consistent with it > too: first how much to skip, second what, and 3rd how many > of it. It also returns actual number of bytes filled in, > which may be less than the requested `bytes' if qiov is > smaller than offset+bytes, in the same way iov_memset() > does. > > While at it, use utility function iov_memset() from > iov.h in posix-aio-compat.c, where qiov was used. > > Signed-off-by: Michael Tokarev <m...@tls.msk.ru> > --- > block/qcow2.c | 4 ++-- > block/qed.c | 4 ++-- > cutils.c | 44 ++++---------------------------------------- > linux-aio.c | 4 ++-- > posix-aio-compat.c | 8 +++----- > qemu-common.h | 5 ++--- > 6 files changed, 15 insertions(+), 54 deletions(-) > > diff --git a/block/qcow2.c b/block/qcow2.c > index eb5ea48..d46ca70 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -406,7 +406,7 @@ int qcow2_backing_read1(BlockDriverState *bs, > QEMUIOVector *qiov, > else > n1 = bs->total_sectors - sector_num; > > - qemu_iovec_memset_skip(qiov, 0, 512 * (nb_sectors - n1), 512 * n1); > + qemu_iovec_memset(qiov, 512 * n1, 0, 512 * (nb_sectors - n1)); > > return n1; > } > @@ -466,7 +466,7 @@ static coroutine_fn int qcow2_co_readv(BlockDriverState > *bs, int64_t sector_num, > } > } else { > /* Note: in this case, no need to wait */ > - qemu_iovec_memset(&hd_qiov, 0, 512 * cur_nr_sectors); > + qemu_iovec_memset(&hd_qiov, 0, 0, 512 * cur_nr_sectors); > } > } else if (cluster_offset & QCOW_OFLAG_COMPRESSED) { > /* add AIO support for compressed blocks ? */ > diff --git a/block/qed.c b/block/qed.c > index a041d31..6f9325b 100644 > --- a/block/qed.c > +++ b/block/qed.c > @@ -738,7 +738,7 @@ static void qed_read_backing_file(BDRVQEDState *s, > uint64_t pos, > /* Zero all sectors if reading beyond the end of the backing file */ > if (pos >= backing_length || > pos + qiov->size > backing_length) { > - qemu_iovec_memset(qiov, 0, qiov->size); > + qemu_iovec_memset(qiov, 0, 0, qiov->size); > } > > /* Complete now if there are no backing file sectors to read */ > @@ -1253,7 +1253,7 @@ static void qed_aio_read_data(void *opaque, int ret, > > /* Handle zero cluster and backing file reads */ > if (ret == QED_CLUSTER_ZERO) { > - qemu_iovec_memset(&acb->cur_qiov, 0, acb->cur_qiov.size); > + qemu_iovec_memset(&acb->cur_qiov, 0, 0, acb->cur_qiov.size); > qed_aio_next_io(acb, 0); > return; > } else if (ret != QED_CLUSTER_FOUND) { > diff --git a/cutils.c b/cutils.c > index af308cd..53ff825 100644 > --- a/cutils.c > +++ b/cutils.c > @@ -26,6 +26,7 @@ > #include <math.h> > > #include "qemu_socket.h" > +#include "iov.h" > > void pstrcpy(char *buf, int buf_size, const char *str) > { > @@ -260,47 +261,10 @@ void qemu_iovec_from_buffer(QEMUIOVector *qiov, const > void *buf, size_t count) > } > } > > -void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count) > +size_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset, > + int c, size_t bytes) > { > - size_t n; > - int i; > - > - for (i = 0; i < qiov->niov && count; ++i) { > - n = MIN(count, qiov->iov[i].iov_len); > - memset(qiov->iov[i].iov_base, c, n); > - count -= n; > - } > -} > - > -void qemu_iovec_memset_skip(QEMUIOVector *qiov, int c, size_t count, > - size_t skip) > -{ > - int i; > - size_t done; > - void *iov_base; > - uint64_t iov_len; > - > - done = 0; > - for (i = 0; (i < qiov->niov) && (done != count); i++) { > - if (skip >= qiov->iov[i].iov_len) { > - /* Skip the whole iov */ > - skip -= qiov->iov[i].iov_len; > - continue; > - } else { > - /* Skip only part (or nothing) of the iov */ > - iov_base = (uint8_t*) qiov->iov[i].iov_base + skip; > - iov_len = qiov->iov[i].iov_len - skip; > - skip = 0; > - } > - > - if (done + iov_len > count) { > - memset(iov_base, c, count - done); > - break; > - } else { > - memset(iov_base, c, iov_len); > - } > - done += iov_len; > - } > + return iov_memset(qiov->iov, qiov->niov, offset, c, bytes); > } > > /* > diff --git a/linux-aio.c b/linux-aio.c > index d2fc2e7..5a46c13 100644 > --- a/linux-aio.c > +++ b/linux-aio.c > @@ -64,8 +64,8 @@ static void qemu_laio_process_completion(struct > qemu_laio_state *s, > } else if (ret >= 0) { > /* Short reads mean EOF, pad with zeros. */ > if (laiocb->is_read) { > - qemu_iovec_memset_skip(laiocb->qiov, 0, > - laiocb->qiov->size - ret, ret); > + qemu_iovec_memset(laiocb->qiov, ret, 0, > + laiocb->qiov->size - ret); > } else { > ret = -EINVAL; > } > diff --git a/posix-aio-compat.c b/posix-aio-compat.c > index d311d13..1ab4a18 100644 > --- a/posix-aio-compat.c > +++ b/posix-aio-compat.c > @@ -29,6 +29,7 @@ > #include "qemu-common.h" > #include "trace.h" > #include "block_int.h" > +#include "iov.h" > > #include "block/raw-posix-aio.h" > > @@ -351,11 +352,8 @@ static void *aio_thread(void *unused) > if (ret >= 0 && ret < aiocb->aio_nbytes && > aiocb->common.bs->growable) { > /* A short read means that we have reached EOF. Pad the > buffer > * with zeros for bytes after EOF. */ > - QEMUIOVector qiov; > - > - qemu_iovec_init_external(&qiov, aiocb->aio_iov, > - aiocb->aio_niov); > - qemu_iovec_memset_skip(&qiov, 0, aiocb->aio_nbytes - ret, > ret); > + iov_memset(aiocb->aio_iov, aiocb->aio_niov, ret, > + 0, aiocb->aio_nbytes - ret); > > ret = aiocb->aio_nbytes; > } > diff --git a/qemu-common.h b/qemu-common.h > index dbfce6f..90f17fe 100644 > --- a/qemu-common.h > +++ b/qemu-common.h > @@ -340,9 +340,8 @@ void qemu_iovec_destroy(QEMUIOVector *qiov); > void qemu_iovec_reset(QEMUIOVector *qiov); > void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf); > void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t > count); > -void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count); > -void qemu_iovec_memset_skip(QEMUIOVector *qiov, int c, size_t count, > - size_t skip); > +size_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset, > + int c, size_t bytes); > > bool buffer_is_zero(const void *buf, size_t len); >
Reviewed-by: Paolo Bonzini <pbonz...@redhat.com> Paolo