qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Paolo Bonzini
Subject: Re: [PATCH 08/18] block: Add blk_[co_]preadv_part()
Date: Tue, 17 May 2022 16:30:31 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0

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,




reply via email to

[Prev in Thread] Current Thread [Next in Thread]