@@ -2963,6 +2963,7 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
int nb_sectors, int *pnum)
{
int64_t n;
+ int64_t ret;
if (sector_num >= bs->total_sectors) {
*pnum = 0;
@@ -2979,7 +2980,12 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
return BDRV_BLOCK_DATA;
}
- return bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum);
+ ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum);
+ if (!(ret & BDRV_BLOCK_DATA) && bdrv_has_zero_init(bs)) {
+ ret |= BDRV_BLOCK_ZERO;
+ }
+
+ return ret;
}
/* Coroutine wrapper for bdrv_get_block_status() */
Alternatively, this could use a "discard zeroes data" flag returned by bdrv_get_info. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- block.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)