@@ -2963,7 +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;
+ int64_t ret, ret2;
if (sector_num >= bs->total_sectors) {
*pnum = 0;
@@ -2989,6 +2989,14 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
ret |= BDRV_BLOCK_ZERO;
}
+ if (bs->file &&
+ (ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) &&
+ (ret & BDRV_BLOCK_OFFSET_VALID)) {
+ ret2 = bdrv_co_get_block_status(bs->file, ret >> BDRV_SECTOR_BITS,
+ *pnum, pnum);
+ ret |= (ret2 & BDRV_BLOCK_ZERO);
+ }
+
return ret;
}
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- block.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)