diff options
-rwxr-xr-x | tests/qemu-iotests/031 | 44 | ||||
-rw-r--r-- | tests/qemu-iotests/031.out | 130 | ||||
-rwxr-xr-x | tests/qemu-iotests/qcow2.py | 24 |
3 files changed, 172 insertions, 26 deletions
diff --git a/tests/qemu-iotests/031 b/tests/qemu-iotests/031 index 6365f287e0..2d5e3b12d1 100755 --- a/tests/qemu-iotests/031 +++ b/tests/qemu-iotests/031 @@ -45,26 +45,34 @@ _supported_proto generic _supported_os Linux CLUSTER_SIZE=65536 -echo -echo === Create image with unknown header extension === -echo -_make_test_img 64M -./qcow2.py $TEST_IMG add-header-ext 0x12345678 "This is a test header extension" -./qcow2.py $TEST_IMG dump-header -_check_test_img -echo -echo === Rewrite header with no backing file === -echo -$QEMU_IMG rebase -u -b "" $TEST_IMG -./qcow2.py $TEST_IMG dump-header -_check_test_img +# qcow2.py output depends on the exact options used, so override the command +# line here as an exception +for IMGOPTS in "compat=0.10" "compat=1.1"; do -echo -echo === Add a backing file and format === -echo -$QEMU_IMG rebase -u -b "/some/backing/file/path" -F host_device $TEST_IMG -./qcow2.py $TEST_IMG dump-header + echo + echo ===== Testing with -o $IMGOPTS ===== + echo + echo === Create image with unknown header extension === + echo + _make_test_img 64M + ./qcow2.py $TEST_IMG add-header-ext 0x12345678 "This is a test header extension" + ./qcow2.py $TEST_IMG dump-header + _check_test_img + + echo + echo === Rewrite header with no backing file === + echo + $QEMU_IMG rebase -u -b "" $TEST_IMG + ./qcow2.py $TEST_IMG dump-header + _check_test_img + + echo + echo === Add a backing file and format === + echo + $QEMU_IMG rebase -u -b "/some/backing/file/path" -F host_device $TEST_IMG + ./qcow2.py $TEST_IMG dump-header +done # success, all done echo "*** done" diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out index e1a536ec00..d3cab301d4 100644 --- a/tests/qemu-iotests/031.out +++ b/tests/qemu-iotests/031.out @@ -1,5 +1,7 @@ QA output created by 031 +===== Testing with -o compat=0.10 ===== + === Create image with unknown header extension === Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 @@ -16,6 +18,11 @@ refcount_table_offset 0x10000 refcount_table_clusters 1 nb_snapshots 0 snapshot_offset 0x0 +incompatible_features 0x0 +compatible_features 0x0 +autoclear_features 0x0 +refcount_order 4 +header_length 72 Header extension: magic 0x12345678 @@ -39,6 +46,16 @@ refcount_table_offset 0x10000 refcount_table_clusters 1 nb_snapshots 0 snapshot_offset 0x0 +incompatible_features 0x0 +compatible_features 0x0 +autoclear_features 0x0 +refcount_order 4 +header_length 72 + +Header extension: +magic 0x6803f857 +length 0 +data '' Header extension: magic 0x12345678 @@ -51,7 +68,108 @@ No errors were found on the image. magic 0x514649fb version 2 -backing_file_offset 0x90 +backing_file_offset 0x98 +backing_file_size 0x17 +cluster_bits 16 +size 67108864 +crypt_method 0 +l1_size 1 +l1_table_offset 0x30000 +refcount_table_offset 0x10000 +refcount_table_clusters 1 +nb_snapshots 0 +snapshot_offset 0x0 +incompatible_features 0x0 +compatible_features 0x0 +autoclear_features 0x0 +refcount_order 4 +header_length 72 + +Header extension: +magic 0xe2792aca +length 11 +data 'host_device' + +Header extension: +magic 0x6803f857 +length 0 +data '' + +Header extension: +magic 0x12345678 +length 31 +data 'This is a test header extension' + + +===== Testing with -o compat=1.1 ===== + +=== Create image with unknown header extension === + +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 +magic 0x514649fb +version 3 +backing_file_offset 0x0 +backing_file_size 0x0 +cluster_bits 16 +size 67108864 +crypt_method 0 +l1_size 1 +l1_table_offset 0x30000 +refcount_table_offset 0x10000 +refcount_table_clusters 1 +nb_snapshots 0 +snapshot_offset 0x0 +incompatible_features 0x0 +compatible_features 0x0 +autoclear_features 0x0 +refcount_order 4 +header_length 104 + +Header extension: +magic 0x12345678 +length 31 +data 'This is a test header extension' + +No errors were found on the image. + +=== Rewrite header with no backing file === + +magic 0x514649fb +version 3 +backing_file_offset 0x0 +backing_file_size 0x0 +cluster_bits 16 +size 67108864 +crypt_method 0 +l1_size 1 +l1_table_offset 0x30000 +refcount_table_offset 0x10000 +refcount_table_clusters 1 +nb_snapshots 0 +snapshot_offset 0x0 +incompatible_features 0x0 +compatible_features 0x0 +autoclear_features 0x0 +refcount_order 4 +header_length 104 + +Header extension: +magic 0x6803f857 +length 0 +data '' + +Header extension: +magic 0x12345678 +length 31 +data 'This is a test header extension' + +No errors were found on the image. + +=== Add a backing file and format === + +magic 0x514649fb +version 3 +backing_file_offset 0xb8 backing_file_size 0x17 cluster_bits 16 size 67108864 @@ -62,6 +180,11 @@ refcount_table_offset 0x10000 refcount_table_clusters 1 nb_snapshots 0 snapshot_offset 0x0 +incompatible_features 0x0 +compatible_features 0x0 +autoclear_features 0x0 +refcount_order 4 +header_length 104 Header extension: magic 0xe2792aca @@ -69,6 +192,11 @@ length 11 data 'host_device' Header extension: +magic 0x6803f857 +length 0 +data '' + +Header extension: magic 0x12345678 length 31 data 'This is a test header extension' diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py index bfb47e88fc..e27196aa26 100755 --- a/tests/qemu-iotests/qcow2.py +++ b/tests/qemu-iotests/qcow2.py @@ -35,6 +35,13 @@ class QcowHeader: [ uint32_t, '%d', 'refcount_table_clusters' ], [ uint32_t, '%d', 'nb_snapshots' ], [ uint64_t, '%#x', 'snapshot_offset' ], + + # Version 3 header fields + [ uint64_t, '%#x', 'incompatible_features' ], + [ uint64_t, '%#x', 'compatible_features' ], + [ uint64_t, '%#x', 'autoclear_features' ], + [ uint32_t, '%d', 'refcount_order' ], + [ uint32_t, '%d', 'header_length' ], ]; fmt = '>' + ''.join(field[0] for field in fields) @@ -50,9 +57,10 @@ class QcowHeader: self.__dict__ = dict((field[2], header[i]) for i, field in enumerate(QcowHeader.fields)) + self.set_defaults() self.cluster_size = 1 << self.cluster_bits - fd.seek(self.get_header_length()) + fd.seek(self.header_length) self.load_extensions(fd) if self.backing_file_offset: @@ -61,11 +69,13 @@ class QcowHeader: else: self.backing_file = None - def get_header_length(self): + def set_defaults(self): if self.version == 2: - return 72 - else: - raise Exception("version != 2 not supported") + self.incompatible_features = 0 + self.compatible_features = 0 + self.autoclear_features = 0 + self.refcount_order = 4 + self.header_length = 72 def load_extensions(self, fd): self.extensions = [] @@ -86,7 +96,7 @@ class QcowHeader: def update_extensions(self, fd): - fd.seek(self.get_header_length()) + fd.seek(self.header_length) extensions = self.extensions extensions.append(QcowHeaderExtension(0, 0, "")) for ex in extensions: @@ -103,7 +113,7 @@ class QcowHeader: def update(self, fd): - header_bytes = self.get_header_length() + header_bytes = self.header_length self.update_extensions(fd) |