Implement blk_preadv_part() using generated_co_wrapper.
Signed-off-by: Alberto Faria <afaria@redhat.com>
---
block/block-backend.c | 30 +++++++++++++++++++++++-------
block/coroutines.h | 5 -----
include/sysemu/block-backend-io.h | 7 +++++++
tests/unit/test-block-iothread.c | 19 +++++++++++++++++++
4 files changed, 49 insertions(+), 12 deletions(-)
diff --git a/block/block-backend.c b/block/block-backend.c
index c2a4c44a99..3920e1f45e 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -1284,9 +1284,10 @@ static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
}
/* To be called between exactly one pair of blk_inc/dec_in_flight() */
-int coroutine_fn
-blk_co_do_preadv(BlockBackend *blk, int64_t offset, int64_t bytes,
- QEMUIOVector *qiov, BdrvRequestFlags flags)
+static int coroutine_fn
+blk_co_do_preadv_part(BlockBackend *blk, int64_t offset, int64_t bytes,
+ QEMUIOVector *qiov, size_t qiov_offset,
+ BdrvRequestFlags flags)
{
int ret;
BlockDriverState *bs;
@@ -1311,7 +1312,8 @@ blk_co_do_preadv(BlockBackend *blk, int64_t offset, int64_t bytes,
bytes, false);
}
- ret = bdrv_co_preadv(blk->root, offset, bytes, qiov, flags);
+ ret = bdrv_co_preadv_part(blk->root, offset, bytes, qiov, qiov_offset,
+ flags);
bdrv_dec_in_flight(bs);
return ret;
}
@@ -1324,7 +1326,21 @@ int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
IO_OR_GS_CODE();
blk_inc_in_flight(blk);
- ret = blk_co_do_preadv(blk, offset, bytes, qiov, flags);
+ ret = blk_co_do_preadv_part(blk, offset, bytes, qiov, 0, flags);
+ blk_dec_in_flight(blk);
+
+ return ret;
+}
+
+int coroutine_fn blk_co_preadv_part(BlockBackend *blk, int64_t offset,
+ int64_t bytes, QEMUIOVector *qiov,
+ size_t qiov_offset, BdrvRequestFlags flags)
+{
+ int ret;
+ IO_OR_GS_CODE();
+
+ blk_inc_in_flight(blk);
+ ret = blk_co_do_preadv_part(blk, offset, bytes, qiov, qiov_offset, flags);
blk_dec_in_flight(blk);
return ret;
@@ -1541,8 +1557,8 @@ static void blk_aio_read_entry(void *opaque)
QEMUIOVector *qiov = rwco->iobuf;
assert(qiov->size == acb->bytes);
- rwco->ret = blk_co_do_preadv(rwco->blk, rwco->offset, acb->bytes,
- qiov, rwco->flags);
+ rwco->ret = blk_co_do_preadv_part(rwco->blk, rwco->offset, acb->bytes, qiov,
+ 0, rwco->flags);
blk_aio_complete(acb);
}
diff --git a/block/coroutines.h b/block/coroutines.h
index 443ef2f2e6..85423f8db6 100644
--- a/block/coroutines.h
+++ b/block/coroutines.h
@@ -63,11 +63,6 @@ nbd_co_do_establish_connection(BlockDriverState *bs, bool blocking,
Error **errp);
-int coroutine_fn
-blk_co_do_preadv(BlockBackend *blk, int64_t offset, int64_t bytes,
- QEMUIOVector *qiov, BdrvRequestFlags flags);
-
-
int coroutine_fn
blk_co_do_pwritev_part(BlockBackend *blk, int64_t offset, int64_t bytes,
QEMUIOVector *qiov, size_t qiov_offset,
diff --git a/include/sysemu/block-backend-io.h b/include/sysemu/block-backend-io.h
index 3b548a8ae1..29954a466c 100644
--- a/include/sysemu/block-backend-io.h
+++ b/include/sysemu/block-backend-io.h
@@ -108,6 +108,13 @@ int generated_co_wrapper blk_pread(BlockBackend *blk, int64_t offset,
int generated_co_wrapper blk_pwrite(BlockBackend *blk, int64_t offset,
int64_t bytes, const void *buf,
BdrvRequestFlags flags);
+int generated_co_wrapper blk_preadv_part(BlockBackend *blk, int64_t offset,
+ int64_t bytes, QEMUIOVector *qiov,
+ size_t qiov_offset,
+ BdrvRequestFlags flags);
+int coroutine_fn blk_co_preadv_part(BlockBackend *blk, int64_t offset,
+ int64_t bytes, QEMUIOVector *qiov,
+ size_t qiov_offset, BdrvRequestFlags flags);
int generated_co_wrapper blk_preadv(BlockBackend *blk, int64_t offset,
int64_t bytes, QEMUIOVector *qiov,
BdrvRequestFlags flags);
diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
index b9c5da3a87..2fa1248445 100644
--- a/tests/unit/test-block-iothread.c
+++ b/tests/unit/test-block-iothread.c
@@ -168,6 +168,21 @@ static void test_sync_op_blk_pwritev(BlockBackend *blk)
g_assert_cmpint(ret, ==, -EIO);
}
+static void test_sync_op_blk_preadv_part(BlockBackend *blk)
+{
+ uint8_t buf[512];
+ QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, sizeof(buf));
+ int ret;
+
+ /* Success */
+ ret = blk_preadv_part(blk, 0, sizeof(buf), &qiov, 0, 0);
+ g_assert_cmpint(ret, ==, 0);
+
+ /* Early error: Negative offset */
+ ret = blk_preadv_part(blk, -2, sizeof(buf), &qiov, 0, 0);
+ g_assert_cmpint(ret, ==, -EIO);
+}
+
static void test_sync_op_load_vmstate(BdrvChild *c)
{
uint8_t buf[512];
@@ -339,6 +354,10 @@ const SyncOpTest sync_op_tests[] = {
.name = "/sync-op/pwritev",
.fn = NULL,
.blkfn = test_sync_op_blk_pwritev,
+ }, {
+ .name = "/sync-op/preadv_part",
+ .fn = NULL,
+ .blkfn = test_sync_op_blk_preadv_part,
}, {
.name = "/sync-op/load_vmstate",
.fn = test_sync_op_load_vmstate,
--
2.35.3
On 17.05.22 13:38, Alberto Faria wrote: > Implement blk_preadv_part() using generated_co_wrapper. > > Signed-off-by: Alberto Faria <afaria@redhat.com> > --- > block/block-backend.c | 30 +++++++++++++++++++++++------- > block/coroutines.h | 5 ----- > include/sysemu/block-backend-io.h | 7 +++++++ > tests/unit/test-block-iothread.c | 19 +++++++++++++++++++ > 4 files changed, 49 insertions(+), 12 deletions(-) Reviewed-by: Hanna Reitz <hreitz@redhat.com>
On 5/17/22 13:38, Alberto Faria wrote:
> Implement blk_preadv_part() using generated_co_wrapper.
>
> Signed-off-by: Alberto Faria <afaria@redhat.com>
> ---
> block/block-backend.c | 30 +++++++++++++++++++++++-------
> block/coroutines.h | 5 -----
> include/sysemu/block-backend-io.h | 7 +++++++
> tests/unit/test-block-iothread.c | 19 +++++++++++++++++++
> 4 files changed, 49 insertions(+), 12 deletions(-)
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> diff --git a/block/block-backend.c b/block/block-backend.c
> index c2a4c44a99..3920e1f45e 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -1284,9 +1284,10 @@ static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
> }
>
> /* To be called between exactly one pair of blk_inc/dec_in_flight() */
> -int coroutine_fn
> -blk_co_do_preadv(BlockBackend *blk, int64_t offset, int64_t bytes,
> - QEMUIOVector *qiov, BdrvRequestFlags flags)
> +static int coroutine_fn
> +blk_co_do_preadv_part(BlockBackend *blk, int64_t offset, int64_t bytes,
> + QEMUIOVector *qiov, size_t qiov_offset,
> + BdrvRequestFlags flags)
> {
> int ret;
> BlockDriverState *bs;
> @@ -1311,7 +1312,8 @@ blk_co_do_preadv(BlockBackend *blk, int64_t offset, int64_t bytes,
> bytes, false);
> }
>
> - ret = bdrv_co_preadv(blk->root, offset, bytes, qiov, flags);
> + ret = bdrv_co_preadv_part(blk->root, offset, bytes, qiov, qiov_offset,
> + flags);
> bdrv_dec_in_flight(bs);
> return ret;
> }
> @@ -1324,7 +1326,21 @@ int coroutine_fn blk_co_preadv(BlockBackend *blk, int64_t offset,
> IO_OR_GS_CODE();
>
> blk_inc_in_flight(blk);
> - ret = blk_co_do_preadv(blk, offset, bytes, qiov, flags);
> + ret = blk_co_do_preadv_part(blk, offset, bytes, qiov, 0, flags);
> + blk_dec_in_flight(blk);
> +
> + return ret;
> +}
> +
> +int coroutine_fn blk_co_preadv_part(BlockBackend *blk, int64_t offset,
> + int64_t bytes, QEMUIOVector *qiov,
> + size_t qiov_offset, BdrvRequestFlags flags)
> +{
> + int ret;
> + IO_OR_GS_CODE();
> +
> + blk_inc_in_flight(blk);
> + ret = blk_co_do_preadv_part(blk, offset, bytes, qiov, qiov_offset, flags);
> blk_dec_in_flight(blk);
>
> return ret;
> @@ -1541,8 +1557,8 @@ static void blk_aio_read_entry(void *opaque)
> QEMUIOVector *qiov = rwco->iobuf;
>
> assert(qiov->size == acb->bytes);
> - rwco->ret = blk_co_do_preadv(rwco->blk, rwco->offset, acb->bytes,
> - qiov, rwco->flags);
> + rwco->ret = blk_co_do_preadv_part(rwco->blk, rwco->offset, acb->bytes, qiov,
> + 0, rwco->flags);
> blk_aio_complete(acb);
> }
>
> diff --git a/block/coroutines.h b/block/coroutines.h
> index 443ef2f2e6..85423f8db6 100644
> --- a/block/coroutines.h
> +++ b/block/coroutines.h
> @@ -63,11 +63,6 @@ nbd_co_do_establish_connection(BlockDriverState *bs, bool blocking,
> Error **errp);
>
>
> -int coroutine_fn
> -blk_co_do_preadv(BlockBackend *blk, int64_t offset, int64_t bytes,
> - QEMUIOVector *qiov, BdrvRequestFlags flags);
> -
> -
> int coroutine_fn
> blk_co_do_pwritev_part(BlockBackend *blk, int64_t offset, int64_t bytes,
> QEMUIOVector *qiov, size_t qiov_offset,
> diff --git a/include/sysemu/block-backend-io.h b/include/sysemu/block-backend-io.h
> index 3b548a8ae1..29954a466c 100644
> --- a/include/sysemu/block-backend-io.h
> +++ b/include/sysemu/block-backend-io.h
> @@ -108,6 +108,13 @@ int generated_co_wrapper blk_pread(BlockBackend *blk, int64_t offset,
> int generated_co_wrapper blk_pwrite(BlockBackend *blk, int64_t offset,
> int64_t bytes, const void *buf,
> BdrvRequestFlags flags);
> +int generated_co_wrapper blk_preadv_part(BlockBackend *blk, int64_t offset,
> + int64_t bytes, QEMUIOVector *qiov,
> + size_t qiov_offset,
> + BdrvRequestFlags flags);
> +int coroutine_fn blk_co_preadv_part(BlockBackend *blk, int64_t offset,
> + int64_t bytes, QEMUIOVector *qiov,
> + size_t qiov_offset, BdrvRequestFlags flags);
> int generated_co_wrapper blk_preadv(BlockBackend *blk, int64_t offset,
> int64_t bytes, QEMUIOVector *qiov,
> BdrvRequestFlags flags);
> diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
> index b9c5da3a87..2fa1248445 100644
> --- a/tests/unit/test-block-iothread.c
> +++ b/tests/unit/test-block-iothread.c
> @@ -168,6 +168,21 @@ static void test_sync_op_blk_pwritev(BlockBackend *blk)
> g_assert_cmpint(ret, ==, -EIO);
> }
>
> +static void test_sync_op_blk_preadv_part(BlockBackend *blk)
> +{
> + uint8_t buf[512];
> + QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, sizeof(buf));
> + int ret;
> +
> + /* Success */
> + ret = blk_preadv_part(blk, 0, sizeof(buf), &qiov, 0, 0);
> + g_assert_cmpint(ret, ==, 0);
> +
> + /* Early error: Negative offset */
> + ret = blk_preadv_part(blk, -2, sizeof(buf), &qiov, 0, 0);
> + g_assert_cmpint(ret, ==, -EIO);
> +}
> +
> static void test_sync_op_load_vmstate(BdrvChild *c)
> {
> uint8_t buf[512];
> @@ -339,6 +354,10 @@ const SyncOpTest sync_op_tests[] = {
> .name = "/sync-op/pwritev",
> .fn = NULL,
> .blkfn = test_sync_op_blk_pwritev,
> + }, {
> + .name = "/sync-op/preadv_part",
> + .fn = NULL,
> + .blkfn = test_sync_op_blk_preadv_part,
> }, {
> .name = "/sync-op/load_vmstate",
> .fn = test_sync_op_load_vmstate,
© 2016 - 2026 Red Hat, Inc.