Message ID | 659488f9bf4bf0291191f3d426a5567698924084.1588699789.git.berto@igalia.com |
---|---|
State | New |
Headers | show |
Series | Add subcluster allocation to qcow2 | expand |
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) { >
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) {