On Fri, Mar 10, 2023 at 06:31:04PM +0800, Sam Li wrote: > A zone append command is a write operation that specifies the first > logical block of a zone as the write position. When writing to a zoned > block device using zone append, the byte offset of writes is pointing > to the write pointer of that zone. Upon completion the device will > respond with the position the data has been written in the zone. > > Signed-off-by: Sam Li <faithilike...@gmail.com> > --- > block/block-backend.c | 60 +++++++++++++++++++++++++++++++ > block/file-posix.c | 54 +++++++++++++++++++++++++--- > block/io.c | 21 +++++++++++ > block/io_uring.c | 4 +++ > block/linux-aio.c | 3 ++ > block/raw-format.c | 8 +++++ > include/block/block-io.h | 4 +++ > include/block/block_int-common.h | 5 +++ > include/block/raw-aio.h | 4 ++- > include/sysemu/block-backend-io.h | 9 +++++ > 10 files changed, 166 insertions(+), 6 deletions(-) > > diff --git a/block/block-backend.c b/block/block-backend.c > index f70b08e3f6..28e8f5d778 100644 > --- a/block/block-backend.c > +++ b/block/block-backend.c > @@ -1888,6 +1888,45 @@ BlockAIOCB *blk_aio_zone_mgmt(BlockBackend *blk, > BlockZoneOp op, > return &acb->common; > } > > +static void coroutine_fn blk_aio_zone_append_entry(void *opaque) > +{ > + BlkAioEmAIOCB *acb = opaque; > + BlkRwCo *rwco = &acb->rwco; > + > + rwco->ret = blk_co_zone_append(rwco->blk, &acb->bytes, > + rwco->iobuf, rwco->flags); > + blk_aio_complete(acb); > +} > + > +BlockAIOCB *blk_aio_zone_append(BlockBackend *blk, int64_t *offset, > + QEMUIOVector *qiov, BdrvRequestFlags flags, > + BlockCompletionFunc *cb, void *opaque) { > + BlkAioEmAIOCB *acb; > + Coroutine *co; > + IO_CODE(); > + > + blk_inc_in_flight(blk); > + acb = blk_aio_get(&blk_aio_em_aiocb_info, blk, cb, opaque); > + acb->rwco = (BlkRwCo) { > + .blk = blk, > + .ret = NOT_DONE, > + .flags = flags, > + .iobuf = qiov, > + }; > + acb->bytes = *offset; > + acb->has_returned = false; > + > + co = qemu_coroutine_create(blk_aio_zone_append_entry, acb); > + aio_co_enter(blk_get_aio_context(blk), co); > + acb->has_returned = true; > + if (acb->rwco.ret != NOT_DONE) { > + replay_bh_schedule_oneshot_event(blk_get_aio_context(blk), > + blk_aio_complete_bh, acb); > + } > + > + return &acb->common; > +}
How is the resulting offset value communicated back to the caller? I see offset being read (dereferenced) but there is no write (assignment). Maybe this function should pass through acb->bytes = (int64_t)offset instead so that blk_co_zone_append() can modify the offset?
signature.asc
Description: PGP signature