[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 5/8] qcow2_format.py: Dump bitmap table serialized entries
From: |
Andrey Shinkevich |
Subject: |
[PATCH v6 5/8] qcow2_format.py: Dump bitmap table serialized entries |
Date: |
Fri, 12 Jun 2020 00:19:17 +0300 |
Add bitmap table information to the QCOW2 metadata dump.
Bitmap name bitmap-1
...
Bitmap table type offset size
0 serialized 0xa0000 65536
1 all-zeroes 0x0 65536
2 all-zeroes 0x0 65536
3 all-zeroes 0x0 65536
4 all-zeroes 0x0 65536
5 all-zeroes 0x0 65536
6 all-zeroes 0x0 65536
7 all-zeroes 0x0 65536
Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
tests/qemu-iotests/qcow2_format.py | 42 ++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/tests/qemu-iotests/qcow2_format.py
b/tests/qemu-iotests/qcow2_format.py
index 6589f68..2e7c058 100644
--- a/tests/qemu-iotests/qcow2_format.py
+++ b/tests/qemu-iotests/qcow2_format.py
@@ -137,6 +137,9 @@ class Qcow2BitmapExt(Qcow2Struct):
shift = ((entry_raw_size + 7) & ~7) - entry_raw_size
fd.seek(shift, FROM_CURRENT)
+ for bm in self.bitmaps:
+ bm.read_bitmap_table(fd)
+
def load(self, fd):
self.read_bitmap_directory(fd)
@@ -181,6 +184,12 @@ class Qcow2BitmapDirEntry(Qcow2Struct):
return struct.calcsize(self.fmt) + self.name_size + \
self.extra_data_size
+ def read_bitmap_table(self, fd):
+ fd.seek(self.bitmap_table_offset)
+ table_size = self.bitmap_table_bytes * struct.calcsize('Q')
+ table = [e[0] for e in struct.iter_unpack('>Q', fd.read(table_size))]
+ self.bitmap_table = Qcow2BitmapTable(table)
+
def dump_bitmap_dir_entry(self):
print()
print(f'{"Bitmap name":<25} {self.name}')
@@ -188,6 +197,39 @@ class Qcow2BitmapDirEntry(Qcow2Struct):
print(f'{"flag":<25} {fl}')
print(f'{"table size ":<25} {self.bitmap_table_bytes} {"(bytes)"}')
super().dump()
+ self.bitmap_table.print_bitmap_table(self.cluster_size)
+
+
+class Qcow2BitmapTableEntry:
+
+ BME_TABLE_ENTRY_OFFSET_MASK = 0x00fffffffffffe00
+ BME_TABLE_ENTRY_FLAG_ALL_ONES = 1
+ bmte_type = ['all-zeroes', 'all-ones', 'serialized']
+
+ def __init__(self, entry):
+ self.offset = entry & self.BME_TABLE_ENTRY_OFFSET_MASK
+ if self.offset:
+ self.type = 'serialized'
+ elif entry & self.BME_TABLE_ENTRY_FLAG_ALL_ONES:
+ self.type = 'all-ones'
+ else:
+ self.type = 'all-zeroes'
+
+
+class Qcow2BitmapTable:
+
+ def __init__(self, raw_table):
+ self.entries = []
+ for entry in raw_table:
+ self.entries.append(Qcow2BitmapTableEntry(entry))
+
+ def print_bitmap_table(self, cluster_size):
+ bitmap_table = enumerate(self.entries)
+ print("Bitmap table\ttype\t\toffset\t\tsize")
+ for i, entry in bitmap_table:
+ print("\t%-4d\t%s\t%#x\t\t%d" % (i, entry.type, entry.offset,
+ cluster_size))
+ print("")
QCOW2_EXT_MAGIC_BITMAPS = 0x23852875
--
1.8.3.1
- [PATCH v6 0/8] iotests: Dump QCOW2 dirty bitmaps metadata, Andrey Shinkevich, 2020/06/11
- [PATCH v6 2/8] qcow2_format.py: make printable data an extension class member, Andrey Shinkevich, 2020/06/11
- [PATCH v6 3/8] qcow2_format.py: Dump bitmap directory info, Andrey Shinkevich, 2020/06/11
- [PATCH v6 4/8] qcow2_format.py: pass cluster size to substructures, Andrey Shinkevich, 2020/06/11
- [PATCH v6 7/8] qcow2_format.py: collect fields to dump in JSON format, Andrey Shinkevich, 2020/06/11
- [PATCH v6 5/8] qcow2_format.py: Dump bitmap table serialized entries,
Andrey Shinkevich <=
- [PATCH v6 6/8] qcow2.py: Introduce '-j' key to dump in JSON format, Andrey Shinkevich, 2020/06/11
- [PATCH v6 8/8] qcow2_format.py: support dumping metadata in JSON format, Andrey Shinkevich, 2020/06/11
- [PATCH v6 1/8] qcow2: Fix capitalization of header extension constant., Andrey Shinkevich, 2020/06/11