If the driver does not implement bdrv_get_allocated_file_size(), we should fall back to cumulating the allocated size of all non-COW children instead of just bs->file.
Suggested-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> Signed-off-by: Max Reitz <mre...@redhat.com> --- block.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 1070aa1ba9..6e1ddab056 100644 --- a/block.c +++ b/block.c @@ -4650,9 +4650,27 @@ 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 (!QLIST_EMPTY(&bs->children)) { + BdrvChild *child; + int64_t child_size, total_size = 0; + + QLIST_FOREACH(child, &bs->children, next) { + if (child == bdrv_filtered_cow_child(bs)) { + /* Ignore COW backing files */ + continue; + } + + child_size = bdrv_get_allocated_file_size(child->bs); + if (child_size < 0) { + return child_size; + } + total_size += child_size; + } + + return total_size; } + return -ENOTSUP; } -- 2.21.0