From 3f35744052d0b5b0532e5c8b24da51abb8e41068 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Thu, 15 Dec 2022 03:01:05 +0300 Subject: [PATCH] Fix compatibility with QEMU aio_set_fd_handler signatures in 7.0 and < 2.9 --- patches/qemu-make-patches.sh | 2 +- src/qemu_driver.c | 41 +++++++++++++++++++++++++++++++----- src/vitastor_c.h | 1 + 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/patches/qemu-make-patches.sh b/patches/qemu-make-patches.sh index 117956d9..6a884e45 100755 --- a/patches/qemu-make-patches.sh +++ b/patches/qemu-make-patches.sh @@ -9,7 +9,7 @@ for i in "$DIR"/qemu-*-vitastor.patch "$DIR"/pve-qemu-*-vitastor.patch; do echo '===================================================================' >> $i echo '--- /dev/null' >> $i echo '+++ a/block/vitastor.c' >> $i - echo '@@ -0,0 +1,'$(wc -l "$DIR"/../src/qemu_driver.c)' @@' >> $i + echo '@@ -0,0 +1,'$(wc -l "$DIR"/../src/qemu_driver.c | cut -d ' ' -f 1)' @@' >> $i cat "$DIR"/../src/qemu_driver.c | sed 's/^/+/' >> $i fi done diff --git a/src/qemu_driver.c b/src/qemu_driver.c index cf06c542..74533778 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -206,6 +206,25 @@ static void coroutine_fn vitastor_co_get_metadata(VitastorRPC *task) } } +static void vitastor_aio_set_fd_handler(void *ctx, int fd, int unused1, IOHandler *fd_read, IOHandler *fd_write, void *unused2, void *opaque) +{ + aio_set_fd_handler(ctx, fd, +#if QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 5 || QEMU_VERSION_MAJOR >= 3 + 0 /*is_external*/, +#endif + fd_read, fd_write, +#if QEMU_VERSION_MAJOR == 1 && QEMU_VERSION_MINOR <= 6 || QEMU_VERSION_MAJOR < 1 + NULL /*io_flush*/, +#endif +#if QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 9 || QEMU_VERSION_MAJOR >= 3 + NULL /*io_poll*/, +#endif +#if QEMU_VERSION_MAJOR >= 7 + NULL /*io_poll_ready*/, +#endif + opaque); +} + static int vitastor_file_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { VitastorClient *client = bs->opaque; @@ -221,7 +240,7 @@ static int vitastor_file_open(BlockDriverState *bs, QDict *options, int flags, E client->rdma_gid_index = qdict_get_try_int(options, "rdma-gid-index", 0); client->rdma_mtu = qdict_get_try_int(options, "rdma-mtu", 0); client->proxy = vitastor_c_create_qemu( - (QEMUSetFDHandler*)aio_set_fd_handler, bdrv_get_aio_context(bs), client->config_path, client->etcd_host, client->etcd_prefix, + vitastor_aio_set_fd_handler, bdrv_get_aio_context(bs), client->config_path, client->etcd_host, client->etcd_prefix, client->use_rdma, client->rdma_device, client->rdma_port_num, client->rdma_gid_index, client->rdma_mtu, 0 ); client->image = g_strdup(qdict_get_try_str(options, "image")); @@ -238,9 +257,9 @@ static int vitastor_file_open(BlockDriverState *bs, QDict *options, int flags, E } else { - qemu_coroutine_enter(qemu_coroutine_create((void(*)(void*))vitastor_co_get_metadata, &task)); + bdrv_coroutine_enter(bs, qemu_coroutine_create((void(*)(void*))vitastor_co_get_metadata, &task)); + BDRV_POLL_WHILE(bs, !task.complete); } - BDRV_POLL_WHILE(bs, !task.complete); client->watch = (void*)task.ret; client->readonly = client->readonly || vitastor_c_inode_get_readonly(client->watch); client->size = vitastor_c_inode_get_size(client->watch); @@ -428,7 +447,13 @@ static void vitastor_co_read_cb(void *opaque, long retval, uint64_t version) vitastor_co_generic_bh_cb(opaque, retval); } -static int coroutine_fn vitastor_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes, QEMUIOVector *iov, int flags) +static int coroutine_fn vitastor_co_preadv(BlockDriverState *bs, +#if QEMU_VERSION_MAJOR >= 7 || QEMU_VERSION_MAJOR == 6 && QEMU_VERSION_MINOR >= 2 + int64_t offset, int64_t bytes, QEMUIOVector *iov, BdrvRequestFlags flags +#else + uint64_t offset, uint64_t bytes, QEMUIOVector *iov, int flags +#endif +) { VitastorClient *client = bs->opaque; VitastorRPC task; @@ -448,7 +473,13 @@ static int coroutine_fn vitastor_co_preadv(BlockDriverState *bs, uint64_t offset return task.ret; } -static int coroutine_fn vitastor_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes, QEMUIOVector *iov, int flags) +static int coroutine_fn vitastor_co_pwritev(BlockDriverState *bs, +#if QEMU_VERSION_MAJOR >= 7 || QEMU_VERSION_MAJOR == 6 && QEMU_VERSION_MINOR >= 2 + int64_t offset, int64_t bytes, QEMUIOVector *iov, BdrvRequestFlags flags +#else + uint64_t offset, uint64_t bytes, QEMUIOVector *iov, int flags +#endif +) { VitastorClient *client = bs->opaque; VitastorRPC task; diff --git a/src/vitastor_c.h b/src/vitastor_c.h index bad94aa6..e80f7d14 100644 --- a/src/vitastor_c.h +++ b/src/vitastor_c.h @@ -24,6 +24,7 @@ typedef void VitastorIOHandler(void *opaque, long retval); // QEMU typedef void IOHandler(void *opaque); +// is_external and poll_fn are not required, but are here for compatibility typedef void QEMUSetFDHandler(void *ctx, int fd, int is_external, IOHandler *fd_read, IOHandler *fd_write, void *poll_fn, void *opaque); vitastor_c *vitastor_c_create_qemu(QEMUSetFDHandler *aio_set_fd_handler, void *aio_context,