On 5/5/20 12:38 PM, Alberto Garcia wrote:
> Setting the QCOW_OFLAG_ZERO bit of the L2 entry is forbidden if an
> image has subclusters. Instead, the individual 'all zeroes' bits must
> be used.
Should we s/is forbidden/is ignored/ based on your spec changes?
But the patch itself is right.
Reviewed-by: Eric Blake <eblake@redhat.com>
>
> Signed-off-by: Alberto Garcia <berto@igalia.com>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
> block/qcow2-refcount.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
> index dfdcdd3c25..9bb161481e 100644
> --- a/block/qcow2-refcount.c
> +++ b/block/qcow2-refcount.c
> @@ -1686,8 +1686,13 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
> int ign = active ? QCOW2_OL_ACTIVE_L2 :
> QCOW2_OL_INACTIVE_L2;
>
> - l2_entry = QCOW_OFLAG_ZERO;
> - set_l2_entry(s, l2_table, i, l2_entry);
> + if (has_subclusters(s)) {
> + set_l2_entry(s, l2_table, i, 0);
> + set_l2_bitmap(s, l2_table, i,
> + QCOW_L2_BITMAP_ALL_ZEROES);
> + } else {
> + set_l2_entry(s, l2_table, i, QCOW_OFLAG_ZERO);
> + }
> ret = qcow2_pre_write_overlap_check(bs, ign,
> l2e_offset, l2_entry_size(s), false);
> if (ret < 0) {
>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org