diff mbox series

[08/18] block: Add blk_[co_]preadv_part()

Message ID 20220517113837.199696-4-afaria@redhat.com
State New
Headers show
Series Make block-backend-io.h API more consistent | expand

Commit Message

Alberto Faria May 17, 2022, 11:38 a.m. UTC
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(-)

Comments

Paolo Bonzini May 17, 2022, 2:30 p.m. UTC | #1
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,
Hanna Czenczek July 5, 2022, 8:15 a.m. UTC | #2
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>
diff mbox series

Patch

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,