From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782159; cv=none; d=zohomail.com; s=zohoarc; b=DMUl0PlySTv7dmyPcf8p/8ZgUyBU4fTY7rPUTxVecQRLYzp+spkhiqUlzT4loSKbAVKcLRsqeFH8Z/Ucy7DOmJcI/vBP7QvVDkC5xUL+K0w8sLFxhq7vGKGxxsM/I0w1GsF1kixsvbwwzYo0/VETIJ51YSTSo6lDXcDJ0ViKvXk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782159; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=DgpKkfr1TvyhVYLmYHBqEAk1a8fjI9pH7TJu8c/N474=; b=hZd2Cu8TuokFy24Ak6OBYYoHt9mrI52/cgTcyac8Ux/W4hhixbTYsACAmHhYGPSKu+rwbJnCu3F0SmqRDvyQc/MEE3zCjJOJxvDJejKRLWaPP70rtgZl6z9fEPSdKC9j7ior/MdVoPVaY7CBLTVrmRwkrMxvu53YUWDrtQOgwJU= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782159653812.6326879686959; Fri, 3 Jul 2020 06:15:59 -0700 (PDT) Received: from localhost ([::1]:37920 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLXq-0001Bo-9y for importer@patchew.org; Fri, 03 Jul 2020 09:15:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43532) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW0-0006pU-Ds; Fri, 03 Jul 2020 09:14:04 -0400 Received: from relay.sw.ru ([185.231.240.75]:60374 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVv-0007eV-QN; Fri, 03 Jul 2020 09:14:02 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-JD; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 01/10] qcow2: Fix capitalization of header extension constant. Date: Fri, 3 Jul 2020 16:13:41 +0300 Message-Id: <1593782030-521984-2-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Make the capitalization of the hexadecimal numbers consistent for the QCOW2 header extension constants in docs/interop/qcow2.txt. Suggested-by: Eric Blake Signed-off-by: Andrey Shinkevich Reviewed-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.c | 2 +- docs/interop/qcow2.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 0cd2e67..80dfe5f 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -66,7 +66,7 @@ typedef struct { } QEMU_PACKED QCowExtension; =20 #define QCOW2_EXT_MAGIC_END 0 -#define QCOW2_EXT_MAGIC_BACKING_FORMAT 0xE2792ACA +#define QCOW2_EXT_MAGIC_BACKING_FORMAT 0xe2792aca #define QCOW2_EXT_MAGIC_FEATURE_TABLE 0x6803f857 #define QCOW2_EXT_MAGIC_CRYPTO_HEADER 0x0537be77 #define QCOW2_EXT_MAGIC_BITMAPS 0x23852875 diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt index cb72346..f072e27 100644 --- a/docs/interop/qcow2.txt +++ b/docs/interop/qcow2.txt @@ -231,7 +231,7 @@ be stored. Each extension has a structure like the foll= owing: =20 Byte 0 - 3: Header extension type: 0x00000000 - End of the header extension area - 0xE2792ACA - Backing file format name string + 0xe2792aca - Backing file format name string 0x6803f857 - Feature name table 0x23852875 - Bitmaps extension 0x0537be77 - Full disk encryption header pointer --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782333; cv=none; d=zohomail.com; s=zohoarc; b=ShDJfISw9+bBHNRQmw1+XJQvJDQ+Djyak+3/ehsDP8GGCw3jLixx0LtZIpqY9tXwueALyF8uze8dbC1r2enFUotEM8yYwV/fPrqqgsIgggxeHST5jqPJV4conoGn4yc0h1kIWhg3AmWIOBh+k8fDXI5jShMPALn4hmH98xF63BY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782333; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=jTaQe+3C4V+UcRj4btutD2ZIpAv4td/tmxwTbSW57kA=; b=jieSHBGXq34tExWrZEOxbsINOPT6nGC+uP9QN5b4v8UNUK4E8M8TMmZjGKsWCUhUQ439CnJDBHArtUuRh/Rv7X4IJXTs9UgaepP0JclmZwSXnmiSttU+iUC6zoYoOwnJuic2+ZOy2CMVGcsYwAQVzWJqo7wVc1rGDCckimRkdy4= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782333864994.0831032375962; Fri, 3 Jul 2020 06:18:53 -0700 (PDT) Received: from localhost ([::1]:48666 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLae-0005ha-Gk for importer@patchew.org; Fri, 03 Jul 2020 09:18:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43548) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW0-0006q5-OC; Fri, 03 Jul 2020 09:14:04 -0400 Received: from relay.sw.ru ([185.231.240.75]:60346 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVv-0007eR-Qn; Fri, 03 Jul 2020 09:14:04 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-KP; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 02/10] qcow2_format.py: make printable data an extension class member Date: Fri, 3 Jul 2020 16:13:42 +0300 Message-Id: <1593782030-521984-3-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Let us differ binary data type from string one for the extension data variable and keep the string as the QcowHeaderExtension class member. Signed-off-by: Andrey Shinkevich Reviewed-by: Eric Blake Reviewed-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/qcow2_format.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index cc432e7..2f3681b 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -165,6 +165,13 @@ class QcowHeaderExtension(Qcow2Struct): self.data =3D fd.read(padded) assert self.data is not None =20 + data_str =3D self.data[:self.length] + if all(c in string.printable.encode('ascii') for c in data_str): + data_str =3D f"'{ data_str.decode('ascii') }'" + else: + data_str =3D '' + self.data_str =3D data_str + if self.magic =3D=3D QCOW2_EXT_MAGIC_BITMAPS: self.obj =3D Qcow2BitmapExt(data=3Dself.data) else: @@ -174,12 +181,7 @@ class QcowHeaderExtension(Qcow2Struct): super().dump() =20 if self.obj is None: - data =3D self.data[:self.length] - if all(c in string.printable.encode('ascii') for c in data): - data =3D f"'{ data.decode('ascii') }'" - else: - data =3D '' - print(f'{"data":<25} {data}') + print(f'{"data":<25} {self.data_str}') else: self.obj.dump() =20 --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782226; cv=none; d=zohomail.com; s=zohoarc; b=cDtEBYdvHv23o8J/2TEF3JtgTFpS7CVbiP3c+KDrZ9d6yx5TOscsirkV1Rr2XnxtUZRUHIzLzU40FfOZ9GDHBRrmLFLBGs1VJF72jp61b+X90kl8yIJTGMlgkeke/PHL2uXa/yrU5ETtv0BvQEyrrDMuNzrJ3jCos7edTaZjEJg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782226; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=pDjl4GJ2wzqlB5bu5DCa8F4htVoJto8ZOUzA7be6Qzs=; b=UNBTpTJhQSZb8h4w9FnZqRxw9icCGZ9AiarrNSjW3Km6R3HdVlZBLXnNk8jnBGYP1XxAbmw/yiX15gOjAVVJ6527Ogm8DWZRKpe94RpEs6Xuc+yyTfe5GE0yXytNhmrHKopH5WYEVojyLA+IVqaNlO2GEEzNVR0Ll/ngYnFLuLQ= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 159378222694214.833765277797397; Fri, 3 Jul 2020 06:17:06 -0700 (PDT) Received: from localhost ([::1]:42158 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLYv-000362-8w for importer@patchew.org; Fri, 03 Jul 2020 09:17:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43542) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW0-0006px-3B; Fri, 03 Jul 2020 09:14:04 -0400 Received: from relay.sw.ru ([185.231.240.75]:60336 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVv-0007eM-S6; Fri, 03 Jul 2020 09:14:03 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-Nf; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 03/10] qcow2_format.py: change Qcow2BitmapExt initialization method Date: Fri, 3 Jul 2020 16:13:43 +0300 Message-Id: <1593782030-521984-4-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" There are two ways to initialize a class derived from Qcow2Struct: 1. Pass a block of binary data to the constructor. 2. Pass the file descriptor to allow reading the file from constructor. Let's change the Qcow2BitmapExt initialization method from 1 to 2 to support a scattered reading in the initialization chain. The implementation comes with the patch that follows. Suggested-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/qcow2_format.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index 2f3681b..1435e34 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -63,7 +63,8 @@ class Qcow2StructMeta(type): =20 class Qcow2Struct(metaclass=3DQcow2StructMeta): =20 - """Qcow2Struct: base class for qcow2 data structures + """ + Qcow2Struct: base class for qcow2 data structures =20 Successors should define fields class variable, which is: list of tupl= es, each of three elements: @@ -113,6 +114,9 @@ class Qcow2BitmapExt(Qcow2Struct): ('u64', '{:#x}', 'bitmap_directory_offset') ) =20 + def __init__(self, fd): + super().__init__(fd=3Dfd) + =20 QCOW2_EXT_MAGIC_BITMAPS =3D 0x23852875 =20 @@ -173,7 +177,13 @@ class QcowHeaderExtension(Qcow2Struct): self.data_str =3D data_str =20 if self.magic =3D=3D QCOW2_EXT_MAGIC_BITMAPS: - self.obj =3D Qcow2BitmapExt(data=3Dself.data) + assert fd is not None + position =3D fd.tell() + # Step back to reread data + padded =3D (self.length + 7) & ~7 + fd.seek(-padded, 1) + self.obj =3D Qcow2BitmapExt(fd=3Dfd) + fd.seek(position) else: self.obj =3D None =20 --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782412; cv=none; d=zohomail.com; s=zohoarc; b=jen5hCYlsiWcuqBqg26SosAGhjQrqoGosThNS+VCsbdUHakK4iPYNRMchDmBjXVMOk13QQoOOD6SPpWBsvWYn2aONCk7XZd71xqk2CtGw2bSM+/57nLh0e9irwZ299AGgj0+1J0Lmd1rUF2YWc9I7veXZ83HMZKqpIGNWeJh73w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782412; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=BKXozxQ5/Q829bWDwAf8Jl4XQz94/K30+gmjbJic49Q=; b=kHHxZYkZb5yI/iA+E6uJMkrAh/CYf9mZKrXa9nCAdCy7NVUnNOMAVkUm6P8UgsRz4+vvO5nazb2YU/X0Q0XJlH2yD6DFm2CQiF1XSlU7WrCY7i+cl3cOymA30kRqgn4l5kGUPhGFuWmc4a+0fi7OCpRFT6fh47IqmBrSY0fxjn4= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782412684802.471111200612; Fri, 3 Jul 2020 06:20:12 -0700 (PDT) Received: from localhost ([::1]:54596 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLbv-00088f-Gp for importer@patchew.org; Fri, 03 Jul 2020 09:20:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43564) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW2-0006r1-Cc; Fri, 03 Jul 2020 09:14:06 -0400 Received: from relay.sw.ru ([185.231.240.75]:60340 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVv-0007eQ-Uj; Fri, 03 Jul 2020 09:14:04 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-Os; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 04/10] qcow2_format.py: dump bitmap flags in human readable way. Date: Fri, 3 Jul 2020 16:13:44 +0300 Message-Id: <1593782030-521984-5-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Introduce the class BitmapFlags that parses a bitmap flags mask. Suggested-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/qcow2_format.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index 1435e34..d8c058d 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -40,6 +40,22 @@ class Flags64(Qcow2Field): return str(bits) =20 =20 +class BitmapFlags(Qcow2Field): + + flags =3D { + 0x1: 'in-use', + 0x2: 'auto' + } + + def __str__(self): + bits =3D [] + for bit in range(64): + flag =3D self.value & (1 << bit) + if flag: + bits.append(self.flags.get(flag, '{:#x}'.format(flag))) + return f'{self.value:#x} ({bits})' + + class Enum(Qcow2Field): =20 def __str__(self): --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782147; cv=none; d=zohomail.com; s=zohoarc; b=SGRU3jMi2/kVyZh11RZa5ktJUwkA76vMl2P+ABDkXEttCWyF0dg6Qd63IQLC1M2CBF5HLmLrBFUCVB6+iVrTzbEP49Sp302/G3vBkI3OvwNnnnc7spUYTVAroPkeIDnZuXJB5Z/mDf45Iu39wPERlQS3fhiorRoBfz249TS0mis= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782147; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=iw2C4lBhVoU7aAwwrlyOqBnr+RakxVKDv9H/mljIEFk=; b=m1jb4kTUcxvCACNbLb6ymm9O0eFTavc7HVafW9yHNSwIUojjzm8ou8dO2HFv5UC8AppEp/oTqhAgSiCMm1hY7Et/goSyCLPDrwNXwWbfiLkVwr7xRjN8FSHKbsHhQJQrhGSl9+JhmSTZmaHWq/9Q7E32ucGIfsv6/FEV4aSlkpI= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782147511544.9922731760192; Fri, 3 Jul 2020 06:15:47 -0700 (PDT) Received: from localhost ([::1]:36500 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLXc-0000W6-1x for importer@patchew.org; Fri, 03 Jul 2020 09:15:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43586) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW3-0006tV-IX; Fri, 03 Jul 2020 09:14:07 -0400 Received: from relay.sw.ru ([185.231.240.75]:60360 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVw-0007eT-0y; Fri, 03 Jul 2020 09:14:07 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-Q8; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 05/10] qcow2_format.py: Dump bitmap directory information Date: Fri, 3 Jul 2020 16:13:45 +0300 Message-Id: <1593782030-521984-6-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Read and dump entries from the bitmap directory of QCOW2 image. It extends the output in the test case #291. Header extension: magic 0x23852875 (Bitmaps) ... Bitmap name bitmap-1 bitmap_table_offset 0xf0000 bitmap_table_size 1 flags 0x2 (['auto']) type 1 granularity_bits 16 name_size 8 extra_data_size 0 Suggested-by: Kevin Wolf Signed-off-by: Andrey Shinkevich Reviewed-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/291.out | 45 ++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/qcow2_format.py | 44 ++++++++++++++++++++++++++++++++++= +++ 2 files changed, 89 insertions(+) diff --git a/tests/qemu-iotests/291.out b/tests/qemu-iotests/291.out index 08bfaaa..53a8eeb 100644 --- a/tests/qemu-iotests/291.out +++ b/tests/qemu-iotests/291.out @@ -33,6 +33,24 @@ reserved32 0 bitmap_directory_size 0x40 bitmap_directory_offset 0x510000 =20 +Bitmap name b1 +bitmap_table_offset 0x4e0000 +bitmap_table_size 1 +flags 0x0 ([]) +type 1 +granularity_bits 19 +name_size 2 +extra_data_size 0 + +Bitmap name b2 +bitmap_table_offset 0x500000 +bitmap_table_size 1 +flags 0x2 (['auto']) +type 1 +granularity_bits 16 +name_size 2 +extra_data_size 0 + =20 =3D=3D=3D Bitmap preservation not possible to non-qcow2 =3D=3D=3D =20 @@ -98,6 +116,33 @@ reserved32 0 bitmap_directory_size 0x60 bitmap_directory_offset 0x520000 =20 +Bitmap name b1 +bitmap_table_offset 0x470000 +bitmap_table_size 1 +flags 0x0 ([]) +type 1 +granularity_bits 19 +name_size 2 +extra_data_size 0 + +Bitmap name b2 +bitmap_table_offset 0x490000 +bitmap_table_size 1 +flags 0x2 (['auto']) +type 1 +granularity_bits 16 +name_size 2 +extra_data_size 0 + +Bitmap name b0 +bitmap_table_offset 0x510000 +bitmap_table_size 1 +flags 0x0 ([]) +type 1 +granularity_bits 16 +name_size 2 +extra_data_size 0 + =20 =3D=3D=3D Check bitmap contents =3D=3D=3D =20 diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index d8c058d..7c0dc9a 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -132,6 +132,50 @@ class Qcow2BitmapExt(Qcow2Struct): =20 def __init__(self, fd): super().__init__(fd=3Dfd) + self.read_bitmap_directory(fd) + + def read_bitmap_directory(self, fd): + fd.seek(self.bitmap_directory_offset) + self.bitmap_directory =3D \ + [Qcow2BitmapDirEntry(fd) for _ in range(self.nb_bitmaps)] + + def dump(self): + super().dump() + for entry in self.bitmap_directory: + print() + entry.dump() + + +class Qcow2BitmapDirEntry(Qcow2Struct): + + fields =3D ( + ('u64', '{:#x}', 'bitmap_table_offset'), + ('u32', '{}', 'bitmap_table_size'), + ('u32', BitmapFlags, 'flags'), + ('u8', '{}', 'type'), + ('u8', '{}', 'granularity_bits'), + ('u16', '{}', 'name_size'), + ('u32', '{}', 'extra_data_size') + ) + + def __init__(self, fd): + super().__init__(fd=3Dfd) + # Seek relative to the current position in the file + fd.seek(self.extra_data_size, 1) + bitmap_name =3D fd.read(self.name_size) + self.name =3D bitmap_name.decode('ascii') + # Move position to the end of the entry in the directory + entry_raw_size =3D self.bitmap_dir_entry_raw_size() + padding =3D ((entry_raw_size + 7) & ~7) - entry_raw_size + fd.seek(padding, 1) + + def bitmap_dir_entry_raw_size(self): + return struct.calcsize(self.fmt) + self.name_size + \ + self.extra_data_size + + def dump(self): + print(f'{"Bitmap name":<25} {self.name}') + super(Qcow2BitmapDirEntry, self).dump() =20 =20 QCOW2_EXT_MAGIC_BITMAPS =3D 0x23852875 --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782274; cv=none; d=zohomail.com; s=zohoarc; b=SEhD6gkDZFb+pD4/ivmYmknyIT0VB1Hq5OMM2+ZKhG4OWJXLKK/slWZdSBKAgZSEJQfILIi0kRRkB4GXZiFa86g/CmrsKkrWO30QBxPJeJVC/QXeYTWUkqF4bTFBKN5+sblPaw8HQprS+vJl/ZgTaVH9LGOTVtit/Z2+J4cav7g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782274; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=CXYquToy/cInm6Mfo75i8dNoF5xoZuje4QOW0Cwt5b8=; b=idVysfr8uL3OAMGLweZPQkzVTvwLKKsZFIRuCD/R1f2Mome041m6EtdmiwZIxyuH+jOwtEwCJugMqZJlGSTwTW8vgTlX3dYEFNeLIspUGp048q2wzusboswy/pDf8asSJtLdnz9Gk/d58ITwMYforlJU3h42pQbN4/RZglNoNLQ= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782274125639.5044486090782; Fri, 3 Jul 2020 06:17:54 -0700 (PDT) Received: from localhost ([::1]:45540 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLZg-0004Qc-UP for importer@patchew.org; Fri, 03 Jul 2020 09:17:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43598) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW4-0006xK-Qy; Fri, 03 Jul 2020 09:14:08 -0400 Received: from relay.sw.ru ([185.231.240.75]:60342 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVw-0007eN-0f; Fri, 03 Jul 2020 09:14:08 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-Sd; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 06/10] qcow2_format.py: pass cluster size to substructures Date: Fri, 3 Jul 2020 16:13:46 +0300 Message-Id: <1593782030-521984-7-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The cluster size of an image is the QcowHeader class member and may be obtained by dependent extension structures such as Qcow2BitmapExt for further bitmap table details print. Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/qcow2_format.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index 7c0dc9a..cfd9646 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -130,14 +130,16 @@ class Qcow2BitmapExt(Qcow2Struct): ('u64', '{:#x}', 'bitmap_directory_offset') ) =20 - def __init__(self, fd): + def __init__(self, fd, cluster_size): super().__init__(fd=3Dfd) + self.cluster_size =3D cluster_size self.read_bitmap_directory(fd) =20 def read_bitmap_directory(self, fd): fd.seek(self.bitmap_directory_offset) self.bitmap_directory =3D \ - [Qcow2BitmapDirEntry(fd) for _ in range(self.nb_bitmaps)] + [Qcow2BitmapDirEntry(fd, cluster_size=3Dself.cluster_size) + for _ in range(self.nb_bitmaps)] =20 def dump(self): super().dump() @@ -158,8 +160,9 @@ class Qcow2BitmapDirEntry(Qcow2Struct): ('u32', '{}', 'extra_data_size') ) =20 - def __init__(self, fd): + def __init__(self, fd, cluster_size): super().__init__(fd=3Dfd) + self.cluster_size =3D cluster_size # Seek relative to the current position in the file fd.seek(self.extra_data_size, 1) bitmap_name =3D fd.read(self.name_size) @@ -199,11 +202,13 @@ class QcowHeaderExtension(Qcow2Struct): # then padding to next multiply of 8 ) =20 - def __init__(self, magic=3DNone, length=3DNone, data=3DNone, fd=3DNone= ): + def __init__(self, magic=3DNone, length=3DNone, data=3DNone, fd=3DNone, + cluster_size=3DNone): """ Support both loading from fd and creation from user data. For fd-based creation current position in a file will be used to r= ead the data. + The cluster_size value may be obtained by dependent structures. =20 This should be somehow refactored and functionality should be move= d to superclass (to allow creation of any qcow2 struct), but then, fiel= ds @@ -242,7 +247,7 @@ class QcowHeaderExtension(Qcow2Struct): # Step back to reread data padded =3D (self.length + 7) & ~7 fd.seek(-padded, 1) - self.obj =3D Qcow2BitmapExt(fd=3Dfd) + self.obj =3D Qcow2BitmapExt(fd=3Dfd, cluster_size=3Dcluster_si= ze) fd.seek(position) else: self.obj =3D None @@ -318,7 +323,7 @@ class QcowHeader(Qcow2Struct): end =3D self.cluster_size =20 while fd.tell() < end: - ext =3D QcowHeaderExtension(fd=3Dfd) + ext =3D QcowHeaderExtension(fd=3Dfd, cluster_size=3Dself.clust= er_size) if ext.magic =3D=3D 0: break else: --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782545; cv=none; d=zohomail.com; s=zohoarc; b=ZtVYHxKUd1bkLxIUMekyUAKCg7LqNVYq6IAmki0VHXe0dswOc44oLFQGb+3XztxlHBNn2Z8rv5xCSY3QxjpNUv4fNkaMOakC2P8bmrDv7ledm77Vav/RWjbPJM7ZwA8dixkxZW3qGnIjBNPqUivQjWqMeiuMC4eHLQaf55TnMNM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782545; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=IfNTG7yFNRMbuPJoN1hYlHUCErMCVVeLoI/EqHVHpQs=; b=dFkDfiJztHVYmtHg9O2gaLB9N9flqL/X1o2PD0WR7/ClN7hl7qjb/wGx3dUnZKrMUtsfN7gEIQJ+E4kzyAya81UDiECkpM7CV1c218OdIifb7fzaAPafnwMZIbbdQm4MZ/jOX3t/lmNa4XyiEhuIKp7OyZe9VJKDWPNkWMpY5xk= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782545927926.6836990032153; Fri, 3 Jul 2020 06:22:25 -0700 (PDT) Received: from localhost ([::1]:34076 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLe4-0003jB-LT for importer@patchew.org; Fri, 03 Jul 2020 09:22:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43578) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW3-0006sb-7h; Fri, 03 Jul 2020 09:14:07 -0400 Received: from relay.sw.ru ([185.231.240.75]:60337 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVw-0007eO-0N; Fri, 03 Jul 2020 09:14:06 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-Th; Fri, 03 Jul 2020 16:13:47 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 07/10] qcow2_format.py: Dump bitmap table serialized entries Date: Fri, 3 Jul 2020 16:13:47 +0300 Message-Id: <1593782030-521984-8-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add bitmap table information to the QCOW2 metadata dump. It extends the output of the test case #291 Bitmap name bitmap-1 ... Bitmap table type offset size 0 serialized 4718592 65536 1 serialized 4294967296 65536 2 serialized 5348033147437056 65536 3 serialized 13792273858822144 65536 4 serialized 4718592 65536 5 serialized 4294967296 65536 6 serialized 4503608217305088 65536 7 serialized 14073748835532800 65536 Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/291.out | 45 ++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/qcow2_format.py | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/tests/qemu-iotests/291.out b/tests/qemu-iotests/291.out index 53a8eeb..9f465c6 100644 --- a/tests/qemu-iotests/291.out +++ b/tests/qemu-iotests/291.out @@ -41,6 +41,15 @@ type 1 granularity_bits 19 name_size 2 extra_data_size 0 +Bitmap table type offset size +0 serialized 5046272 65536 +1 all-zeroes 0 65536 +2 all-zeroes 0 65536 +3 all-zeroes 0 65536 +4 all-zeroes 0 65536 +5 all-zeroes 0 65536 +6 all-zeroes 0 65536 +7 all-zeroes 0 65536 =20 Bitmap name b2 bitmap_table_offset 0x500000 @@ -50,6 +59,15 @@ type 1 granularity_bits 16 name_size 2 extra_data_size 0 +Bitmap table type offset size +0 serialized 5177344 65536 +1 all-zeroes 0 65536 +2 all-zeroes 0 65536 +3 all-zeroes 0 65536 +4 all-zeroes 0 65536 +5 all-zeroes 0 65536 +6 all-zeroes 0 65536 +7 all-zeroes 0 65536 =20 =20 =3D=3D=3D Bitmap preservation not possible to non-qcow2 =3D=3D=3D @@ -124,6 +142,15 @@ type 1 granularity_bits 19 name_size 2 extra_data_size 0 +Bitmap table type offset size +0 serialized 4587520 65536 +1 all-zeroes 0 65536 +2 all-zeroes 0 65536 +3 all-zeroes 0 65536 +4 all-zeroes 0 65536 +5 all-zeroes 0 65536 +6 all-zeroes 0 65536 +7 all-zeroes 0 65536 =20 Bitmap name b2 bitmap_table_offset 0x490000 @@ -133,6 +160,15 @@ type 1 granularity_bits 16 name_size 2 extra_data_size 0 +Bitmap table type offset size +0 serialized 4718592 65536 +1 serialized 4294967296 65536 +2 serialized 5348033147437056 65536 +3 serialized 13792273858822144 65536 +4 serialized 4718592 65536 +5 serialized 4294967296 65536 +6 serialized 4503608217305088 65536 +7 serialized 14073748835532800 65536 =20 Bitmap name b0 bitmap_table_offset 0x510000 @@ -142,6 +178,15 @@ type 1 granularity_bits 16 name_size 2 extra_data_size 0 +Bitmap table type offset size +0 serialized 5242880 65536 +1 all-zeroes 0 65536 +2 all-zeroes 0 65536 +3 all-zeroes 0 65536 +4 all-zeroes 0 65536 +5 all-zeroes 0 65536 +6 all-zeroes 0 65536 +7 all-zeroes 0 65536 =20 =20 =3D=3D=3D Check bitmap contents =3D=3D=3D diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index cfd9646..b512f84 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -171,14 +171,56 @@ class Qcow2BitmapDirEntry(Qcow2Struct): entry_raw_size =3D self.bitmap_dir_entry_raw_size() padding =3D ((entry_raw_size + 7) & ~7) - entry_raw_size fd.seek(padding, 1) + position =3D fd.tell() + self.read_bitmap_table(fd) + fd.seek(position) =20 def bitmap_dir_entry_raw_size(self): return struct.calcsize(self.fmt) + self.name_size + \ self.extra_data_size =20 + def read_bitmap_table(self, fd): + fd.seek(self.bitmap_table_offset) + table_size =3D self.bitmap_table_size * 8 * 8 + table =3D [e[0] for e in struct.iter_unpack('>Q', fd.read(table_si= ze))] + self.bitmap_table =3D Qcow2BitmapTable(raw_table=3Dtable, + cluster_size=3Dself.cluster_s= ize) + def dump(self): print(f'{"Bitmap name":<25} {self.name}') super(Qcow2BitmapDirEntry, self).dump() + self.bitmap_table.dump() + + +class Qcow2BitmapTableEntry: + + BME_TABLE_ENTRY_OFFSET_MASK =3D 0x00fffffffffffe00 + BME_TABLE_ENTRY_FLAG_ALL_ONES =3D 1 + + def __init__(self, entry): + self.offset =3D entry & self.BME_TABLE_ENTRY_OFFSET_MASK + if self.offset: + self.type =3D 'serialized' + elif entry & self.BME_TABLE_ENTRY_FLAG_ALL_ONES: + self.type =3D 'all-ones' + else: + self.type =3D 'all-zeroes' + + +class Qcow2BitmapTable: + + def __init__(self, raw_table, cluster_size): + self.entries =3D [] + self.cluster_size =3D cluster_size + for entry in raw_table: + self.entries.append(Qcow2BitmapTableEntry(entry)) + + def dump(self): + size =3D self.cluster_size + bitmap_table =3D enumerate(self.entries) + print(f'{"Bitmap table":<14} {"type":<15} {"offset":<24} {"size"}') + for i, entry in bitmap_table: + print(f'{i:<14} {entry.type:<15} {entry.offset:<24} {size}') =20 =20 QCOW2_EXT_MAGIC_BITMAPS =3D 0x23852875 --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782168; cv=none; d=zohomail.com; s=zohoarc; b=C9bPvqdgH9+4fbQT0aUrUyVWvCEwhEgZ4issnKt5T/XtVlLG2zAWmNXB/l031k9WauK3LSStitzF4pkNkbR0pjYrR9xD6PyxuxF/5JNS303TE3qcAK5Rx5QBulUU2c140GOtzQpcYclW2c8IKvXHADnMDvGOQ7Rl29AFLKONVYo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782168; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=GFBO//uATFIDI5f4CqtdcqoiuZSoMa7/3b0qr2HZxGM=; b=dIDYOlJxgEckF9mTVB12Btue0YWkKCkiWft/yXs1NMWaFSMsNYVhpmvTT+jlJF7rmRTy4TghmjOUIwVNDXaXnWWbGdhTCKffdQ+wxb/kGIzD0j684I865sf+T/+LhsZDf7kM3PKE+NdbSxPSoWmh5h0n1tfnSB1BRbE62qshY6Q= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782168516923.1414926246023; Fri, 3 Jul 2020 06:16:08 -0700 (PDT) Received: from localhost ([::1]:38026 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLXx-0001EW-Qo for importer@patchew.org; Fri, 03 Jul 2020 09:16:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43590) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW3-0006uW-Qo; Fri, 03 Jul 2020 09:14:07 -0400 Received: from relay.sw.ru ([185.231.240.75]:60366 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVw-0007eU-0t; Fri, 03 Jul 2020 09:14:07 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVj-0004Vj-V0; Fri, 03 Jul 2020 16:13:48 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 08/10] qcow2.py: Introduce '-j' key to dump in JSON format Date: Fri, 3 Jul 2020 16:13:48 +0300 Message-Id: <1593782030-521984-9-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add the command key to the qcow2.py arguments list to dump QCOW2 metadata in JSON format. Here is the suggested way to do that. The implementation of the dump in JSON format is in the patch that follows. Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/qcow2.py | 19 +++++++++++++++---- tests/qemu-iotests/qcow2_format.py | 16 ++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py index 0910e6a..7402279 100755 --- a/tests/qemu-iotests/qcow2.py +++ b/tests/qemu-iotests/qcow2.py @@ -26,16 +26,19 @@ from qcow2_format import ( ) =20 =20 +dump_json =3D False + + def cmd_dump_header(fd): h =3D QcowHeader(fd) - h.dump() + h.dump(dump_json) print() - h.dump_extensions() + h.dump_extensions(dump_json) =20 =20 def cmd_dump_header_exts(fd): h =3D QcowHeader(fd) - h.dump_extensions() + h.dump_extensions(dump_json) =20 =20 def cmd_set_header(fd, name, value): @@ -134,6 +137,11 @@ cmds =3D [ =20 =20 def main(filename, cmd, args): + global dump_json + dump_json =3D '-j' in sys.argv + if dump_json: + sys.argv.remove('-j') + args.remove('-j') fd =3D open(filename, "r+b") try: for name, handler, num_args, desc in cmds: @@ -151,11 +159,14 @@ def main(filename, cmd, args): =20 =20 def usage(): - print("Usage: %s [, ...]" % sys.argv[0]) + print("Usage: %s [, ...] [, ...]" % sys.argv[0]) print("") print("Supported commands:") for name, handler, num_args, desc in cmds: print(" %-20s - %s" % (name, desc)) + print("") + print("Supported keys:") + print(" %-20s - %s" % ('-j', 'Dump in JSON format')) =20 =20 if __name__ =3D=3D '__main__': diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index b512f84..dae6b6e 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -110,7 +110,7 @@ class Qcow2Struct(metaclass=3DQcow2StructMeta): self.__dict__ =3D dict((field[2], values[i]) for i, field in enumerate(self.fields)) =20 - def dump(self): + def dump(self, dump_json=3DNone): for f in self.fields: value =3D self.__dict__[f[2]] if isinstance(f[1], str): @@ -141,8 +141,8 @@ class Qcow2BitmapExt(Qcow2Struct): [Qcow2BitmapDirEntry(fd, cluster_size=3Dself.cluster_size) for _ in range(self.nb_bitmaps)] =20 - def dump(self): - super().dump() + def dump(self, dump_json=3DNone): + super().dump(dump_json) for entry in self.bitmap_directory: print() entry.dump() @@ -186,7 +186,7 @@ class Qcow2BitmapDirEntry(Qcow2Struct): self.bitmap_table =3D Qcow2BitmapTable(raw_table=3Dtable, cluster_size=3Dself.cluster_s= ize) =20 - def dump(self): + def dump(self, dump_json=3DNone): print(f'{"Bitmap name":<25} {self.name}') super(Qcow2BitmapDirEntry, self).dump() self.bitmap_table.dump() @@ -294,13 +294,13 @@ class QcowHeaderExtension(Qcow2Struct): else: self.obj =3D None =20 - def dump(self): + def dump(self, dump_json=3DNone): super().dump() =20 if self.obj is None: print(f'{"data":<25} {self.data_str}') else: - self.obj.dump() + self.obj.dump(dump_json) =20 @classmethod def create(cls, magic, data): @@ -399,8 +399,8 @@ class QcowHeader(Qcow2Struct): buf =3D buf[0:header_bytes-1] fd.write(buf) =20 - def dump_extensions(self): + def dump_extensions(self, dump_json=3DNone): for ex in self.extensions: print('Header extension:') - ex.dump() + ex.dump(dump_json) print() --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782494; cv=none; d=zohomail.com; s=zohoarc; b=O1PqEqgQF4cavKNhEt5DCSPb9Qpzj/WJtWd3qbuu7hUlpr1uwhz99p0JUEL7iGNFWyi//RL7uc4wv4C5xDJMpCB2FOQDkEQUJo04beYj/1pBpdbSbm3cxKIKm0WmOCu6SEVGD7V80/+i5bRkR/gVTNAB2KRInXQ9NmNks5trESA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782494; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=jIWg/LG1QfJ2LkF3Vv/klvc0b+TXP2nkEEdbPgRxeeE=; b=hxndL/Pe6YIdQWAWgoYNarAbc4QQer5sjnFrOtDeHz+VdbZ7C7/GmTxSMJ7eksCZXB5AwS5TnMR0I7xHHPW1u8CWWKvJvO5rCjnGxmBHSUlOOvwu3t+YvlLduPNUtOXsxmNwuahdz4IAeBxyPpMTHFWHs6XRad0QxWwismglBBY= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782494761920.803215307948; Fri, 3 Jul 2020 06:21:34 -0700 (PDT) Received: from localhost ([::1]:59256 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLdF-0002V3-6a for importer@patchew.org; Fri, 03 Jul 2020 09:21:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43576) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLW3-0006sS-46; Fri, 03 Jul 2020 09:14:07 -0400 Received: from relay.sw.ru ([185.231.240.75]:60348 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLVv-0007eS-W5; Fri, 03 Jul 2020 09:14:06 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVk-0004Vj-1I; Fri, 03 Jul 2020 16:13:48 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 09/10] qcow2_format.py: collect fields to dump in JSON format Date: Fri, 3 Jul 2020 16:13:49 +0300 Message-Id: <1593782030-521984-10-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" As __dict__ is being extended with class members we do not want to print, make a light copy of the initial __dict__ and extend the copy by adding lists we have to print in the JSON output. Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/qcow2_format.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index dae6b6e..e8eb36f 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -110,6 +110,8 @@ class Qcow2Struct(metaclass=3DQcow2StructMeta): self.__dict__ =3D dict((field[2], values[i]) for i, field in enumerate(self.fields)) =20 + self.fields_dict =3D self.__dict__.copy() + def dump(self, dump_json=3DNone): for f in self.fields: value =3D self.__dict__[f[2]] @@ -140,6 +142,7 @@ class Qcow2BitmapExt(Qcow2Struct): self.bitmap_directory =3D \ [Qcow2BitmapDirEntry(fd, cluster_size=3Dself.cluster_size) for _ in range(self.nb_bitmaps)] + self.fields_dict.update(bitmap_directory=3Dself.bitmap_directory) =20 def dump(self, dump_json=3DNone): super().dump(dump_json) @@ -185,6 +188,7 @@ class Qcow2BitmapDirEntry(Qcow2Struct): table =3D [e[0] for e in struct.iter_unpack('>Q', fd.read(table_si= ze))] self.bitmap_table =3D Qcow2BitmapTable(raw_table=3Dtable, cluster_size=3Dself.cluster_s= ize) + self.fields_dict.update(bitmap_table=3Dself.bitmap_table) =20 def dump(self, dump_json=3DNone): print(f'{"Bitmap name":<25} {self.name}') --=20 1.8.3.1 From nobody Wed May 1 12:52:45 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1593782360; cv=none; d=zohomail.com; s=zohoarc; b=Bo5GnUAG2ME7btwLHF3xr1exAndHlO0mbC8dwfC2bePmexPUZbimagB/OIwxv7CJurgjiv9gcDCaNDCF6uMj5TqiqudO4E9jRUbpI+A5/PWoHONsACkrYfEjmJvUpqXSkpDhTg2MjMCeZqkZ3FzGNTZp43hdm6FW9OdgQCg+6Io= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593782360; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=dA8w9JA1gPk2ZxAj7L+ZYuCC+NbAzX16zJhdReVcIkw=; b=m9JzT8d1wW3AHFvi068FPKOPw7k5PJZJjzObrLBqbTwbHXDjiUyXEZVkVSKJwtoMHeyRq8+Md379Qr6kdsplOdEh7q6DXb8XZisbITytC+rzgAmC/G7bnU/+1YmTKCfFclNbBXmuVEBUyQvGv/WvHh6JOE8d/gTQu53nqK70ylM= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.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 header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1593782360448642.254465601467; Fri, 3 Jul 2020 06:19:20 -0700 (PDT) Received: from localhost ([::1]:50800 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jrLb5-0006aD-3T for importer@patchew.org; Fri, 03 Jul 2020 09:19:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43652) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLWG-0007N2-3F; Fri, 03 Jul 2020 09:14:20 -0400 Received: from relay.sw.ru ([185.231.240.75]:60358 helo=relay3.sw.ru) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jrLWC-0007eW-Uw; Fri, 03 Jul 2020 09:14:19 -0400 Received: from [172.16.25.136] (helo=localhost.sw.ru) by relay3.sw.ru with esmtp (Exim 4.93) (envelope-from ) id 1jrLVk-0004Vj-2Y; Fri, 03 Jul 2020 16:13:48 +0300 From: Andrey Shinkevich To: qemu-block@nongnu.org Subject: [PATCH v8 10/10] qcow2_format.py: support dumping metadata in JSON format Date: Fri, 3 Jul 2020 16:13:50 +0300 Message-Id: <1593782030-521984-11-git-send-email-andrey.shinkevich@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> References: <1593782030-521984-1-git-send-email-andrey.shinkevich@virtuozzo.com> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=185.231.240.75; envelope-from=andrey.shinkevich@virtuozzo.com; helo=relay3.sw.ru X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/03 09:13:53 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Implementation of dumping QCOW2 image metadata. The sample output: { "Header_extensions": [ { "name": "Feature table", "magic": 1745090647, "length": 192, "data_str": "" }, { "name": "Bitmaps", "magic": 595929205, "length": 24, "data": { "nb_bitmaps": 2, "reserved32": 0, "bitmap_directory_size": 64, "bitmap_directory_offset": 1048576, "bitmap_directory": [ { "name": "bitmap-1", "bitmap_table_offset": 589824, "bitmap_table_size": 1, "flags": 2, "type": 1, "granularity_bits": 15, "name_size": 8, "extra_data_size": 0, "bitmap_table": { "entries": [ { "type": "serialized", "offset": 655360 }, ... Suggested-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Andrey Shinkevich --- tests/qemu-iotests/qcow2_format.py | 59 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 59 insertions(+) diff --git a/tests/qemu-iotests/qcow2_format.py b/tests/qemu-iotests/qcow2_= format.py index e8eb36f..70be4a1 100644 --- a/tests/qemu-iotests/qcow2_format.py +++ b/tests/qemu-iotests/qcow2_format.py @@ -19,6 +19,15 @@ =20 import struct import string +import json + + +class ComplexEncoder(json.JSONEncoder): + def default(self, obj): + if hasattr(obj, 'get_fields_dict'): + return obj.get_fields_dict() + else: + return json.JSONEncoder.default(self, obj) =20 =20 class Qcow2Field: @@ -113,6 +122,11 @@ class Qcow2Struct(metaclass=3DQcow2StructMeta): self.fields_dict =3D self.__dict__.copy() =20 def dump(self, dump_json=3DNone): + if dump_json: + print(json.dumps(self.get_fields_dict(), indent=3D4, + cls=3DComplexEncoder)) + return + for f in self.fields: value =3D self.__dict__[f[2]] if isinstance(f[1], str): @@ -150,6 +164,9 @@ class Qcow2BitmapExt(Qcow2Struct): print() entry.dump() =20 + def get_fields_dict(self): + return self.fields_dict + =20 class Qcow2BitmapDirEntry(Qcow2Struct): =20 @@ -195,6 +212,11 @@ class Qcow2BitmapDirEntry(Qcow2Struct): super(Qcow2BitmapDirEntry, self).dump() self.bitmap_table.dump() =20 + def get_fields_dict(self): + bmp_name =3D dict(name=3Dself.name) + bme_dict =3D {**bmp_name, **self.fields_dict} + return bme_dict + =20 class Qcow2BitmapTableEntry: =20 @@ -210,6 +232,9 @@ class Qcow2BitmapTableEntry: else: self.type =3D 'all-zeroes' =20 + def get_fields_dict(self): + return dict(type=3Dself.type, offset=3Dself.offset) + =20 class Qcow2BitmapTable: =20 @@ -226,6 +251,18 @@ class Qcow2BitmapTable: for i, entry in bitmap_table: print(f'{i:<14} {entry.type:<15} {entry.offset:<24} {size}') =20 + def get_fields_dict(self): + return dict(entries=3Dself.entries) + + +class Qcow2HeaderExtensionsDoc: + + def __init__(self, extensions): + self.extensions =3D extensions + + def get_fields_dict(self): + return dict(Header_extensions=3Dself.extensions) + =20 QCOW2_EXT_MAGIC_BITMAPS =3D 0x23852875 =20 @@ -241,6 +278,9 @@ class QcowHeaderExtension(Qcow2Struct): 0x44415441: 'Data file' } =20 + def get_fields_dict(self): + return self.mapping.get(self.value, "") + fields =3D ( ('u32', Magic, 'magic'), ('u32', '{}', 'length') @@ -306,6 +346,16 @@ class QcowHeaderExtension(Qcow2Struct): else: self.obj.dump(dump_json) =20 + def get_fields_dict(self): + ext_name =3D dict(name=3Dself.Magic(self.magic)) + he_dict =3D {**ext_name, **self.fields_dict} + if self.obj is not None: + he_dict.update(data=3Dself.obj) + else: + he_dict.update(data_str=3Dself.data_str) + + return he_dict + @classmethod def create(cls, magic, data): return QcowHeaderExtension(magic, len(data), data) @@ -404,7 +454,16 @@ class QcowHeader(Qcow2Struct): fd.write(buf) =20 def dump_extensions(self, dump_json=3DNone): + if dump_json: + ext_doc =3D Qcow2HeaderExtensionsDoc(self.extensions) + print(json.dumps(ext_doc.get_fields_dict(), indent=3D4, + cls=3DComplexEncoder)) + return + for ex in self.extensions: print('Header extension:') ex.dump(dump_json) print() + + def get_fields_dict(self): + return self.fields_dict --=20 1.8.3.1