qcow2: rework the cluster compression routine

The patch enables processing the image compression type defined
for the image and chooses an appropriate method for image clusters
(de)compression.

Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200507082521.29210-3-dplotnikov@virtuozzo.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Denis Plotnikov 2020-05-07 11:25:19 +03:00 committed by Max Reitz
parent 572ad9783f
commit 25dd077d1d
1 changed files with 60 additions and 11 deletions

View File

@ -74,7 +74,9 @@ typedef struct Qcow2CompressData {
} Qcow2CompressData; } Qcow2CompressData;
/* /*
* qcow2_compress() * qcow2_zlib_compress()
*
* Compress @src_size bytes of data using zlib compression method
* *
* @dest - destination buffer, @dest_size bytes * @dest - destination buffer, @dest_size bytes
* @src - source buffer, @src_size bytes * @src - source buffer, @src_size bytes
@ -83,8 +85,8 @@ typedef struct Qcow2CompressData {
* -ENOMEM destination buffer is not enough to store compressed data * -ENOMEM destination buffer is not enough to store compressed data
* -EIO on any other error * -EIO on any other error
*/ */
static ssize_t qcow2_compress(void *dest, size_t dest_size, static ssize_t qcow2_zlib_compress(void *dest, size_t dest_size,
const void *src, size_t src_size) const void *src, size_t src_size)
{ {
ssize_t ret; ssize_t ret;
z_stream strm; z_stream strm;
@ -119,10 +121,10 @@ 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 * 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 * @dest - destination buffer, @dest_size bytes
* @src - source buffer, @src_size bytes * @src - source buffer, @src_size bytes
@ -130,8 +132,8 @@ static ssize_t qcow2_compress(void *dest, size_t dest_size,
* Returns: 0 on success * Returns: 0 on success
* -EIO on fail * -EIO on fail
*/ */
static ssize_t qcow2_decompress(void *dest, size_t dest_size, static ssize_t qcow2_zlib_decompress(void *dest, size_t dest_size,
const void *src, size_t src_size) const void *src, size_t src_size)
{ {
int ret; int ret;
z_stream strm; z_stream strm;
@ -191,20 +193,67 @@ qcow2_co_do_compress(BlockDriverState *bs, void *dest, size_t dest_size,
return arg.ret; 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: compressed size on success
* a negative error code on failure
*/
ssize_t coroutine_fn ssize_t coroutine_fn
qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size, qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size,
const void *src, size_t src_size) const void *src, size_t src_size)
{ {
return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, BDRVQcow2State *s = bs->opaque;
qcow2_compress); Qcow2CompressFunc fn;
switch (s->compression_type) {
case QCOW2_COMPRESSION_TYPE_ZLIB:
fn = qcow2_zlib_compress;
break;
default:
abort();
}
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 failure
*/
ssize_t coroutine_fn ssize_t coroutine_fn
qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size, qcow2_co_decompress(BlockDriverState *bs, void *dest, size_t dest_size,
const void *src, size_t src_size) const void *src, size_t src_size)
{ {
return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, BDRVQcow2State *s = bs->opaque;
qcow2_decompress); Qcow2CompressFunc fn;
switch (s->compression_type) {
case QCOW2_COMPRESSION_TYPE_ZLIB:
fn = qcow2_zlib_decompress;
break;
default:
abort();
}
return qcow2_co_do_compress(bs, dest, dest_size, src, src_size, fn);
} }