On 25.06.2020 18:21, Max Reitz wrote:
> Use the child access functions in the block status inquiry functions as
> appropriate.
>
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
> block/io.c | 19 ++++++++++---------
> 1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/block/io.c b/block/io.c
> index 385176b331..dc9891d6ce 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -2407,11 +2407,12 @@ static int coroutine_fn bdrv_co_block_status(BlockDriverState *bs,
> if (ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ZERO)) {
> ret |= BDRV_BLOCK_ALLOCATED;
> } else if (want_zero) {
> + BlockDriverState *cow_bs = bdrv_cow_bs(bs);
> +
> if (bdrv_unallocated_blocks_are_zero(bs)) {
> ret |= BDRV_BLOCK_ZERO;
> - } else if (bs->backing) {
> - BlockDriverState *bs2 = bs->backing->bs;
> - int64_t size2 = bdrv_getlength(bs2);
> + } else if (cow_bs) {
> + int64_t size2 = bdrv_getlength(cow_bs);
>
> if (size2 >= 0 && offset >= size2) {
> ret |= BDRV_BLOCK_ZERO;
> @@ -2477,7 +2478,7 @@ static int coroutine_fn bdrv_co_block_status_above(BlockDriverState *bs,
> bool first = true;
>
> assert(bs != base);
> - for (p = bs; p != base; p = backing_bs(p)) {
> + for (p = bs; p != base; p = bdrv_filter_or_cow_bs(p)) {
> ret = bdrv_co_block_status(p, want_zero, offset, bytes, pnum, map,
> file);
> if (ret < 0) {
> @@ -2551,7 +2552,7 @@ int bdrv_block_status_above(BlockDriverState *bs, BlockDriverState *base,
> int bdrv_block_status(BlockDriverState *bs, int64_t offset, int64_t bytes,
> int64_t *pnum, int64_t *map, BlockDriverState **file)
> {
> - return bdrv_block_status_above(bs, backing_bs(bs),
> + return bdrv_block_status_above(bs, bdrv_filter_or_cow_bs(bs),
> offset, bytes, pnum, map, file);
> }
>
> @@ -2561,9 +2562,9 @@ int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t offset,
> int ret;
> int64_t dummy;
>
> - ret = bdrv_common_block_status_above(bs, backing_bs(bs), false, offset,
> - bytes, pnum ? pnum : &dummy, NULL,
> - NULL);
> + ret = bdrv_common_block_status_above(bs, bdrv_filter_or_cow_bs(bs), false,
> + offset, bytes, pnum ? pnum : &dummy,
> + NULL, NULL);
> if (ret < 0) {
> return ret;
> }
> @@ -2626,7 +2627,7 @@ int bdrv_is_allocated_above(BlockDriverState *top,
> break;
> }
>
> - intermediate = backing_bs(intermediate);
> + intermediate = bdrv_filter_or_cow_bs(intermediate);
> }
>
> *pnum = n;
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>