From nobody Tue May 7 23:25:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 154991841842964.43221098042648; Mon, 11 Feb 2019 12:53:38 -0800 (PST) Received: from localhost ([127.0.0.1]:56110 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIa2-0007zU-Dy for importer@patchew.org; Mon, 11 Feb 2019 15:53:30 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIYC-0006xD-Sm for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtIYB-0006cS-W3 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:36 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41316) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gtIYA-0006b5-2E; Mon, 11 Feb 2019 15:51:34 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1CF5E7F3E8; Mon, 11 Feb 2019 20:51:33 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-127.phx2.redhat.com [10.3.116.127]) by smtp.corp.redhat.com (Postfix) with ESMTP id B499358BB; Mon, 11 Feb 2019 20:51:32 +0000 (UTC) From: Eric Blake To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 14:51:25 -0600 Message-Id: <20190211205128.27146-2-eblake@redhat.com> In-Reply-To: <20190211205128.27146-1-eblake@redhat.com> References: <20190211205128.27146-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 11 Feb 2019 20:51:33 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 1/4] nbd/server: Kill pointless shadowed variable 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: Peter Maydell , "open list:Network Block Dev..." Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" lgtm.com pointed out that commit 678ba275 introduced a shadowed declaration of local variable 'bs'; thankfully, the inner 'bs' obtained by 'blk_bs(blk)' matches the outer one given that we had 'blk_insert_bs(blk, bs, errp)' a few lines earlier, and there are no later uses of 'bs' beyond the scope of the 'if (bitmap)' to care if we change the value stored in 'bs' while traveling the backing chain to find a bitmap. So simply get rid of the extra declaration. Reported-by: Peter Maydell Signed-off-by: Eric Blake Message-Id: <20190207191357.6665-1-eblake@redhat.com> Signed-off-by: Eric Blake --- nbd/server.c | 1 - 1 file changed, 1 deletion(-) diff --git a/nbd/server.c b/nbd/server.c index 838c150d8ca..0910d09a6d4 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1495,7 +1495,6 @@ NBDExport *nbd_export_new(BlockDriverState *bs, uint6= 4_t dev_offset, if (bitmap) { BdrvDirtyBitmap *bm =3D NULL; - BlockDriverState *bs =3D blk_bs(blk); while (true) { bm =3D bdrv_find_dirty_bitmap(bs, bitmap); --=20 2.20.1 From nobody Tue May 7 23:25:46 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1549918568504624.6798101374203; Mon, 11 Feb 2019 12:56:08 -0800 (PST) Received: from localhost ([127.0.0.1]:56169 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIcP-0001JF-EL for importer@patchew.org; Mon, 11 Feb 2019 15:55:57 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53643) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIYX-0007C5-1d for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtIYK-0006eQ-FD for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:17468) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gtIYA-0006bT-QN; Mon, 11 Feb 2019 15:51:35 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0C8FE66961; Mon, 11 Feb 2019 20:51:34 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-127.phx2.redhat.com [10.3.116.127]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4C42458BB; Mon, 11 Feb 2019 20:51:33 +0000 (UTC) From: Eric Blake To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 14:51:26 -0600 Message-Id: <20190211205128.27146-3-eblake@redhat.com> In-Reply-To: <20190211205128.27146-1-eblake@redhat.com> References: <20190211205128.27146-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 11 Feb 2019 20:51:34 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 2/4] bdrv_query_image_info Error parameter added 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: Kevin Wolf , Fam Zheng , Vladimir Sementsov-Ogievskiy , "open list:Block layer core" , Markus Armbruster , Max Reitz , Andrey Shinkevich Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Andrey Shinkevich Inform a user in case qcow2_get_specific_info fails to obtain QCOW2 image specific information. This patch is preliminary to the one "qcow2: Add list of bitmaps to ImageInfoSpecificQCow2". Signed-off-by: Andrey Shinkevich Reviewed-by: Eric Blake Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Kevin Wolf Message-Id: <1549638368-530182-2-git-send-email-andrey.shinkevich@virtuozzo= .com> Signed-off-by: Eric Blake --- include/block/block.h | 3 ++- include/block/block_int.h | 3 ++- block.c | 5 +++-- block/crypto.c | 9 +++------ block/qapi.c | 7 ++++++- block/qcow2.c | 10 ++++++++-- block/vmdk.c | 3 ++- qemu-io-cmds.c | 7 ++++++- 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/include/block/block.h b/include/block/block.h index 57233cf2c0c..73357c6c250 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -478,7 +478,8 @@ const char *bdrv_get_device_name(const BlockDriverState= *bs); const char *bdrv_get_device_or_node_name(const BlockDriverState *bs); int bdrv_get_flags(BlockDriverState *bs); int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi); -ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs); +ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs, + Error **errp); void bdrv_round_to_clusters(BlockDriverState *bs, int64_t offset, int64_t bytes, int64_t *cluster_offset, diff --git a/include/block/block_int.h b/include/block/block_int.h index f605622216d..0075bafd105 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -319,7 +319,8 @@ struct BlockDriver { const char *name, Error **errp); int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi); - ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs); + ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs, + Error **errp); int coroutine_fn (*bdrv_save_vmstate)(BlockDriverState *bs, QEMUIOVector *qiov, diff --git a/block.c b/block.c index b67d9b7b657..4ad0e90d7e3 100644 --- a/block.c +++ b/block.c @@ -4462,11 +4462,12 @@ int bdrv_get_info(BlockDriverState *bs, BlockDriver= Info *bdi) return drv->bdrv_get_info(bs, bdi); } -ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs) +ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs, + Error **errp) { BlockDriver *drv =3D bs->drv; if (drv && drv->bdrv_get_specific_info) { - return drv->bdrv_get_specific_info(bs); + return drv->bdrv_get_specific_info(bs, errp); } return NULL; } diff --git a/block/crypto.c b/block/crypto.c index f0a5f6b9873..d5b1da66a1d 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -594,20 +594,17 @@ static int block_crypto_get_info_luks(BlockDriverStat= e *bs, } static ImageInfoSpecific * -block_crypto_get_specific_info_luks(BlockDriverState *bs) +block_crypto_get_specific_info_luks(BlockDriverState *bs, Error **errp) { BlockCrypto *crypto =3D bs->opaque; ImageInfoSpecific *spec_info; QCryptoBlockInfo *info; - info =3D qcrypto_block_get_info(crypto->block, NULL); + info =3D qcrypto_block_get_info(crypto->block, errp); if (!info) { return NULL; } - if (info->format !=3D Q_CRYPTO_BLOCK_FORMAT_LUKS) { - qapi_free_QCryptoBlockInfo(info); - return NULL; - } + assert(info->format =3D=3D Q_CRYPTO_BLOCK_FORMAT_LUKS); spec_info =3D g_new(ImageInfoSpecific, 1); spec_info->type =3D IMAGE_INFO_SPECIFIC_KIND_LUKS; diff --git a/block/qapi.c b/block/qapi.c index c66f949db83..00291f91059 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -282,7 +282,12 @@ void bdrv_query_image_info(BlockDriverState *bs, info->dirty_flag =3D bdi.is_dirty; info->has_dirty_flag =3D true; } - info->format_specific =3D bdrv_get_specific_info(bs); + info->format_specific =3D bdrv_get_specific_info(bs, &err); + if (err) { + error_propagate(errp, err); + qapi_free_ImageInfo(info); + goto out; + } info->has_format_specific =3D info->format_specific !=3D NULL; backing_filename =3D bs->backing_file; diff --git a/block/qcow2.c b/block/qcow2.c index 8c91b928653..bcb80d0270c 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -4368,14 +4368,20 @@ static int qcow2_get_info(BlockDriverState *bs, Blo= ckDriverInfo *bdi) return 0; } -static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs) +static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs, + Error **errp) { BDRVQcow2State *s =3D bs->opaque; ImageInfoSpecific *spec_info; QCryptoBlockInfo *encrypt_info =3D NULL; + Error *local_err =3D NULL; if (s->crypto !=3D NULL) { - encrypt_info =3D qcrypto_block_get_info(s->crypto, &error_abort); + encrypt_info =3D qcrypto_block_get_info(s->crypto, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return NULL; + } } spec_info =3D g_new(ImageInfoSpecific, 1); diff --git a/block/vmdk.c b/block/vmdk.c index 682ad93aa1e..096e8eb6627 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -2543,7 +2543,8 @@ static int coroutine_fn vmdk_co_check(BlockDriverStat= e *bs, return ret; } -static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs) +static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs, + Error **errp) { int i; BDRVVmdkState *s =3D bs->opaque; diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index ee8f56e46ae..b9f189f09bb 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -1661,6 +1661,7 @@ static int info_f(BlockBackend *blk, int argc, char *= *argv) BlockDriverState *bs =3D blk_bs(blk); BlockDriverInfo bdi; ImageInfoSpecific *spec_info; + Error *local_err =3D NULL; char s1[64], s2[64]; int ret; @@ -1682,7 +1683,11 @@ static int info_f(BlockBackend *blk, int argc, char = **argv) printf("cluster size: %s\n", s1); printf("vm state offset: %s\n", s2); - spec_info =3D bdrv_get_specific_info(bs); + spec_info =3D bdrv_get_specific_info(bs, &local_err); + if (local_err) { + error_report_err(local_err); + return -EIO; + } if (spec_info) { printf("Format specific information:\n"); bdrv_image_info_specific_dump(fprintf, stdout, spec_info); --=20 2.20.1 From nobody Tue May 7 23:25:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1549918663805665.5345535131087; Mon, 11 Feb 2019 12:57:43 -0800 (PST) Received: from localhost ([127.0.0.1]:56189 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIe4-0002oQ-Lu for importer@patchew.org; Mon, 11 Feb 2019 15:57:40 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53642) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIYX-0007C4-5D for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtIYK-0006eP-F9 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39282) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gtIYB-0006c3-VF; Mon, 11 Feb 2019 15:51:36 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E5A1988302; Mon, 11 Feb 2019 20:51:34 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-127.phx2.redhat.com [10.3.116.127]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2D6BD5F74; Mon, 11 Feb 2019 20:51:34 +0000 (UTC) From: Eric Blake To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 14:51:27 -0600 Message-Id: <20190211205128.27146-4-eblake@redhat.com> In-Reply-To: <20190211205128.27146-1-eblake@redhat.com> References: <20190211205128.27146-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 11 Feb 2019 20:51:35 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 3/4] qcow2: Add list of bitmaps to ImageInfoSpecificQCow2 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: Kevin Wolf , Vladimir Sementsov-Ogievskiy , "open list:qcow2" , Markus Armbruster , Max Reitz , Andrey Shinkevich Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Andrey Shinkevich In the 'Format specific information' section of the 'qemu-img info' command output, the supplemental information about existing QCOW2 bitmaps will be shown, such as a bitmap name, flags and granularity: image: /vz/vmprivate/VM1/harddisk.hdd file format: qcow2 virtual size: 64G (68719476736 bytes) disk size: 3.0M cluster_size: 1048576 Format specific information: compat: 1.1 lazy refcounts: true bitmaps: [0]: flags: [0]: in-use [1]: auto name: back-up1 granularity: 65536 [1]: flags: [0]: in-use [1]: auto name: back-up2 granularity: 65536 refcount bits: 16 corrupt: false Signed-off-by: Andrey Shinkevich Reviewed-by: Eric Blake Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <1549638368-530182-3-git-send-email-andrey.shinkevich@virtuozzo= .com> Signed-off-by: Eric Blake --- qapi/block-core.json | 41 +++++++++++++++++++++++- block/qcow2.h | 2 ++ block/qcow2-bitmap.c | 76 ++++++++++++++++++++++++++++++++++++++++++++ block/qcow2.c | 11 ++++++- 4 files changed, 128 insertions(+), 2 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 5f17d67d714..0f349d46033 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -69,6 +69,8 @@ # @encrypt: details about encryption parameters; only set if image # is encrypted (since 2.10) # +# @bitmaps: A list of qcow2 bitmap details (since 4.0) +# # Since: 1.7 ## { 'struct': 'ImageInfoSpecificQCow2', @@ -77,7 +79,8 @@ '*lazy-refcounts': 'bool', '*corrupt': 'bool', 'refcount-bits': 'int', - '*encrypt': 'ImageInfoSpecificQCow2Encryption' + '*encrypt': 'ImageInfoSpecificQCow2Encryption', + '*bitmaps': ['Qcow2BitmapInfo'] } } ## @@ -453,6 +456,42 @@ 'data': {'*name': 'str', 'count': 'int', 'granularity': 'uint32', 'status': 'DirtyBitmapStatus'} } +## +# @Qcow2BitmapInfoFlags: +# +# An enumeration of flags that a bitmap can report to the user. +# +# @in-use: This flag is set by any process actively modifying the qcow2 fi= le, +# and cleared when the updated bitmap is flushed to the qcow2 ima= ge. +# The presence of this flag in an offline image means that the bi= tmap +# was not saved correctly after its last usage, and may contain +# inconsistent data. +# +# @auto: The bitmap must reflect all changes of the virtual disk by any +# application that would write to this qcow2 file. +# +# Since: 4.0 +## +{ 'enum': 'Qcow2BitmapInfoFlags', + 'data': ['in-use', 'auto'] } + +## +# @Qcow2BitmapInfo: +# +# Qcow2 bitmap information. +# +# @name: the name of the bitmap +# +# @granularity: granularity of the bitmap in bytes +# +# @flags: flags of the bitmap +# +# Since: 4.0 +## +{ 'struct': 'Qcow2BitmapInfo', + 'data': {'name': 'str', 'granularity': 'uint32', + 'flags': ['Qcow2BitmapInfoFlags'] } } + ## # @BlockLatencyHistogramInfo: # diff --git a/block/qcow2.h b/block/qcow2.h index 32cce9eee22..9dd02df831c 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -684,6 +684,8 @@ int qcow2_check_bitmaps_refcounts(BlockDriverState *bs,= BdrvCheckResult *res, void **refcount_table, int64_t *refcount_table_size); bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, Error **errp); +Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs, + Error **errp); int qcow2_reopen_bitmaps_rw_hint(BlockDriverState *bs, bool *header_update= d, Error **errp); int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp); diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index b9463014292..3ee524da4b5 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -1006,6 +1006,82 @@ fail: return false; } + +static Qcow2BitmapInfoFlagsList *get_bitmap_info_flags(uint32_t flags) +{ + Qcow2BitmapInfoFlagsList *list =3D NULL; + Qcow2BitmapInfoFlagsList **plist =3D &list; + int i; + + static const struct { + int bme; /* Bitmap directory entry flags */ + int info; /* The flags to report to the user */ + } map[] =3D { + { BME_FLAG_IN_USE, QCOW2_BITMAP_INFO_FLAGS_IN_USE }, + { BME_FLAG_AUTO, QCOW2_BITMAP_INFO_FLAGS_AUTO }, + }; + + int map_size =3D ARRAY_SIZE(map); + + for (i =3D 0; i < map_size; ++i) { + if (flags & map[i].bme) { + Qcow2BitmapInfoFlagsList *entry =3D + g_new0(Qcow2BitmapInfoFlagsList, 1); + entry->value =3D map[i].info; + *plist =3D entry; + plist =3D &entry->next; + flags &=3D ~map[i].bme; + } + } + /* Check if the BME_* mapping above is complete */ + assert(!flags); + + return list; +} + +/* + * qcow2_get_bitmap_info_list() + * Returns a list of QCOW2 bitmap details. + * In case of no bitmaps, the function returns NULL and + * the @errp parameter is not set. + * When bitmap information can not be obtained, the function returns + * NULL and the @errp parameter is set. + */ +Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs, + Error **errp) +{ + BDRVQcow2State *s =3D bs->opaque; + Qcow2BitmapList *bm_list; + Qcow2Bitmap *bm; + Qcow2BitmapInfoList *list =3D NULL; + Qcow2BitmapInfoList **plist =3D &list; + + if (s->nb_bitmaps =3D=3D 0) { + return NULL; + } + + bm_list =3D bitmap_list_load(bs, s->bitmap_directory_offset, + s->bitmap_directory_size, errp); + if (bm_list =3D=3D NULL) { + return NULL; + } + + QSIMPLEQ_FOREACH(bm, bm_list, entry) { + Qcow2BitmapInfo *info =3D g_new0(Qcow2BitmapInfo, 1); + Qcow2BitmapInfoList *obj =3D g_new0(Qcow2BitmapInfoList, 1); + info->granularity =3D 1U << bm->granularity_bits; + info->name =3D g_strdup(bm->name); + info->flags =3D get_bitmap_info_flags(bm->flags & ~BME_RESERVED_FL= AGS); + obj->value =3D info; + *plist =3D obj; + plist =3D &obj->next; + } + + bitmap_list_free(bm_list); + + return list; +} + int qcow2_reopen_bitmaps_rw_hint(BlockDriverState *bs, bool *header_update= d, Error **errp) { diff --git a/block/qcow2.c b/block/qcow2.c index bcb80d0270c..65a54c9ac65 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -4387,7 +4387,7 @@ static ImageInfoSpecific *qcow2_get_specific_info(Blo= ckDriverState *bs, spec_info =3D g_new(ImageInfoSpecific, 1); *spec_info =3D (ImageInfoSpecific){ .type =3D IMAGE_INFO_SPECIFIC_KIND_QCOW2, - .u.qcow2.data =3D g_new(ImageInfoSpecificQCow2, 1), + .u.qcow2.data =3D g_new0(ImageInfoSpecificQCow2, 1), }; if (s->qcow_version =3D=3D 2) { *spec_info->u.qcow2.data =3D (ImageInfoSpecificQCow2){ @@ -4395,6 +4395,13 @@ static ImageInfoSpecific *qcow2_get_specific_info(Bl= ockDriverState *bs, .refcount_bits =3D s->refcount_bits, }; } else if (s->qcow_version =3D=3D 3) { + Qcow2BitmapInfoList *bitmaps; + bitmaps =3D qcow2_get_bitmap_info_list(bs, &local_err); + if (local_err) { + error_propagate(errp, local_err); + qapi_free_ImageInfoSpecific(spec_info); + return NULL; + } *spec_info->u.qcow2.data =3D (ImageInfoSpecificQCow2){ .compat =3D g_strdup("1.1"), .lazy_refcounts =3D s->compatible_features & @@ -4404,6 +4411,8 @@ static ImageInfoSpecific *qcow2_get_specific_info(Blo= ckDriverState *bs, QCOW2_INCOMPAT_CORRUPT, .has_corrupt =3D true, .refcount_bits =3D s->refcount_bits, + .has_bitmaps =3D !!bitmaps, + .bitmaps =3D bitmaps, }; } else { /* if this assertion fails, this probably means a new version was --=20 2.20.1 From nobody Tue May 7 23:25:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1549918442600203.5529878414203; Mon, 11 Feb 2019 12:54:02 -0800 (PST) Received: from localhost ([127.0.0.1]:56112 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIaO-0008HY-Hb for importer@patchew.org; Mon, 11 Feb 2019 15:53:52 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53671) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtIYY-0007DF-A9 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtIYW-0006gq-8w for qemu-devel@nongnu.org; Mon, 11 Feb 2019 15:51:57 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52710) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gtIYC-0006cM-BJ; Mon, 11 Feb 2019 15:51:36 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 85C39C0669C2; Mon, 11 Feb 2019 20:51:35 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-127.phx2.redhat.com [10.3.116.127]) by smtp.corp.redhat.com (Postfix) with ESMTP id EE26018502; Mon, 11 Feb 2019 20:51:34 +0000 (UTC) From: Eric Blake To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 14:51:28 -0600 Message-Id: <20190211205128.27146-5-eblake@redhat.com> In-Reply-To: <20190211205128.27146-1-eblake@redhat.com> References: <20190211205128.27146-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 11 Feb 2019 20:51:35 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 4/4] qcow2: list of bitmaps new test 242 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: Kevin Wolf , Andrey Shinkevich , Vladimir Sementsov-Ogievskiy , "open list:Block layer core" , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Andrey Shinkevich A new test file 242 added to the qemu-iotests set. It checks the format of qcow2 specific information for the new added section that lists details of bitmaps. Signed-off-by: Andrey Shinkevich Message-Id: <1549638368-530182-4-git-send-email-andrey.shinkevich@virtuozzo= .com> Reviewed-by: Eric Blake [eblake: pep8 compliance, avoid trailing blank line] Reviewed-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Eric Blake --- tests/qemu-iotests/242 | 104 +++++++++++++++++++++++ tests/qemu-iotests/242.out | 166 +++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/group | 1 + 3 files changed, 271 insertions(+) create mode 100755 tests/qemu-iotests/242 create mode 100644 tests/qemu-iotests/242.out diff --git a/tests/qemu-iotests/242 b/tests/qemu-iotests/242 new file mode 100755 index 00000000000..16c65edcd7f --- /dev/null +++ b/tests/qemu-iotests/242 @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# +# Test for qcow2 bitmap printed information +# +# Copyright (c) 2019 Virtuozzo International GmbH +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import iotests +import json +from iotests import qemu_img_create, qemu_io, qemu_img_pipe, \ + file_path, img_info_log, log, filter_qemu_io + +iotests.verify_image_format(supported_fmts=3D['qcow2']) + +disk =3D file_path('disk') +chunk =3D 256 * 1024 +bitmap_flag_unknown =3D 1 << 2 +# flag_offset =3D 5*cluster_size + flag_offset_in_bitmap_directory_entry +flag_offset =3D 0x5000f + + +def print_bitmap(extra_args): + log('qemu-img info dump:\n') + img_info_log(disk, extra_args=3Dextra_args) + result =3D json.loads(qemu_img_pipe('info', '--force-share', + '--output=3Djson', disk)) + if 'bitmaps' in result['format-specific']['data']: + bitmaps =3D result['format-specific']['data']['bitmaps'] + log('The same bitmaps in JSON format:') + log(bitmaps, indent=3D2) + else: + log('No bitmap in JSON format output') + + +def add_bitmap(bitmap_number, persistent, disabled): + granularity =3D 1 << (13 + bitmap_number) + bitmap_name =3D 'bitmap-' + str(bitmap_number-1) + vm =3D iotests.VM().add_drive(disk) + vm.launch() + vm.qmp_log('block-dirty-bitmap-add', node=3D'drive0', name=3Dbitmap_na= me, + granularity=3Dgranularity, persistent=3Dpersistent, + disabled=3Ddisabled) + vm.shutdown() + + +def write_to_disk(offset, size): + write =3D 'write {} {}'.format(offset, size) + log(qemu_io('-c', write, disk), filters=3D[filter_qemu_io]) + + +def toggle_flag(offset): + with open(disk, "r+b") as f: + f.seek(offset, 0) + c =3D f.read(1) + toggled =3D chr(ord(c) ^ bitmap_flag_unknown) + f.seek(-1, 1) + f.write(toggled) + + +qemu_img_create('-f', iotests.imgfmt, disk, '1M') + +for num in range(1, 4): + disabled =3D False + if num =3D=3D 2: + disabled =3D True + log('Test {}'.format(num)) + add_bitmap(num, num > 1, disabled) + write_to_disk((num-1) * chunk, chunk) + print_bitmap([]) + log('') + +vm =3D iotests.VM().add_drive(disk) +vm.launch() +num +=3D 1 +log('Test {}\nChecking "in-use" flag...'.format(num)) +print_bitmap(['--force-share']) +vm.shutdown() + +num +=3D 1 +log('\nTest {}'.format(num)) +qemu_img_create('-f', iotests.imgfmt, disk, '1M') +add_bitmap(1, True, False) +log('Write an unknown bitmap flag \'{}\' into a new QCOW2 image at offset = {}' + .format(hex(bitmap_flag_unknown), flag_offset)) +toggle_flag(flag_offset) +img_info_log(disk) +toggle_flag(flag_offset) +log('Unset the unknown bitmap flag \'{}\' in the bitmap directory entry:\n' + .format(hex(bitmap_flag_unknown))) +img_info_log(disk) +log('Test complete') diff --git a/tests/qemu-iotests/242.out b/tests/qemu-iotests/242.out new file mode 100644 index 00000000000..fbe05d71c09 --- /dev/null +++ b/tests/qemu-iotests/242.out @@ -0,0 +1,166 @@ +Test 1 +{"execute": "block-dirty-bitmap-add", "arguments": {"disabled": false, "gr= anularity": 16384, "name": "bitmap-0", "node": "drive0", "persistent": fals= e}} +{"return": {}} +wrote 262144/262144 bytes at offset 0 +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +qemu-img info dump: + +image: TEST_IMG +file format: IMGFMT +virtual size: 1.0M (1048576 bytes) +cluster_size: 65536 +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false + +No bitmap in JSON format output + +Test 2 +{"execute": "block-dirty-bitmap-add", "arguments": {"disabled": true, "gra= nularity": 32768, "name": "bitmap-1", "node": "drive0", "persistent": true}} +{"return": {}} +wrote 262144/262144 bytes at offset 262144 +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +qemu-img info dump: + +image: TEST_IMG +file format: IMGFMT +virtual size: 1.0M (1048576 bytes) +cluster_size: 65536 +Format specific information: + compat: 1.1 + lazy refcounts: false + bitmaps: + [0]: + flags: + name: bitmap-1 + granularity: 32768 + refcount bits: 16 + corrupt: false + +The same bitmaps in JSON format: +[ + { + "flags": [], + "granularity": 32768, + "name": "bitmap-1" + } +] + +Test 3 +{"execute": "block-dirty-bitmap-add", "arguments": {"disabled": false, "gr= anularity": 65536, "name": "bitmap-2", "node": "drive0", "persistent": true= }} +{"return": {}} +wrote 262144/262144 bytes at offset 524288 +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +qemu-img info dump: + +image: TEST_IMG +file format: IMGFMT +virtual size: 1.0M (1048576 bytes) +cluster_size: 65536 +Format specific information: + compat: 1.1 + lazy refcounts: false + bitmaps: + [0]: + flags: + name: bitmap-1 + granularity: 32768 + [1]: + flags: + [0]: auto + name: bitmap-2 + granularity: 65536 + refcount bits: 16 + corrupt: false + +The same bitmaps in JSON format: +[ + { + "flags": [], + "granularity": 32768, + "name": "bitmap-1" + }, + { + "flags": [ + "auto" + ], + "granularity": 65536, + "name": "bitmap-2" + } +] + +Test 4 +Checking "in-use" flag... +qemu-img info dump: + +image: TEST_IMG +file format: IMGFMT +virtual size: 1.0M (1048576 bytes) +cluster_size: 65536 +Format specific information: + compat: 1.1 + lazy refcounts: false + bitmaps: + [0]: + flags: + [0]: in-use + name: bitmap-1 + granularity: 32768 + [1]: + flags: + [0]: in-use + [1]: auto + name: bitmap-2 + granularity: 65536 + refcount bits: 16 + corrupt: false + +The same bitmaps in JSON format: +[ + { + "flags": [ + "in-use" + ], + "granularity": 32768, + "name": "bitmap-1" + }, + { + "flags": [ + "in-use", + "auto" + ], + "granularity": 65536, + "name": "bitmap-2" + } +] + +Test 5 +{"execute": "block-dirty-bitmap-add", "arguments": {"disabled": false, "gr= anularity": 16384, "name": "bitmap-0", "node": "drive0", "persistent": true= }} +{"return": {}} +Write an unknown bitmap flag '0x4' into a new QCOW2 image at offset 327695 +qemu-img: Could not open 'TEST_IMG': Bitmap 'bitmap-0' doesn't satisfy the= constraints + +Unset the unknown bitmap flag '0x4' in the bitmap directory entry: + +image: TEST_IMG +file format: IMGFMT +virtual size: 1.0M (1048576 bytes) +cluster_size: 65536 +Format specific information: + compat: 1.1 + lazy refcounts: false + bitmaps: + [0]: + flags: + [0]: auto + name: bitmap-0 + granularity: 16384 + refcount bits: 16 + corrupt: false + +Test complete diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 959ffe85fc3..fc4c416fa3a 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -238,3 +238,4 @@ 238 auto quick 239 rw auto quick 240 auto quick +242 rw auto quick --=20 2.20.1