On 25.06.2020 18:21, Max Reitz wrote:
There are two practical problems with bdrv_get_allocated_file_size()'s default right now: (1) For drivers with children, we should generally sum all their sizes instead of just passing the request through to bs->file. The latter is good for filters, but not so much for format drivers.(2) Filters need not have bs->file, so we should actually go to the filtered child instead of hard-coding bs->file. And we can make the whole default implementation more idiomatic by using the three generic functions added by the previous patch. Signed-off-by: Max Reitz <[email protected]> --- block.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index fc01ce90b3..a19f243997 100644 --- a/block.c +++ b/block.c @@ -4997,10 +4997,21 @@ int64_t bdrv_get_allocated_file_size(BlockDriverState *bs) if (drv->bdrv_get_allocated_file_size) { return drv->bdrv_get_allocated_file_size(bs); } - if (bs->file) { - return bdrv_get_allocated_file_size(bs->file->bs); + + if (drv->bdrv_file_open) { + /* + * Protocol drivers default to -ENOTSUP (most of their data is + * not stored in any of their children (if they even have any), + * so there is no generic way to figure it out). + */ + return bdrv_notsup_allocated_file_size(bs); + } else if (drv->is_filter) { + /* Filter drivers default to the size of their primary child */ + return bdrv_primary_allocated_file_size(bs); + } else { + /* Other drivers default to summing their children's sizes */ + return bdrv_sum_allocated_file_size(bs); } - return -ENOTSUP; }/**
Reviewed-by: Andrey Shinkevich <[email protected]>
