Hi all. What about such a simple helper for a very often patter around qemu_iovec_init_external ?
If we like it, I'll update other callers of qemu_iovec_init_external. Possible interface change would be LOCAL_QIOV(lc, buf, len); instead of LocalQiov lc = LOCAL_QIOV(lc, buf, len); or, may be, someone has a better idea? Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/qemu/iov.h | 19 +++++++++++++++++++ block/io.c | 9 ++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/include/qemu/iov.h b/include/qemu/iov.h index 5f433c7768..e0963d8ebe 100644 --- a/include/qemu/iov.h +++ b/include/qemu/iov.h @@ -137,6 +137,25 @@ typedef struct QEMUIOVector { size_t size; } QEMUIOVector; +typedef struct LocalQiov { + QEMUIOVector qiov; + struct iovec iov; +} LocalQiov; + +#define LOCAL_QIOV(self, buf, len) \ +{ \ + .qiov = { \ + .iov = &self.iov, \ + .size = len, \ + .niov = 1, \ + .nalloc = -1 \ + }, \ + .iov = { \ + .iov_base = (void *)(buf), \ + .iov_len = len \ + } \ +} + void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint); void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov); void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len); diff --git a/block/io.c b/block/io.c index bd9d688f8b..c7d7b199c1 100644 --- a/block/io.c +++ b/block/io.c @@ -949,18 +949,13 @@ int bdrv_preadv(BdrvChild *child, int64_t offset, QEMUIOVector *qiov) int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int bytes) { - QEMUIOVector qiov; - struct iovec iov = { - .iov_base = (void *)buf, - .iov_len = bytes, - }; + LocalQiov lq = LOCAL_QIOV(lq, buf, bytes); if (bytes < 0) { return -EINVAL; } - qemu_iovec_init_external(&qiov, &iov, 1); - return bdrv_preadv(child, offset, &qiov); + return bdrv_preadv(child, offset, &lq.qiov); } int bdrv_pwritev(BdrvChild *child, int64_t offset, QEMUIOVector *qiov) -- 2.18.0