On 05.02.19 10:08, Denis Plotnikov wrote: > The patch adds some preparation parts for incompatible compression type > feature into QCOW2 header that indicates that *all* compressed clusters > must be (de)compressed using a certain compression type. > > It is implied that the compression type is set on the image creation and > can be changed only later by image convertion, thus the only compression > algorithm is used for the image. > > The plan is to add support for ZSTD and then may be something more effective > in the future. > > ZSDT compression algorithm consumes 3-5 times less CPU power with a > comparable comression ratio with zlib. It would be wise to use it for > data compression f.e. for backups. > > The default compression is ZLIB. > > Signed-off-by: Denis Plotnikov <dplotni...@virtuozzo.com> > --- > block/qcow2.c | 25 +++++++++++++++++++++++++ > block/qcow2.h | 26 ++++++++++++++++++++++---- > 2 files changed, 47 insertions(+), 4 deletions(-)
Are there plans to pursue this further? [...] > diff --git a/block/qcow2.h b/block/qcow2.h > index 32cce9eee2..fdde5bbefd 100644 > --- a/block/qcow2.h > +++ b/block/qcow2.h > @@ -112,6 +112,10 @@ > #define QCOW2_OPT_REFCOUNT_CACHE_SIZE "refcount-cache-size" > #define QCOW2_OPT_CACHE_CLEAN_INTERVAL "cache-clean-interval" > > +/* Compression types */ > +#define QCOW2_COMPRESSION_TYPE_ZLIB 0 > +#define QCOW2_COMPRESSION_TYPE_ZSTD 1 We probably want QAPI types anyway (qemu-img info should report the compression type), so I think we could use them instead. > typedef struct QCowHeader { > uint32_t magic; > uint32_t version; > @@ -197,10 +201,13 @@ enum { > > /* Incompatible feature bits */ > enum { > - QCOW2_INCOMPAT_DIRTY_BITNR = 0, > - QCOW2_INCOMPAT_CORRUPT_BITNR = 1, > - QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR, > - QCOW2_INCOMPAT_CORRUPT = 1 << QCOW2_INCOMPAT_CORRUPT_BITNR, > + QCOW2_INCOMPAT_DIRTY_BITNR = 0, > + QCOW2_INCOMPAT_CORRUPT_BITNR = 1, > + QCOW2_INCOMPAT_COMPRESSION_TYPE_BITNR = 2, > + QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR, > + QCOW2_INCOMPAT_CORRUPT = 1 << > QCOW2_INCOMPAT_CORRUPT_BITNR, > + QCOW2_INCOMPAT_COMPRESSION_TYPE = > + 1 << > QCOW2_INCOMPAT_COMPRESSION_TYPE_BITNR, > > QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY > | QCOW2_INCOMPAT_CORRUPT, This mask needs to be expanded by QCOW2_INCOMPAT_COMPRESSION_TYPE. > @@ -256,6 +263,10 @@ typedef struct Qcow2BitmapHeaderExt { > uint64_t bitmap_directory_offset; > } QEMU_PACKED Qcow2BitmapHeaderExt; > > +typedef struct Qcow2CompressionTypeExt { > + uint32_t compression_type; > +} QEMU_PACKED Qcow2CompressionTypeExt; > + > typedef struct BDRVQcow2State { > int cluster_bits; > int cluster_size; > @@ -340,6 +351,13 @@ typedef struct BDRVQcow2State { > > CoQueue compress_wait_queue; > int nb_compress_threads; > + /** > + * Compression type used for the image. Default: 0 - ZLIB > + * The image compression type is set on image creation. > + * The only way to change the compression type is to convert the image > + * with the desired compresion type set *compression And, well, ideally qemu-img amend could perform this operation, too. Max > + */ > + uint32_t compression_type; > } BDRVQcow2State; > > typedef struct Qcow2COWRegion { >
signature.asc
Description: OpenPGP digital signature