mirror of https://github.com/xemu-project/xemu.git
qcow2_format.py: pass cluster size to substructures
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 <andrey.shinkevich@virtuozzo.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <1596742557-320265-7-git-send-email-andrey.shinkevich@virtuozzo.com> Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
1117393195
commit
e3f5aad7be
|
@ -129,19 +129,21 @@ class Qcow2BitmapExt(Qcow2Struct):
|
|||
('u64', '{:#x}', 'bitmap_directory_offset')
|
||||
)
|
||||
|
||||
def __init__(self, fd):
|
||||
def __init__(self, fd, cluster_size):
|
||||
super().__init__(fd=fd)
|
||||
tail = struct.calcsize(self.fmt) % 8
|
||||
if tail:
|
||||
fd.seek(8 - tail, 1)
|
||||
position = fd.tell()
|
||||
self.cluster_size = cluster_size
|
||||
self.read_bitmap_directory(fd)
|
||||
fd.seek(position)
|
||||
|
||||
def read_bitmap_directory(self, fd):
|
||||
fd.seek(self.bitmap_directory_offset)
|
||||
self.bitmap_directory = \
|
||||
[Qcow2BitmapDirEntry(fd) for _ in range(self.nb_bitmaps)]
|
||||
[Qcow2BitmapDirEntry(fd, cluster_size=self.cluster_size)
|
||||
for _ in range(self.nb_bitmaps)]
|
||||
|
||||
def dump(self):
|
||||
super().dump()
|
||||
|
@ -162,8 +164,9 @@ class Qcow2BitmapDirEntry(Qcow2Struct):
|
|||
('u32', '{}', 'extra_data_size')
|
||||
)
|
||||
|
||||
def __init__(self, fd):
|
||||
def __init__(self, fd, cluster_size):
|
||||
super().__init__(fd=fd)
|
||||
self.cluster_size = cluster_size
|
||||
# Seek relative to the current position in the file
|
||||
fd.seek(self.extra_data_size, 1)
|
||||
bitmap_name = fd.read(self.name_size)
|
||||
|
@ -203,11 +206,13 @@ class QcowHeaderExtension(Qcow2Struct):
|
|||
# then padding to next multiply of 8
|
||||
)
|
||||
|
||||
def __init__(self, magic=None, length=None, data=None, fd=None):
|
||||
def __init__(self, magic=None, length=None, data=None, fd=None,
|
||||
cluster_size=None):
|
||||
"""
|
||||
Support both loading from fd and creation from user data.
|
||||
For fd-based creation current position in a file will be used to read
|
||||
the data.
|
||||
The cluster_size value may be obtained by dependent structures.
|
||||
|
||||
This should be somehow refactored and functionality should be moved to
|
||||
superclass (to allow creation of any qcow2 struct), but then, fields
|
||||
|
@ -230,7 +235,7 @@ class QcowHeaderExtension(Qcow2Struct):
|
|||
assert all(v is None for v in (magic, length, data))
|
||||
super().__init__(fd=fd)
|
||||
if self.magic == QCOW2_EXT_MAGIC_BITMAPS:
|
||||
self.obj = Qcow2BitmapExt(fd=fd)
|
||||
self.obj = Qcow2BitmapExt(fd=fd, cluster_size=cluster_size)
|
||||
self.data = None
|
||||
else:
|
||||
padded = (self.length + 7) & ~7
|
||||
|
@ -319,7 +324,7 @@ class QcowHeader(Qcow2Struct):
|
|||
end = self.cluster_size
|
||||
|
||||
while fd.tell() < end:
|
||||
ext = QcowHeaderExtension(fd=fd)
|
||||
ext = QcowHeaderExtension(fd=fd, cluster_size=self.cluster_size)
|
||||
if ext.magic == 0:
|
||||
break
|
||||
else:
|
||||
|
|
Loading…
Reference in New Issue