On Wed, Apr 18, 2018 at 11:04:18AM +0800, Fam Zheng wrote: > diff --git a/block/io.c b/block/io.c > index bd9a19a9c4..d274e9525f 100644 > --- a/block/io.c > +++ b/block/io.c > @@ -2826,3 +2826,94 @@ void bdrv_unregister_buf(BlockDriverState *bs, void > *host) > bdrv_unregister_buf(child->bs, host); > } > } > + > +static int bdrv_co_copy_range_internal(BdrvChild *src,
Please remember to use coroutine_fn for coroutines! This applies to the other functions in this patch too. > +int bdrv_co_copy_range(BdrvChild *src, uint64_t src_offset, > + BdrvChild *dst, uint64_t dst_offset, > + uint64_t bytes, BdrvRequestFlags flags) > +{ > + BdrvTrackedRequest src_req, dst_req; > + BlockDriverState *src_bs = src->bs; > + BlockDriverState *dst_bs = dst->bs; > + int ret; > + > + bdrv_inc_in_flight(src_bs); > + bdrv_inc_in_flight(dst_bs); > + tracked_request_begin(&src_req, src_bs, src_offset, > + bytes, BDRV_TRACKED_READ); > + tracked_request_begin(&dst_req, dst_bs, dst_offset, > + bytes, BDRV_TRACKED_WRITE); Tracked requests and in-flight counters are only updated on root nodes. This is not how read/write works. Does drain work on an internal or leaf node with multiple parents? > diff --git a/include/block/block.h b/include/block/block.h > index cdec3639a3..72ac011b2b 100644 > --- a/include/block/block.h > +++ b/include/block/block.h > @@ -604,4 +604,8 @@ bool bdrv_can_store_new_dirty_bitmap(BlockDriverState > *bs, const char *name, > */ > void bdrv_register_buf(BlockDriverState *bs, void *host, size_t size); > void bdrv_unregister_buf(BlockDriverState *bs, void *host); > + > +int bdrv_co_copy_range(BdrvChild *bs, uint64_t offset, > + BdrvChild *src, uint64_t src_offset, > + uint64_t bytes, BdrvRequestFlags flags); Please document this new block.h API. These arguments are in the wrong order! The first BdrvChild is the source and the second is the destination.
signature.asc
Description: PGP signature