On 04.07.19 15:09, Denis Plotnikov wrote: > The patch allow to process image compression type defined > in the image header and choose an appropriate method for > image clusters (de)compression. > > Signed-off-by: Denis Plotnikov > --- > block/qcow2.c | 93 ++++++++++++++++++++++++++++++++++++++++----------- > 1 file changed, 73 insertions(+), 20 deletions(-) I tried my best to rebase this patch on top of the current master, I hope I did it right. (A couple of the hunks in this patch are already in master.) > diff --git a/block/qcow2.c b/block/qcow2.c > index 8fa932a349..a107f76e98 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c [...] > @@ -4059,8 +4062,8 @@ static ssize_t qcow2_compress(void *dest, size_t dest_size, > * Returns: 0 on success > * -1 on fail This should be fixed to reflect the new return values. > */ > -static ssize_t qcow2_decompress(void *dest, size_t dest_size, > - const void *src, size_t src_size) > +static ssize_t qcow2_zlib_decompress(void *dest, size_t dest_size, > + const void *src, size_t src_size) > { > int ret = 0; > z_stream strm; [...] > @@ -4153,20 +4156,67 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest, size_t dest_size, > return arg.ret; > } > > +/* > + * qcow2_co_compress() > + * > + * Compress @src_size bytes of data using the compression > + * method defined by the image compression type > + * > + * @dest - destination buffer, @dest_size bytes > + * @src - source buffer, @src_size bytes > + * > + * Returns: 0 on success > + * a negative error code on fail > + */ > static ssize_t coroutine_fn > qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size, > const void *src, size_t src_size) > { > - return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, > - qcow2_compress); > + BDRVQcow2State *s = bs->opaque; > + Qcow2CompressFunc fn; > + > + switch (s->compression_type) { > + case QCOW2_COMPRESSION_TYPE_ZLIB: > + fn = qcow2_zlib_compress; > + break; > + > + default: > + return -ENOTSUP; A plain abort() would work, too. (Your choice.) > + } > + > + return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, fn); > } > > +/* > + * qcow2_co_decompress() > + * > + * Decompress some data (not more than @src_size bytes) to produce exactly > + * @dest_size bytes using the compression method defined by the image > + * compression type > + * > + * @dest - destination buffer, @dest_size bytes > + * @src - source buffer, @src_size bytes > + * > + * Returns: 0 on success > + * a negative error code on fail > + */ > static ssize_t coroutine_fn > qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size, > const void *src, size_t src_size) > { > - return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, > - qcow2_decompress); > + BDRVQcow2State *s = bs->opaque; > + Qcow2CompressFunc fn; > + > + switch (s->compression_type) { > + case QCOW2_COMPRESSION_TYPE_ZLIB: > + fn = qcow2_zlib_decompress; > + break; > + > + default: > + return -ENOTSUP; Same here. Max > + } > + > + return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, fn); > }