quorum: Implement bdrv_co_block_status()
commitef9bba1484bb8fb5fda53a7bf90bf5e1a8e6a9f6
authorAlberto Garcia <berto@igalia.com>
Fri, 13 Nov 2020 16:52:31 +0000 (13 17:52 +0100)
committerMax Reitz <mreitz@redhat.com>
Fri, 18 Dec 2020 11:35:55 +0000 (18 12:35 +0100)
tree0a0950911a5ce75c4861b92502c7233715cdab6f
parentcff6d3ca43cdc8da0104204a52b0e4bd644e16e1
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>
block/quorum.c
tests/qemu-iotests/312 [new file with mode: 0755]
tests/qemu-iotests/312.out [new file with mode: 0644]
tests/qemu-iotests/group