From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500993842165452.54378523057596; Tue, 25 Jul 2017 07:44:02 -0700 (PDT) Received: from localhost ([::1]:32941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da141-00039Y-3J for importer@patchew.org; Tue, 25 Jul 2017 10:43:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36335) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da121-0001n9-Et for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da11x-0000qb-2B for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:53 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:33044 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da11w-0000ow-Pg for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:49 -0400 Received: (qmail 14939 invoked by uid 89); 25 Jul 2017 14:41:44 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.315996 secs); 25 Jul 2017 14:41:44 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:41 -0000 Received: (qmail 9620 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 4C04D20E91; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:30 +0200 Message-Id: <1500993699-19299-2-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 01/10] specs/qcow2: add compress format extension X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Peter Lieven --- docs/interop/qcow2.txt | 51 ++++++++++++++++++++++++++++++++++++++++++++++= +++- roms/ipxe | 2 +- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt index d7fdb1f..d0d2a8f 100644 --- a/docs/interop/qcow2.txt +++ b/docs/interop/qcow2.txt @@ -86,7 +86,12 @@ in the description of a field. be written to (unless for regaining consistency). =20 - Bits 2-63: Reserved (set to 0) + Bit 2: Compress format bit. If and only if this = bit + is set then the compress format extension + MUST be present and MUST be parsed and che= cked + for compatibility. + + Bits 3-63: Reserved (set to 0) =20 80 - 87: compatible_features Bitmask of compatible features. An implementation can @@ -137,6 +142,7 @@ be stored. Each extension has a structure like the foll= owing: 0x6803f857 - Feature name table 0x23852875 - Bitmaps extension 0x0537be77 - Full disk encryption header pointer + 0xC03183A3 - Compress format extension other - Unknown header extension, can be safe= ly ignored =20 @@ -311,6 +317,49 @@ The algorithms used for encryption vary depending on t= he method in the LUKS header, with the physical disk sector as the input tweak. =20 + +=3D=3D Compress format extension =3D=3D + +The compress format extension is an optional header extension. It provides +the ability to specify the compress algorithm and compress parameters +that are used for compressed clusters. This new header MUST be present if +the incompatible-feature bit "compress format bit" is set and MUST be abse= nt +otherwise. + +The fields of the compress format extension are: + + Byte 0 - 13: compress_format_name (padded with zeros, but not + necessarily null terminated if it has full length). + Valid compression format names currently are: + + deflate: Standard zlib deflate compression without + compression header + + 14: compress_level (uint8_t) + + 0 =3D default compress level (valid for all formats, de= fault) + + Additional valid compression levels for deflate compres= sion: + + All values between 1 and 9. 1 gives best speed, 9 gives= best + compression. The default compression level is defined b= y zlib + and currently defaults to 6. + + 15: compress_window_size (uint8_t) + + Window or dictionary size used by the compression forma= t. + Currently only used by the deflate compression algorith= m. + + Valid window sizes for deflate compression range from 8= to + 15 inclusively. + +Note: Omitting the incompatible "Compress format bit" results in the usage +of deflate compression with default compression level and a window size of= 12 +(which was default before QEMU 2.11). If exactly these parameters are choo= sen +it is free to the implementation to omit the "Compress format bit" and the +compress format extension when updating the QCOW2 header. + + =3D=3D Host cluster management =3D=3D =20 qcow2 manages the allocation of host clusters by maintaining a reference c= ount diff --git a/roms/ipxe b/roms/ipxe index 0600d3a..b991c67 160000 --- a/roms/ipxe +++ b/roms/ipxe @@ -1 +1 @@ -Subproject commit 0600d3ae94f93efd10fc6b3c7420a9557a3a1670 +Subproject commit b991c67c1d91574ef22336cc3a5944d1e63230c9 --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994001060336.280896311132; Tue, 25 Jul 2017 07:46:41 -0700 (PDT) Received: from localhost ([::1]:32960 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da16a-0005ZS-O1 for importer@patchew.org; Tue, 25 Jul 2017 10:46:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36338) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da121-0001nB-Fy for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da11z-0000sJ-AG for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:53 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:45610 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da11z-0000r8-0E for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:51 -0400 Received: (qmail 15132 invoked by uid 89); 25 Jul 2017 14:41:49 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.275551 secs); 25 Jul 2017 14:41:49 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:45 -0000 Received: (qmail 9630 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 4F76820EC9; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:31 +0200 Message-Id: <1500993699-19299-3-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 02/10] qapi/block-core: add Qcow2Compress parameters X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Peter Lieven --- qapi/block-core.json | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/qapi/block-core.json b/qapi/block-core.json index 833c602..f652206 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2455,6 +2455,46 @@ '*encrypt': 'BlockdevQcow2Encryption' } } =20 ## +# @Qcow2CompressFormat: +# +# @deflate: standard zlib deflate compression +# +# Since: 2.11 +## +{ 'enum': 'Qcow2CompressFormat', + 'data': [ 'deflate' ] } + +## +# @Qcow2CompressDeflate: +# +# @level: specifies the compression level. 0 =3D default compression, +# 1 =3D fastest compression, 9 =3D best compresion +# @window-size: specifies the window size used for deflate compression. +# 8...15 =3D window size of 2^8 to 2^15 byte (default) +# +# Since: 2.11 +## +{ 'struct': 'Qcow2CompressDeflate', + 'data': { '*level': 'uint8', + '*window-size': 'uint8' } } + +## +# @Qcow2Compress: +# +# Specifies the compression format and compression level that should +# be used for compressed Qcow2 clusters. +# +# @format: specifies the compression format to use. (defaults to zlib) +# +# Since: 2.11 +## +{ 'union': 'Qcow2Compress', + 'base': { 'format': 'Qcow2CompressFormat' }, + 'discriminator': 'format', + 'data': { 'deflate': 'Qcow2CompressDeflate' } } + + +## # @BlockdevOptionsSsh: # # @server: host address --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994193814189.7602144049141; Tue, 25 Jul 2017 07:49:53 -0700 (PDT) Received: from localhost ([::1]:32972 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da19f-0007qN-QF for importer@patchew.org; Tue, 25 Jul 2017 10:49:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36336) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da121-0001nA-FL for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da11z-0000sC-73 for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:53 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:33578 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da11y-0000r2-TP for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:51 -0400 Received: (qmail 15093 invoked by uid 89); 25 Jul 2017 14:41:49 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.337663 secs); 25 Jul 2017 14:41:49 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:45 -0000 Received: (qmail 9623 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 510C120EC8; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:32 +0200 Message-Id: <1500993699-19299-4-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 03/10] block/qcow2: parse compress create options X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" this adds parsing and validation for the compress create options. They are only validated but not yet used. Signed-off-by: Peter Lieven --- block/qcow2.c | 86 +++++++++++++++++++++++++++++++++++++++++++= ++-- include/block/block_int.h | 39 +++++++++++---------- 2 files changed, 105 insertions(+), 20 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 90efa44..a5270a6 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -31,6 +31,8 @@ #include "qapi/qmp/qerror.h" #include "qapi/qmp/qbool.h" #include "qapi/util.h" +#include "qapi-visit.h" +#include "qapi/qobject-input-visitor.h" #include "qapi/qmp/types.h" #include "qapi-event.h" #include "trace.h" @@ -161,6 +163,34 @@ static ssize_t qcow2_crypto_hdr_write_func(QCryptoBloc= k *block, size_t offset, return ret; } =20 +static void +qcow2_check_compress_settings(Qcow2Compress *compress, Error **errp) +{ + if (compress->format =3D=3D QCOW2_COMPRESS_FORMAT_DEFLATE) { + if (!compress->u.deflate.has_level) { + compress->u.deflate.has_level =3D true; + compress->u.deflate.level =3D 0; + } + if (compress->u.deflate.level > 9) { + error_setg(errp, "Compress level %" PRIu8 " is not supported f= or" + " format '%s'", compress->u.deflate.level, + Qcow2CompressFormat_lookup[compress->format]); + return; + } + if (!compress->u.deflate.has_window_size) { + compress->u.deflate.has_window_size =3D true; + compress->u.deflate.window_size =3D 15; + } + if (compress->u.deflate.window_size < 8 || + compress->u.deflate.window_size > 15) { + error_setg(errp, "Compress window size %" PRIu8 " is not suppo= rted" + " for format '%s'", compress->u.deflate.window_size, + Qcow2CompressFormat_lookup[compress->format]); + return; + } + } +} + =20 /*=20 * read qcow2 extension and fill bs @@ -2706,7 +2736,8 @@ static int qcow2_create2(const char *filename, int64_= t total_size, const char *backing_file, const char *backing_for= mat, int flags, size_t cluster_size, PreallocMode prea= lloc, QemuOpts *opts, int version, int refcount_order, - const char *encryptfmt, Error **errp) + const char *encryptfmt, Qcow2Compress *compress, + Error **errp) { QDict *options; =20 @@ -2898,6 +2929,7 @@ static int qcow2_create(const char *filename, QemuOpt= s *opts, Error **errp) char *backing_file =3D NULL; char *backing_fmt =3D NULL; char *buf =3D NULL; + Qcow2Compress compress, *compress_ptr =3D NULL; uint64_t size =3D 0; int flags =3D 0; size_t cluster_size =3D DEFAULT_CLUSTER_SIZE; @@ -2975,9 +3007,42 @@ static int qcow2_create(const char *filename, QemuOp= ts *opts, Error **errp) =20 refcount_order =3D ctz32(refcount_bits); =20 + if (qemu_opt_get(opts, BLOCK_OPT_COMPRESS_FORMAT) || + qemu_opt_get(opts, BLOCK_OPT_COMPRESS_LEVEL) || + qemu_opt_get(opts, BLOCK_OPT_COMPRESS_WINDOW_SIZE)) { + QDict *options, *compressopts =3D NULL; + Visitor *v; + options =3D qemu_opts_to_qdict(opts, NULL); + qdict_extract_subqdict(options, &compressopts, "compress."); + v =3D qobject_input_visitor_new_keyval(QOBJECT(compressopts)); + visit_start_struct(v, NULL, NULL, 0, &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto finish; + } + visit_type_Qcow2Compress_members(v, &compress, &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto finish; + } + visit_end_struct(v, NULL); + visit_free(v); + QDECREF(compressopts); + QDECREF(options); + qcow2_check_compress_settings(&compress, &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto finish; + } + compress_ptr =3D &compress; + } + ret =3D qcow2_create2(filename, size, backing_file, backing_fmt, flags, cluster_size, prealloc, opts, version, refcount_or= der, - encryptfmt, &local_err); + encryptfmt, compress_ptr, &local_err); error_propagate(errp, local_err); =20 finish: @@ -4287,6 +4352,23 @@ static QemuOptsList qcow2_create_opts =3D { .help =3D "Width of a reference count entry in bits", .def_value_str =3D "16" }, + { + .name =3D BLOCK_OPT_COMPRESS_FORMAT, + .type =3D QEMU_OPT_STRING, + .help =3D "Compress format used for compressed clusters (defla= te)", + }, + { + .name =3D BLOCK_OPT_COMPRESS_LEVEL, + .type =3D QEMU_OPT_NUMBER, + .help =3D "Compress level used for compressed clusters (0 =3D = default," + " further valid options for deflate: 1=3Dfastest ... 9= =3Dbest)", + }, + { + .name =3D BLOCK_OPT_COMPRESS_WINDOW_SIZE, + .type =3D QEMU_OPT_NUMBER, + .help =3D "Compress windows size used for compression (valid f= or" + " deflate compression with values from 8 to 15)", + }, { /* end of list */ } } }; diff --git a/include/block/block_int.h b/include/block/block_int.h index d4f4ea7..91428d8 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -39,24 +39,27 @@ =20 #define BLOCK_FLAG_LAZY_REFCOUNTS 8 =20 -#define BLOCK_OPT_SIZE "size" -#define BLOCK_OPT_ENCRYPT "encryption" -#define BLOCK_OPT_ENCRYPT_FORMAT "encrypt.format" -#define BLOCK_OPT_COMPAT6 "compat6" -#define BLOCK_OPT_HWVERSION "hwversion" -#define BLOCK_OPT_BACKING_FILE "backing_file" -#define BLOCK_OPT_BACKING_FMT "backing_fmt" -#define BLOCK_OPT_CLUSTER_SIZE "cluster_size" -#define BLOCK_OPT_TABLE_SIZE "table_size" -#define BLOCK_OPT_PREALLOC "preallocation" -#define BLOCK_OPT_SUBFMT "subformat" -#define BLOCK_OPT_COMPAT_LEVEL "compat" -#define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts" -#define BLOCK_OPT_ADAPTER_TYPE "adapter_type" -#define BLOCK_OPT_REDUNDANCY "redundancy" -#define BLOCK_OPT_NOCOW "nocow" -#define BLOCK_OPT_OBJECT_SIZE "object_size" -#define BLOCK_OPT_REFCOUNT_BITS "refcount_bits" +#define BLOCK_OPT_SIZE "size" +#define BLOCK_OPT_ENCRYPT "encryption" +#define BLOCK_OPT_ENCRYPT_FORMAT "encrypt.format" +#define BLOCK_OPT_COMPAT6 "compat6" +#define BLOCK_OPT_HWVERSION "hwversion" +#define BLOCK_OPT_BACKING_FILE "backing_file" +#define BLOCK_OPT_BACKING_FMT "backing_fmt" +#define BLOCK_OPT_CLUSTER_SIZE "cluster_size" +#define BLOCK_OPT_TABLE_SIZE "table_size" +#define BLOCK_OPT_PREALLOC "preallocation" +#define BLOCK_OPT_SUBFMT "subformat" +#define BLOCK_OPT_COMPAT_LEVEL "compat" +#define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts" +#define BLOCK_OPT_ADAPTER_TYPE "adapter_type" +#define BLOCK_OPT_REDUNDANCY "redundancy" +#define BLOCK_OPT_NOCOW "nocow" +#define BLOCK_OPT_OBJECT_SIZE "object_size" +#define BLOCK_OPT_REFCOUNT_BITS "refcount_bits" +#define BLOCK_OPT_COMPRESS_FORMAT "compress.format" +#define BLOCK_OPT_COMPRESS_LEVEL "compress.level" +#define BLOCK_OPT_COMPRESS_WINDOW_SIZE "compress.window-size" =20 #define BLOCK_PROBE_BUF_SIZE 512 =20 --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994507935623.9883503952475; Tue, 25 Jul 2017 07:55:07 -0700 (PDT) Received: from localhost ([::1]:33007 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da1En-0004VZ-IK for importer@patchew.org; Tue, 25 Jul 2017 10:55:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36626) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da12F-000221-2n for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da12D-00011x-5s for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:07 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:52305 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da12C-00010s-Sz for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:05 -0400 Received: (qmail 15793 invoked by uid 89); 25 Jul 2017 14:42:03 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.272009 secs); 25 Jul 2017 14:42:03 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:42:00 -0000 Received: (qmail 9633 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 53D2920ECB; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:33 +0200 Message-Id: <1500993699-19299-5-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 04/10] qemu-img: add documentation for compress settings X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Peter Lieven --- qemu-img.texi | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/qemu-img.texi b/qemu-img.texi index 72dabd6..3612c59 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -676,6 +676,32 @@ file which is COW and has data blocks already, it coul= dn't be changed to NOCOW by setting @code{nocow=3Don}. One can issue @code{lsattr filename} to chec= k if the NOCOW flag is set or not (Capital 'C' is NOCOW flag). =20 +@item compress.format +Defines which compression algorithm is should be used for compressed clust= ers. +The following options are available if support for the respective libraries +has been enabled at compile time: + + deflate Uses standard zlib defalte compression + +The compression algorithm can only be defined at image create time and can= not +be changed later. + +Note: defining compression format settings which are different from the old + default (format=3Ddeflate, level=3D0, window-size=3D12) will result = in the + compression format extension being written to the Qcow2 image. Versi= ons + of QEMU before 2.11 will not be able to open images with this extens= ion. + +@item compress.level +Valid for compress.format=3Ddeflate defines the compression level to use f= or +selected compression format. The default of @code{compress.level=3D0} will= use +the default compression level for the format. Alternate values range from = 1 for +fastest compression to 9 for the best compression. + +@item compress.window-size +Valid for compress.format=3Ddeflate defines the compression window size us= ed +during compression. Valid window sizes for deflate compression range from = 8 to +15 inclusively. The default is @code{compress.window-size=3D15}. + @end table =20 @item Other --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994433443926.7281013227534; Tue, 25 Jul 2017 07:53:53 -0700 (PDT) Received: from localhost ([::1]:33000 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da1DZ-0002rm-Ul for importer@patchew.org; Tue, 25 Jul 2017 10:53:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36594) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da12E-00021B-6Z for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da12C-00011e-Ui for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:06 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:54360 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da12C-00010i-LT for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:04 -0400 Received: (qmail 15729 invoked by uid 89); 25 Jul 2017 14:42:03 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.222217 secs); 25 Jul 2017 14:42:03 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:42:00 -0000 Received: (qmail 9645 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 5743020ECC; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:34 +0200 Message-Id: <1500993699-19299-6-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 05/10] block/qcow2: read and write the compress format extension X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" we now read the extension on open and write it on update, but do not yet use it. Signed-off-by: Peter Lieven --- block/qcow2.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ block/qcow2.h | 21 ++++++++++---- 2 files changed, 108 insertions(+), 5 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index a5270a6..7fd52e1 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -70,6 +70,7 @@ typedef struct { #define QCOW2_EXT_MAGIC_FEATURE_TABLE 0x6803f857 #define QCOW2_EXT_MAGIC_CRYPTO_HEADER 0x0537be77 #define QCOW2_EXT_MAGIC_BITMAPS 0x23852875 +#define QCOW2_EXT_MAGIC_COMPRESS_FORMAT 0xC03183A3 =20 static int qcow2_probe(const uint8_t *buf, int buf_size, const char *filen= ame) { @@ -269,6 +270,57 @@ static int qcow2_read_extensions(BlockDriverState *bs,= uint64_t start_offset, #endif break; =20 + case QCOW2_EXT_MAGIC_COMPRESS_FORMAT: + { + Qcow2CompressFormatExt compress_ext; + Error *local_err =3D NULL; + if (ext.len !=3D sizeof(compress_ext)) { + error_setg(errp, "ERROR: ext_compress_format: len=3D%" + PRIu32 " invalid (!=3D%zu)", ext.len, + sizeof(compress_ext)); + return 2; + } + ret =3D bdrv_pread(bs->file, offset, &compress_ext, + ext.len); + if (ret < 0) { + error_setg_errno(errp, -ret, "ERROR: ext_compress_fromat:" + " Could not read extension"); + return 3; + } + + s->compress.format =3D + qapi_enum_parse(Qcow2CompressFormat_lookup, + compress_ext.name, QCOW2_COMPRESS_FORMAT__= MAX, + -1, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return 4; + } + + if (s->compress.format =3D=3D QCOW2_COMPRESS_FORMAT_DEFLATE) { + s->compress.u.deflate.has_level =3D true; + s->compress.u.deflate.level =3D compress_ext.level; + s->compress.u.deflate.has_window_size =3D true; + s->compress.u.deflate.window_size =3D compress_ext.window_= size; + } + + qcow2_check_compress_settings(&s->compress, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return 5; + } + +#ifdef DEBUG_EXT + if (s->compress.format =3D=3D QCOW2_COMPRESS_FORMAT_DEFLATE) { + printf("Qcow2: Got compress format %s with level %" PRIu8 + " window_size %" PRIu8 "\n", + Qcow2CompressFormat_lookup[s->compress.format], + s->compress.u.deflate.level, + s->compress.u.deflate.window_size); + } +#endif + break; + } case QCOW2_EXT_MAGIC_FEATURE_TABLE: if (p_feature_table !=3D NULL) { void* feature_table =3D g_malloc0(ext.len + 2 * sizeof(Qco= w2Feature)); @@ -1403,6 +1455,12 @@ static int qcow2_do_open(BlockDriverState *bs, QDict= *options, int flags, s->cluster_cache_offset =3D -1; s->flags =3D flags; =20 + s->compress.format =3D QCOW2_COMPRESS_FORMAT_DEFLATE; + s->compress.u.deflate.has_level =3D true; + s->compress.u.deflate.level =3D 0; + s->compress.u.deflate.has_window_size =3D true; + s->compress.u.deflate.window_size =3D 12; + ret =3D qcow2_refcount_init(bs); if (ret !=3D 0) { error_setg_errno(errp, -ret, "Could not initialize refcount handli= ng"); @@ -2320,6 +2378,30 @@ int qcow2_update_header(BlockDriverState *bs) buflen -=3D ret; } =20 + /* Compress Format header extension */ + if (s->compress.format !=3D QCOW2_COMPRESS_FORMAT_DEFLATE || + s->compress.u.deflate.level !=3D 0 || + s->compress.u.deflate.window_size !=3D 12) { + Qcow2CompressFormatExt ext =3D {}; + assert(s->compress.format < QCOW2_COMPRESS_FORMAT__MAX); + strncpy((char *) &ext.name, + Qcow2CompressFormat_lookup[s->compress.format], + sizeof(ext.name)); + if (s->compress.format =3D=3D QCOW2_COMPRESS_FORMAT_DEFLATE) { + ext.level =3D s->compress.u.deflate.level; + ext.window_size =3D s->compress.u.deflate.window_size; + } + ret =3D header_ext_add(buf, QCOW2_EXT_MAGIC_COMPRESS_FORMAT, + &ext, sizeof(ext), + buflen); + if (ret < 0) { + goto fail; + } + buf +=3D ret; + buflen -=3D ret; + header->incompatible_features |=3D cpu_to_be64(QCOW2_INCOMPAT_COMP= RESS); + } + /* Feature table */ if (s->qcow_version >=3D 3) { Qcow2Feature features[] =3D { @@ -2334,6 +2416,11 @@ int qcow2_update_header(BlockDriverState *bs) .name =3D "corrupt bit", }, { + .type =3D QCOW2_FEAT_TYPE_INCOMPATIBLE, + .bit =3D QCOW2_INCOMPAT_COMPRESS_BITNR, + .name =3D "compress format bit", + }, + { .type =3D QCOW2_FEAT_TYPE_COMPATIBLE, .bit =3D QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR, .name =3D "lazy refcounts", @@ -2855,6 +2942,11 @@ static int qcow2_create2(const char *filename, int64= _t total_size, abort(); } =20 + if (compress) { + BDRVQcow2State *s =3D blk_bs(blk)->opaque; + memcpy(&s->compress, compress, sizeof(Qcow2Compress)); + } + /* Create a full header (including things like feature table) */ ret =3D qcow2_update_header(blk_bs(blk)); if (ret < 0) { diff --git a/block/qcow2.h b/block/qcow2.h index 96a8d43..abd35dd 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -188,13 +188,16 @@ enum { =20 /* Incompatible feature bits */ enum { - QCOW2_INCOMPAT_DIRTY_BITNR =3D 0, - QCOW2_INCOMPAT_CORRUPT_BITNR =3D 1, - QCOW2_INCOMPAT_DIRTY =3D 1 << QCOW2_INCOMPAT_DIRTY_BITNR, - QCOW2_INCOMPAT_CORRUPT =3D 1 << QCOW2_INCOMPAT_CORRUPT_BITNR, + QCOW2_INCOMPAT_DIRTY_BITNR =3D 0, + QCOW2_INCOMPAT_CORRUPT_BITNR =3D 1, + QCOW2_INCOMPAT_COMPRESS_BITNR =3D 2, + QCOW2_INCOMPAT_DIRTY =3D 1 << QCOW2_INCOMPAT_DIRTY_BITNR, + QCOW2_INCOMPAT_CORRUPT =3D 1 << QCOW2_INCOMPAT_CORRUPT_BITNR, + QCOW2_INCOMPAT_COMPRESS =3D 1 << QCOW2_INCOMPAT_COMPRESS_BITNR, =20 QCOW2_INCOMPAT_MASK =3D QCOW2_INCOMPAT_DIRTY - | QCOW2_INCOMPAT_CORRUPT, + | QCOW2_INCOMPAT_CORRUPT + | QCOW2_INCOMPAT_COMPRESS, }; =20 /* Compatible feature bits */ @@ -228,6 +231,12 @@ typedef struct Qcow2Feature { char name[46]; } QEMU_PACKED Qcow2Feature; =20 +typedef struct Qcow2CompressFormatExt { + char name[14]; + uint8_t level; + uint8_t window_size; +} QEMU_PACKED Qcow2CompressFormatExt; + typedef struct Qcow2DiscardRegion { BlockDriverState *bs; uint64_t offset; @@ -307,6 +316,8 @@ typedef struct BDRVQcow2State { Qcow2GetRefcountFunc *get_refcount; Qcow2SetRefcountFunc *set_refcount; =20 + Qcow2Compress compress; + bool discard_passthrough[QCOW2_DISCARD_MAX]; =20 int overlap_check; /* bitmask of Qcow2MetadataOverlap values */ --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500993962332372.8860538517233; Tue, 25 Jul 2017 07:46:02 -0700 (PDT) Received: from localhost ([::1]:32958 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da15v-00055P-Sa for importer@patchew.org; Tue, 25 Jul 2017 10:45:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36370) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da122-0001no-5h for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da120-0000tA-ON for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:54 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:43779 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da120-0000sA-EL for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:52 -0400 Received: (qmail 15207 invoked by uid 89); 25 Jul 2017 14:41:49 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.342807 secs); 25 Jul 2017 14:41:49 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:46 -0000 Received: (qmail 9653 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 58CAE20ECA; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:35 +0200 Message-Id: <1500993699-19299-7-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 06/10] block/qcow2: simplify ret usage in qcow2_create X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Peter Lieven --- block/qcow2.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 7fd52e1..ffe609d 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3031,7 +3031,7 @@ static int qcow2_create(const char *filename, QemuOpt= s *opts, Error **errp) int refcount_order; const char *encryptfmt =3D NULL; Error *local_err =3D NULL; - int ret; + int ret =3D -EINVAL; =20 /* Read out options */ size =3D ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0), @@ -3043,7 +3043,6 @@ static int qcow2_create(const char *filename, QemuOpt= s *opts, Error **errp) if (qemu_opt_get_del(opts, BLOCK_OPT_ENCRYPT)) { error_setg(errp, "Options " BLOCK_OPT_ENCRYPT " and " BLOCK_OPT_ENCRYPT_FORMAT " are mutually exclusive"); - ret =3D -EINVAL; goto finish; } } else if (qemu_opt_get_bool_del(opts, BLOCK_OPT_ENCRYPT, false)) { @@ -3052,7 +3051,6 @@ static int qcow2_create(const char *filename, QemuOpt= s *opts, Error **errp) cluster_size =3D qcow2_opt_get_cluster_size_del(opts, &local_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } buf =3D qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC); @@ -3061,14 +3059,12 @@ static int qcow2_create(const char *filename, QemuO= pts *opts, Error **errp) &local_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } =20 version =3D qcow2_opt_get_version_del(opts, &local_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } =20 @@ -3079,21 +3075,18 @@ static int qcow2_create(const char *filename, QemuO= pts *opts, Error **errp) if (backing_file && prealloc !=3D PREALLOC_MODE_OFF) { error_setg(errp, "Backing file and preallocation cannot be used at= " "the same time"); - ret =3D -EINVAL; goto finish; } =20 if (version < 3 && (flags & BLOCK_FLAG_LAZY_REFCOUNTS)) { error_setg(errp, "Lazy refcounts only supported with compatibility= " "level 1.1 and above (use compat=3D1.1 or greater)"); - ret =3D -EINVAL; goto finish; } =20 refcount_bits =3D qcow2_opt_get_refcount_bits_del(opts, version, &loca= l_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } =20 @@ -3110,13 +3103,11 @@ static int qcow2_create(const char *filename, QemuO= pts *opts, Error **errp) visit_start_struct(v, NULL, NULL, 0, &local_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } visit_type_Qcow2Compress_members(v, &compress, &local_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } visit_end_struct(v, NULL); @@ -3126,12 +3117,12 @@ static int qcow2_create(const char *filename, QemuO= pts *opts, Error **errp) qcow2_check_compress_settings(&compress, &local_err); if (local_err) { error_propagate(errp, local_err); - ret =3D -EINVAL; goto finish; } compress_ptr =3D &compress; } =20 + /* ret is still -EINVAL until here */ ret =3D qcow2_create2(filename, size, backing_file, backing_fmt, flags, cluster_size, prealloc, opts, version, refcount_or= der, encryptfmt, compress_ptr, &local_err); --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994206793842.2607735891407; Tue, 25 Jul 2017 07:50:06 -0700 (PDT) Received: from localhost ([::1]:32973 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da19x-00084z-Ar for importer@patchew.org; Tue, 25 Jul 2017 10:50:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36586) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da12D-00020k-QN for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da129-0000zQ-0X for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:05 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:53678 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da128-0000ye-NW for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:00 -0400 Received: (qmail 15564 invoked by uid 89); 25 Jul 2017 14:41:59 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.293936 secs); 25 Jul 2017 14:41:59 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:55 -0000 Received: (qmail 9649 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 5CE2920ECE; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:36 +0200 Message-Id: <1500993699-19299-8-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 07/10] block/qcow2: optimize qcow2_co_pwritev_compressed X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" if we specify exactly one iov of s->cluster_size bytes we can avoid the bounce buffer. Signed-off-by: Peter Lieven --- block/qcow2.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index ffe609d..a12b3d7 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3428,7 +3428,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uin= t64_t offset, struct iovec iov; z_stream strm; int ret, out_len; - uint8_t *buf, *out_buf; + uint8_t *buf, *out_buf, *local_buf =3D NULL; uint64_t cluster_offset; =20 if (bytes =3D=3D 0) { @@ -3438,8 +3438,8 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uin= t64_t offset, return bdrv_truncate(bs->file, cluster_offset, PREALLOC_MODE_OFF, = NULL); } =20 - buf =3D qemu_blockalign(bs, s->cluster_size); - if (bytes !=3D s->cluster_size) { + if (bytes !=3D s->cluster_size || qiov->niov !=3D 1) { + buf =3D local_buf =3D qemu_blockalign(bs, s->cluster_size); if (bytes > s->cluster_size || offset + bytes !=3D bs->total_sectors << BDRV_SECTOR_BITS) { @@ -3448,8 +3448,10 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, ui= nt64_t offset, } /* Zero-pad last write if image size is not cluster aligned */ memset(buf + bytes, 0, s->cluster_size - bytes); + qemu_iovec_to_buf(qiov, 0, buf, bytes); + } else { + buf =3D qiov->iov[0].iov_base; } - qemu_iovec_to_buf(qiov, 0, buf, bytes); =20 out_buf =3D g_malloc(s->cluster_size); =20 @@ -3517,7 +3519,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uin= t64_t offset, success: ret =3D 0; fail: - qemu_vfree(buf); + qemu_vfree(local_buf); g_free(out_buf); return ret; } --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994349283388.4777079923515; Tue, 25 Jul 2017 07:52:29 -0700 (PDT) Received: from localhost ([::1]:32992 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da1CD-0001qb-Ra for importer@patchew.org; Tue, 25 Jul 2017 10:52:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36583) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da12D-00020h-Pr for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da129-0000zg-8M for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:05 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:58796 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da128-0000yn-VQ for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:42:01 -0400 Received: (qmail 15614 invoked by uid 89); 25 Jul 2017 14:41:59 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.405792 secs); 25 Jul 2017 14:41:59 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:55 -0000 Received: (qmail 9650 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 5EEDD20ECF; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:37 +0200 Message-Id: <1500993699-19299-9-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 08/10] block/qcow2: start using the compress format extension X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" we now pass the parameters to the zlib compressor if the extension is present and use the old default values if the extension is absent. Signed-off-by: Peter Lieven --- block/qcow2-cluster.c | 58 ++++++++++++++++++++++++++++++-----------------= ---- block/qcow2.c | 53 +++++++++++++++++++++++----------------------- 2 files changed, 61 insertions(+), 50 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index f06c08f..345feec 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1479,30 +1479,39 @@ again: } =20 static int decompress_buffer(uint8_t *out_buf, int out_buf_size, - const uint8_t *buf, int buf_size) + const uint8_t *buf, int buf_size, + Qcow2Compress *compress) { - z_stream strm1, *strm =3D &strm1; - int ret, out_len; - - memset(strm, 0, sizeof(*strm)); - - strm->next_in =3D (uint8_t *)buf; - strm->avail_in =3D buf_size; - strm->next_out =3D out_buf; - strm->avail_out =3D out_buf_size; - - ret =3D inflateInit2(strm, -12); - if (ret !=3D Z_OK) - return -1; - ret =3D inflate(strm, Z_FINISH); - out_len =3D strm->next_out - out_buf; - if ((ret !=3D Z_STREAM_END && ret !=3D Z_BUF_ERROR) || - out_len !=3D out_buf_size) { - inflateEnd(strm); - return -1; - } - inflateEnd(strm); - return 0; + int ret =3D 0, out_len; + + switch (compress->format) { + case QCOW2_COMPRESS_FORMAT_DEFLATE: + { + z_stream z_strm =3D {}; + + z_strm.next_in =3D (uint8_t *)buf; + z_strm.avail_in =3D buf_size; + z_strm.next_out =3D out_buf; + z_strm.avail_out =3D out_buf_size; + + ret =3D inflateInit2(&z_strm, -compress->u.deflate.window_size); + if (ret !=3D Z_OK) { + return -1; + } + ret =3D inflate(&z_strm, Z_FINISH); + out_len =3D z_strm.next_out - out_buf; + ret =3D -(ret !=3D Z_STREAM_END); + inflateEnd(&z_strm); + break; + } + default: + abort(); /* should never reach this point */ + } + + if (out_len !=3D out_buf_size) { + ret =3D -1; + } + return ret; } =20 int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset) @@ -1523,7 +1532,8 @@ int qcow2_decompress_cluster(BlockDriverState *bs, ui= nt64_t cluster_offset) return ret; } if (decompress_buffer(s->cluster_cache, s->cluster_size, - s->cluster_data + sector_offset, csize) < 0)= { + s->cluster_data + sector_offset, csize, + &s->compress) < 0) { return -EIO; } s->cluster_cache_offset =3D coffset; diff --git a/block/qcow2.c b/block/qcow2.c index a12b3d7..6031963 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3426,9 +3426,9 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uin= t64_t offset, BDRVQcow2State *s =3D bs->opaque; QEMUIOVector hd_qiov; struct iovec iov; - z_stream strm; - int ret, out_len; - uint8_t *buf, *out_buf, *local_buf =3D NULL; + z_stream z_strm =3D {}; + int ret, out_len =3D 0; + uint8_t *buf, *out_buf =3D NULL, *local_buf =3D NULL; uint64_t cluster_offset; =20 if (bytes =3D=3D 0) { @@ -3453,34 +3453,35 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, u= int64_t offset, buf =3D qiov->iov[0].iov_base; } =20 - out_buf =3D g_malloc(s->cluster_size); + switch (s->compress.format) { + case QCOW2_COMPRESS_FORMAT_DEFLATE: + out_buf =3D g_malloc(s->cluster_size); + ret =3D deflateInit2( + &z_strm, s->compress.u.deflate.level ? + Z_DEFAULT_COMPRESSION : s->compress.u.deflate.level, + Z_DEFLATED, -s->compress.u.deflate.window_size, + 9, Z_DEFAULT_STRATEGY); + if (ret !=3D Z_OK) { + ret =3D -EINVAL; + goto fail; + } =20 - /* best compression, small window, no zlib header */ - memset(&strm, 0, sizeof(strm)); - ret =3D deflateInit2(&strm, Z_DEFAULT_COMPRESSION, - Z_DEFLATED, -12, - 9, Z_DEFAULT_STRATEGY); - if (ret !=3D 0) { - ret =3D -EINVAL; - goto fail; - } + z_strm.avail_in =3D s->cluster_size; + z_strm.next_in =3D (uint8_t *)buf; + z_strm.avail_out =3D s->cluster_size; + z_strm.next_out =3D out_buf; =20 - strm.avail_in =3D s->cluster_size; - strm.next_in =3D (uint8_t *)buf; - strm.avail_out =3D s->cluster_size; - strm.next_out =3D out_buf; + ret =3D deflate(&z_strm, Z_FINISH); + out_len =3D z_strm.next_out - out_buf; + deflateEnd(&z_strm); =20 - ret =3D deflate(&strm, Z_FINISH); - if (ret !=3D Z_STREAM_END && ret !=3D Z_OK) { - deflateEnd(&strm); - ret =3D -EINVAL; - goto fail; + ret =3D ret !=3D Z_STREAM_END; + break; + default: + abort(); /* should never reach this point */ } - out_len =3D strm.next_out - out_buf; - - deflateEnd(&strm); =20 - if (ret !=3D Z_STREAM_END || out_len >=3D s->cluster_size) { + if (ret || out_len >=3D s->cluster_size) { /* could not compress: write normal cluster */ ret =3D qcow2_co_pwritev(bs, offset, bytes, qiov, 0); if (ret < 0) { --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994027019861.3649678436864; Tue, 25 Jul 2017 07:47:07 -0700 (PDT) Received: from localhost ([::1]:32961 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da16z-0005o5-So for importer@patchew.org; Tue, 25 Jul 2017 10:47:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36480) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da125-0001ra-Gz for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da124-0000wb-9e for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:57 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:38004 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da124-0000ur-0c for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:56 -0400 Received: (qmail 15351 invoked by uid 89); 25 Jul 2017 14:41:54 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.353029 secs); 25 Jul 2017 14:41:54 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:50 -0000 Received: (qmail 9655 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 6132E20ED0; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:38 +0200 Message-Id: <1500993699-19299-10-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 09/10] block/qcow2: add lzo compress format X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Peter Lieven --- block/qcow2-cluster.c | 15 +++++++++++++++ block/qcow2.c | 25 ++++++++++++++++++++++++- configure | 2 +- docs/interop/qcow2.txt | 2 ++ qapi/block-core.json | 15 ++++++++++++--- qemu-img.texi | 1 + 6 files changed, 55 insertions(+), 5 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 345feec..f48cded 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -24,6 +24,9 @@ =20 #include "qemu/osdep.h" #include +#ifdef CONFIG_LZO +#include +#endif =20 #include "qapi/error.h" #include "qemu-common.h" @@ -1504,6 +1507,18 @@ static int decompress_buffer(uint8_t *out_buf, int o= ut_buf_size, inflateEnd(&z_strm); break; } +#ifdef CONFIG_LZO + case QCOW2_COMPRESS_FORMAT_LZO: + out_len =3D out_buf_size; + ret =3D lzo1x_decompress_safe(buf, buf_size, out_buf, + (lzo_uint *) &out_len, NULL); + if (ret =3D=3D LZO_E_INPUT_NOT_CONSUMED) { + /* We always read up to the next sector boundary. Thus + * buf_size may be larger than the original compressed size. */ + ret =3D 0; + } + break; +#endif default: abort(); /* should never reach this point */ } diff --git a/block/qcow2.c b/block/qcow2.c index 6031963..0e9c2b8 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -26,6 +26,9 @@ #include "sysemu/block-backend.h" #include "qemu/module.h" #include +#ifdef CONFIG_LZO +#include +#endif #include "block/qcow2.h" #include "qemu/error-report.h" #include "qapi/qmp/qerror.h" @@ -310,6 +313,14 @@ static int qcow2_read_extensions(BlockDriverState *bs,= uint64_t start_offset, return 5; } =20 +#ifdef CONFIG_LZO + if (s->compress.format =3D=3D QCOW2_COMPRESS_FORMAT_LZO && + lzo_init() !=3D LZO_E_OK) { + error_setg(errp, "ERROR: internal error - lzo_init() faile= d"); + return 6; + } +#endif + #ifdef DEBUG_EXT if (s->compress.format =3D=3D QCOW2_COMPRESS_FORMAT_DEFLATE) { printf("Qcow2: Got compress format %s with level %" PRIu8 @@ -317,6 +328,9 @@ static int qcow2_read_extensions(BlockDriverState *bs, = uint64_t start_offset, Qcow2CompressFormat_lookup[s->compress.format], s->compress.u.deflate.level, s->compress.u.deflate.window_size); + } else { + printf("Qcow2: Got compress format %s\n", + Qcow2CompressFormat_lookup[s->compress.format]); } #endif break; @@ -3428,7 +3442,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uin= t64_t offset, struct iovec iov; z_stream z_strm =3D {}; int ret, out_len =3D 0; - uint8_t *buf, *out_buf =3D NULL, *local_buf =3D NULL; + uint8_t *buf, *out_buf =3D NULL, *local_buf =3D NULL, *work_buf =3D NU= LL; uint64_t cluster_offset; =20 if (bytes =3D=3D 0) { @@ -3477,6 +3491,14 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, ui= nt64_t offset, =20 ret =3D ret !=3D Z_STREAM_END; break; +#ifdef CONFIG_LZO + case QCOW2_COMPRESS_FORMAT_LZO: + out_buf =3D g_malloc(s->cluster_size + s->cluster_size / 16 + 64 += 3); + work_buf =3D g_malloc(LZO1X_1_MEM_COMPRESS); + ret =3D lzo1x_1_compress(buf, s->cluster_size, out_buf, + (lzo_uint *) &out_len, work_buf); + break; +#endif default: abort(); /* should never reach this point */ } @@ -3522,6 +3544,7 @@ success: fail: qemu_vfree(local_buf); g_free(out_buf); + g_free(work_buf); return ret; } =20 diff --git a/configure b/configure index 987f59b..c1cee88 100755 --- a/configure +++ b/configure @@ -1958,7 +1958,7 @@ if test "$lzo" !=3D "no" ; then int main(void) { lzo_version(); return 0; } EOF if compile_prog "" "-llzo2" ; then - libs_softmmu=3D"$libs_softmmu -llzo2" + LIBS=3D"$LIBS -llzo2" lzo=3D"yes" else if test "$lzo" =3D "yes"; then diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt index d0d2a8f..3262667 100644 --- a/docs/interop/qcow2.txt +++ b/docs/interop/qcow2.txt @@ -335,6 +335,8 @@ The fields of the compress format extension are: deflate: Standard zlib deflate compression without compression header =20 + lzo: LZO1X compression without additional header + 14: compress_level (uint8_t) =20 0 =3D default compress level (valid for all formats, de= fault) diff --git a/qapi/block-core.json b/qapi/block-core.json index f652206..d655bb1 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2458,11 +2458,12 @@ # @Qcow2CompressFormat: # # @deflate: standard zlib deflate compression +# @lzo: lzo1x compression # # Since: 2.11 ## { 'enum': 'Qcow2CompressFormat', - 'data': [ 'deflate' ] } + 'data': [ 'deflate', 'lzo' ] } =20 ## # @Qcow2CompressDeflate: @@ -2479,6 +2480,14 @@ '*window-size': 'uint8' } } =20 ## +# @Qcow2CompressLZO: +# +# Since: 2.10 +## +{ 'struct': 'Qcow2CompressLZO', + 'data': { } } + +## # @Qcow2Compress: # # Specifies the compression format and compression level that should @@ -2491,8 +2500,8 @@ { 'union': 'Qcow2Compress', 'base': { 'format': 'Qcow2CompressFormat' }, 'discriminator': 'format', - 'data': { 'deflate': 'Qcow2CompressDeflate' } } - + 'data': { 'deflate': 'Qcow2CompressDeflate', + 'lzo': 'Qcow2CompressLZO' } } =20 ## # @BlockdevOptionsSsh: diff --git a/qemu-img.texi b/qemu-img.texi index 3612c59..5b0bdbe 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -682,6 +682,7 @@ The following options are available if support for the = respective libraries has been enabled at compile time: =20 deflate Uses standard zlib defalte compression + lzo Uses LZO1X compression =20 The compression algorithm can only be defined at image create time and can= not be changed later. --=20 1.9.1 From nobody Sat May 4 02:20:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500994124771864.7412165739538; Tue, 25 Jul 2017 07:48:44 -0700 (PDT) Received: from localhost ([::1]:32971 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da18d-0006vn-E9 for importer@patchew.org; Tue, 25 Jul 2017 10:48:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36475) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1da125-0001r7-6a for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1da124-0000wp-FB for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:57 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:37270 helo=mx01.kamp.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1da124-0000v4-6E for qemu-devel@nongnu.org; Tue, 25 Jul 2017 10:41:56 -0400 Received: (qmail 15390 invoked by uid 89); 25 Jul 2017 14:41:54 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/23595. avast: 1.2.2/17010300. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.372945 secs); 25 Jul 2017 14:41:54 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 25 Jul 2017 14:41:50 -0000 Received: (qmail 9654 invoked from network); 25 Jul 2017 14:41:40 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 25 Jul 2017 14:41:40 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 645C220ED1; Tue, 25 Jul 2017 16:41:40 +0200 (CEST) X-GL_Whitelist: yes From: Peter Lieven To: qemu-block@nongnu.org Date: Tue, 25 Jul 2017 16:41:39 +0200 Message-Id: <1500993699-19299-11-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500993699-19299-1-git-send-email-pl@kamp.de> References: <1500993699-19299-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH V5 10/10] block/qcow2: add compress info to image specific info X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Peter Lieven , qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, lersek@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Peter Lieven --- block/qcow2.c | 7 +++++++ qapi/block-core.json | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/block/qcow2.c b/block/qcow2.c index 0e9c2b8..7e03877 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3968,6 +3968,13 @@ static ImageInfoSpecific *qcow2_get_specific_info(Bl= ockDriverState *bs) spec_info->u.qcow2.data->encrypt =3D qencrypt; } =20 + if (s->incompatible_features & QCOW2_INCOMPAT_COMPRESS) { + spec_info->u.qcow2.data->compress =3D g_new0(Qcow2Compress, 1); + memcpy(spec_info->u.qcow2.data->compress, &s->compress, + sizeof(Qcow2Compress)); + spec_info->u.qcow2.data->has_compress =3D true; + } + return spec_info; } =20 diff --git a/qapi/block-core.json b/qapi/block-core.json index d655bb1..3b338d5 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -68,6 +68,9 @@ # @encrypt: details about encryption parameters; only set if image # is encrypted (since 2.10) # +# @compress: details about parameters for compressed clusters; only set if +# the compress format header extension is present (since 2.11) +# # Since: 1.7 ## { 'struct': 'ImageInfoSpecificQCow2', @@ -76,7 +79,8 @@ '*lazy-refcounts': 'bool', '*corrupt': 'bool', 'refcount-bits': 'int', - '*encrypt': 'ImageInfoSpecificQCow2Encryption' + '*encrypt': 'ImageInfoSpecificQCow2Encryption', + '*compress': 'Qcow2Compress' } } =20 ## --=20 1.9.1