Message ID | 20220517113837.199696-4-afaria@redhat.com |
---|---|
State | New |
Headers | show |
Series | Make block-backend-io.h API more consistent | expand |
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,
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 --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,
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(-)