Am 28.08.2019 um 14:56 hat Denis Plotnikov geschrieben: > 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 <dplotni...@virtuozzo.com> > --- > block/qcow2-threads.c | 78 +++++++++++++++++++++++++++++++++++-------- > 1 file changed, 64 insertions(+), 14 deletions(-) > > diff --git a/block/qcow2-threads.c b/block/qcow2-threads.c > index 3b1e63fe41..14b5bd76fb 100644 > --- a/block/qcow2-threads.c > +++ b/block/qcow2-threads.c > @@ -73,8 +73,11 @@ typedef struct Qcow2CompressData { > Qcow2CompressFunc func; > } Qcow2CompressData; > > +
Accidentally added newline? > /* > - * qcow2_compress() > + * qcow2_zlib_compress() > + * > + * Compress @src_size bytes of data using zlib compression method > * > * @dest - destination buffer, @dest_size bytes > * @src - source buffer, @src_size bytes > @@ -83,8 +86,8 @@ typedef struct Qcow2CompressData { > * -ENOMEM destination buffer is not enough to store compressed data > * -EIO on any other error > */ > -static ssize_t qcow2_compress(void *dest, size_t dest_size, > - const void *src, size_t src_size) > +static ssize_t qcow2_zlib_compress(void *dest, size_t dest_size, > + const void *src, size_t src_size) > { > ssize_t ret; > z_stream strm; > @@ -119,19 +122,19 @@ static ssize_t qcow2_compress(void *dest, size_t > dest_size, > } > > /* > - * qcow2_decompress() > + * qcow2_zlib_decompress() > * > * Decompress some data (not more than @src_size bytes) to produce exactly > - * @dest_size bytes. > + * @dest_size bytes using zlib compression method > * > * @dest - destination buffer, @dest_size bytes > * @src - source buffer, @src_size bytes > * > * Returns: 0 on success > - * -1 on fail > + * -EIO on fail > */ > -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; > @@ -144,7 +147,7 @@ static ssize_t qcow2_decompress(void *dest, size_t > dest_size, > > ret = inflateInit2(&strm, -12); > if (ret != Z_OK) { > - return -1; > + return -EIO; > } > > ret = inflate(&strm, Z_FINISH); > @@ -154,7 +157,7 @@ static ssize_t qcow2_decompress(void *dest, size_t > dest_size, > * @src buffer may be processed partly (because in qcow2 we know > size of > * compressed data with precision of one sector) > */ > - ret = -1; > + ret = -EIO; > } > > inflateEnd(&strm); > @@ -189,20 +192,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 on failure > + */ > 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; > + } > + > + 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 on failure > + */ > 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; > + } > + > + return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, fn); > } Kevin