Il 19/07/2013 08:48, Peter Lieven ha scritto: >> @@ -3040,7 +3040,10 @@ int64_t bdrv_get_block_status(BlockDriverState >> *bs, int64_t sector_num, >> int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t >> sector_num, >> int nb_sectors, int *pnum) >> { >> - return bdrv_get_block_status(bs, sector_num, nb_sectors, pnum); >> + int64_t ret = bdrv_get_block_status(bs, sector_num, nb_sectors, >> pnum); >> + return >> + (ret & BDRV_BLOCK_DATA) || >> + ((ret & BDRV_BLOCK_ZERO) && !bdrv_has_zero_init(bs)); > > i do also not understand the "((ret & BDRV_BLOCK_ZERO) && > !bdrv_has_zero_init(bs))"; > if a block is unallocated and reads as zero, but the device lacks zero > init, it is declared as allocated with this, isn't it?
Perhaps bdrv_has_zero_init(bs) could be replaced by bs->backing_hd. I'd have to look at the code more closely. But I suggest that you try using get_block_status (the function in qemu-img.c) instead of bdrv_is_allocated in qemu-img.c. It will probably simplify your code _and_ make it more efficient. > for iscsi and host_device with lbprz==1 or discardzeroes respectively all > blocks would return as allocated. is this wanted? Paolo