summary refs log tree commit diff stats
path: root/include/hw/qdev-properties-system.h
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2020-11-13 17:52:31 +0100
committerMax Reitz <mreitz@redhat.com>2020-12-18 12:35:55 +0100
commitef9bba1484bb8fb5fda53a7bf90bf5e1a8e6a9f6 (patch)
tree0a0950911a5ce75c4861b92502c7233715cdab6f /include/hw/qdev-properties-system.h
parentcff6d3ca43cdc8da0104204a52b0e4bd644e16e1 (diff)
downloadfocaccia-qemu-ef9bba1484bb8fb5fda53a7bf90bf5e1a8e6a9f6.tar.gz
focaccia-qemu-ef9bba1484bb8fb5fda53a7bf90bf5e1a8e6a9f6.zip
quorum: Implement bdrv_co_block_status()
The quorum driver does not implement bdrv_co_block_status() and
because of that it always reports to contain data even if all its
children are known to be empty.

One consequence of this is that if we for example create a quorum with
a size of 10GB and we mirror it to a new image the operation will
write 10GB of actual zeroes to the destination image wasting a lot of
time and disk space.

Since a quorum has an arbitrary number of children of potentially
different formats there is no way to report all possible allocation
status flags in a way that makes sense, so this implementation only
reports when a given region is known to contain zeroes
(BDRV_BLOCK_ZERO) or not (BDRV_BLOCK_DATA).

If all children agree that a region contains zeroes then we can return
BDRV_BLOCK_ZERO using the smallest size reported by the children
(because all agree that a region of at least that size contains
zeroes).

If at least one child disagrees we have to return BDRV_BLOCK_DATA.
In this case we use the largest of the sizes reported by the children
that didn't return BDRV_BLOCK_ZERO (because we know that there won't
be an agreement for at least that size).

Signed-off-by: Alberto Garcia <berto@igalia.com>
Tested-by: Tao Xu <tao3.xu@intel.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <db83149afcf0f793effc8878089d29af4c46ffe1.1605286097.git.berto@igalia.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'include/hw/qdev-properties-system.h')
0 files changed, 0 insertions, 0 deletions