Am 29.04.2019 um 12:57 hat Kevin Wolf geschrieben: > make_completely_empty() is an optimisated path for bdrv_make_empty() > where completely new metadata is created inside the image file instead > of going through all clusters and discarding them. For an external data > file, however, we actually need to do discard operations on the data > file; just overwriting the qcow2 file doesn't get rid of the data. > > The necessary slow path with an explicit discard operation already > exists for other cases. Use it for external data files, too. > > Cc: qemu-sta...@nongnu.org > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > block/qcow2.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/block/qcow2.c b/block/qcow2.c > index 7fbef97aab..097fde56f9 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -4384,7 +4384,8 @@ static int qcow2_make_empty(BlockDriverState *bs) > > if (s->qcow_version >= 3 && !s->snapshots && !s->nb_bitmaps && > 3 + l1_clusters <= s->refcount_block_size && > - s->crypt_method_header != QCOW_CRYPT_LUKS) { > + s->crypt_method_header != QCOW_CRYPT_LUKS && > + !has_data_file(bs)) { > /* The following function only works for qcow2 v3 images (it > * requires the dirty flag) and only as long as there are no > * features that reserve extra clusters (such as snapshots,
Oops, I hadn't everything committed yet. I'll add a comment change as well: * LUKS header, or persistent bitmaps), because it completely * empties the image. Furthermore, the L1 table and three * additional clusters (image header, refcount table, one - * refcount block) have to fit inside one refcount block. */ + * refcount block) have to fit inside one refcount block. It + * only resets the image file, i.e. does not work with an + * external data file. */ return make_completely_empty(bs); } Kevin