On 26.10.19 23:25, Alberto Garcia wrote: > The bdrv_co_pwrite_zeroes() call here fills complete clusters with > zeroes, but it can happen that some subclusters are not part of the > write request or the copy-on-write. This patch makes sure that only > the affected subclusters are overwritten. > > A potential improvement would be to also fill with zeroes the other > subclusters if we can guarantee that we are not overwriting existing > data. However this would waste more disk space, so we should first > evaluate if it's really worth doing. > > Signed-off-by: Alberto Garcia > --- > block/qcow2.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/block/qcow2.c b/block/qcow2.c > index 0261e87709..01322ca449 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -2304,6 +2304,9 @@ static int handle_alloc_space(BlockDriverState *bs, QCowL2Meta *l2meta) > > for (m = l2meta; m != NULL; m = m->next) { > int ret; > + uint64_t start_offset = m->alloc_offset + m->cow_start.offset; > + uint64_t nb_bytes = m->cow_end.offset + m->cow_end.nb_bytes - > + m->cow_start.offset; It might be more honest to make nb_bytes an unsigned. (There shouldn’t be any overflows here, because the total size is limited to INT64_MAX by handle_alloc().) Max > if (!m->cow_start.nb_bytes && !m->cow_end.nb_bytes) { > continue;