diff mbox series

[v2,02/21] iotests/qcow2.py: Split feature fields into bits

Message ID 20191015142729.18123-3-mreitz@redhat.com (mailing list archive)
State New, archived
Headers show
Series iotests: Allow ./check -o data_file | expand

Commit Message

Max Reitz Oct. 15, 2019, 2:27 p.m. UTC
Print the feature fields as a set of bits so that filtering is easier.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 tests/qemu-iotests/031.out  | 36 +++++++++----------
 tests/qemu-iotests/036.out  | 18 +++++-----
 tests/qemu-iotests/039.out  | 22 ++++++------
 tests/qemu-iotests/060.out  | 20 +++++------
 tests/qemu-iotests/061.out  | 72 ++++++++++++++++++-------------------
 tests/qemu-iotests/137.out  |  2 +-
 tests/qemu-iotests/qcow2.py | 18 +++++++---
 7 files changed, 99 insertions(+), 89 deletions(-)

Comments

Maxim Levitsky Nov. 6, 2019, 3:37 p.m. UTC | #1
On Tue, 2019-10-15 at 16:27 +0200, Max Reitz wrote:
> Print the feature fields as a set of bits so that filtering is easier.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  tests/qemu-iotests/031.out  | 36 +++++++++----------
>  tests/qemu-iotests/036.out  | 18 +++++-----
>  tests/qemu-iotests/039.out  | 22 ++++++------
>  tests/qemu-iotests/060.out  | 20 +++++------
>  tests/qemu-iotests/061.out  | 72 ++++++++++++++++++-------------------
>  tests/qemu-iotests/137.out  |  2 +-
>  tests/qemu-iotests/qcow2.py | 18 +++++++---
>  7 files changed, 99 insertions(+), 89 deletions(-)
> 
> diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out
> index 68a74d03b9..d535e407bc 100644
> --- a/tests/qemu-iotests/031.out
> +++ b/tests/qemu-iotests/031.out
> @@ -18,9 +18,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -46,9 +46,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -74,9 +74,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -109,9 +109,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -142,9 +142,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -175,9 +175,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
> index e489b44386..15229a9604 100644
> --- a/tests/qemu-iotests/036.out
> +++ b/tests/qemu-iotests/036.out
> @@ -16,9 +16,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x8000000000000000
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     [63]
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -50,9 +50,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x8000000000000000
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        [63]
>  refcount_order            4
>  header_length             104
>  
> @@ -78,9 +78,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> diff --git a/tests/qemu-iotests/039.out b/tests/qemu-iotests/039.out
> index 2e356d51b6..bdafa3ace3 100644
> --- a/tests/qemu-iotests/039.out
> +++ b/tests/qemu-iotests/039.out
> @@ -4,7 +4,7 @@ QA output created by 039
>  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -incompatible_features     0x0
> +incompatible_features     []
>  No errors were found on the image.
>  
>  == Creating a dirty image file ==
> @@ -12,7 +12,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
> -incompatible_features     0x1
> +incompatible_features     [0]
>  ERROR cluster 5 refcount=0 reference=1
>  ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
>  
> @@ -22,7 +22,7 @@ Data may be corrupted, or further writes to the image may corrupt it.
>  == Read-only access must still work ==
>  read 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -incompatible_features     0x1
> +incompatible_features     [0]
>  
>  == Repairing the image file must succeed ==
>  ERROR cluster 5 refcount=0 reference=1
> @@ -36,7 +36,7 @@ The following inconsistencies were found and repaired:
>  
>  Double checking the fixed image now...
>  No errors were found on the image.
> -incompatible_features     0x0
> +incompatible_features     []
>  
>  == Data should still be accessible after repair ==
>  read 512/512 bytes at offset 0
> @@ -47,21 +47,21 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
> -incompatible_features     0x1
> +incompatible_features     [0]
>  ERROR cluster 5 refcount=0 reference=1
>  Rebuilding refcount structure
>  Repairing cluster 1 refcount=1 reference=0
>  Repairing cluster 2 refcount=1 reference=0
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -incompatible_features     0x0
> +incompatible_features     []
>  
>  == Creating an image file with lazy_refcounts=off ==
>  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
> -incompatible_features     0x0
> +incompatible_features     []
>  No errors were found on the image.
>  
>  == Committing to a backing file with lazy_refcounts=on ==
> @@ -70,8 +70,8 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  Image committed.
> -incompatible_features     0x0
> -incompatible_features     0x0
> +incompatible_features     []
> +incompatible_features     []
>  No errors were found on the image.
>  No errors were found on the image.
>  
> @@ -80,7 +80,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
> -incompatible_features     0x1
> +incompatible_features     [0]
>  ERROR cluster 5 refcount=0 reference=1
>  ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
>  
> @@ -90,6 +90,6 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
> -incompatible_features     0x0
> +incompatible_features     []
>  No errors were found on the image.
>  *** done
> diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
> index 0f6b0658a1..d27692a33c 100644
> --- a/tests/qemu-iotests/060.out
> +++ b/tests/qemu-iotests/060.out
> @@ -7,10 +7,10 @@ ERROR cluster 3 refcount=1 reference=3
>  
>  1 errors were found on the image.
>  Data may be corrupted, or further writes to the image may corrupt it.
> -incompatible_features     0x0
> +incompatible_features     []
>  qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with active L1 table); further corruption events will be suppressed
>  write failed: Input/output error
> -incompatible_features     0x2
> +incompatible_features     [1]
>  image: TEST_DIR/t.IMGFMT
>  file format: IMGFMT
>  virtual size: 64 MiB (67108864 bytes)
> @@ -33,10 +33,10 @@ ERROR cluster 2 refcount=1 reference=2
>  
>  2 errors were found on the image.
>  Data may be corrupted, or further writes to the image may corrupt it.
> -incompatible_features     0x0
> +incompatible_features     []
>  qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount block); further corruption events will be suppressed
>  write failed: Input/output error
> -incompatible_features     0x2
> +incompatible_features     [1]
>  ERROR refcount block 0 refcount=2
>  ERROR cluster 2 refcount=1 reference=2
>  Rebuilding refcount structure
> @@ -49,10 +49,10 @@ The following inconsistencies were found and repaired:
>  
>  Double checking the fixed image now...
>  No errors were found on the image.
> -incompatible_features     0x0
> +incompatible_features     []
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -incompatible_features     0x0
> +incompatible_features     []
>  
>  === Testing cluster data reference into inactive L2 table ===
>  
> @@ -69,10 +69,10 @@ Data may be corrupted, or further writes to the image may corrupt it.
>  
>  1 leaked clusters were found on the image.
>  This means waste of disk space, but no harm to data.
> -incompatible_features     0x0
> +incompatible_features     []
>  qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with inactive L2 table); further corruption events will be suppressed
>  write failed: Input/output error
> -incompatible_features     0x2
> +incompatible_features     [1]
>  ERROR cluster 4 refcount=1 reference=2
>  Leaked cluster 9 refcount=1 reference=0
>  Repairing cluster 4 refcount=1 reference=2
> @@ -85,10 +85,10 @@ The following inconsistencies were found and repaired:
>  
>  Double checking the fixed image now...
>  No errors were found on the image.
> -incompatible_features     0x0
> +incompatible_features     []
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -incompatible_features     0x0
> +incompatible_features     []
>  read 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  No errors were found on the image.
> diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
> index d6a7c2af95..8b3091a412 100644
> --- a/tests/qemu-iotests/061.out
> +++ b/tests/qemu-iotests/061.out
> @@ -18,9 +18,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x1
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       [0]
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -42,9 +42,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -76,9 +76,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x1
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       [0]
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -100,9 +100,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -132,9 +132,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x1
> -compatible_features       0x1
> -autoclear_features        0x0
> +incompatible_features     [0]
> +compatible_features       [0]
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -161,9 +161,9 @@ refcount_table_offset     0x80000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -187,9 +187,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x40000000000
> -autoclear_features        0x40000000000
> +incompatible_features     []
> +compatible_features       [42]
> +autoclear_features        [42]
>  refcount_order            4
>  header_length             104
>  
> @@ -211,9 +211,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -237,9 +237,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             72
>  
> @@ -256,9 +256,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x1
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       [0]
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -290,9 +290,9 @@ refcount_table_offset     0x10000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x1
> -compatible_features       0x1
> -autoclear_features        0x0
> +incompatible_features     [0]
> +compatible_features       [0]
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> @@ -319,9 +319,9 @@ refcount_table_offset     0x80000
>  refcount_table_clusters   1
>  nb_snapshots              0
>  snapshot_offset           0x0
> -incompatible_features     0x0
> -compatible_features       0x0
> -autoclear_features        0x0
> +incompatible_features     []
> +compatible_features       []
> +autoclear_features        []
>  refcount_order            4
>  header_length             104
>  
> diff --git a/tests/qemu-iotests/137.out b/tests/qemu-iotests/137.out
> index 1c6569eb2c..bd4523a853 100644
> --- a/tests/qemu-iotests/137.out
> +++ b/tests/qemu-iotests/137.out
> @@ -36,7 +36,7 @@ qemu-io: Unsupported value 'blubb' for qcow2 option 'overlap-check'. Allowed are
>  wrote 512/512 bytes at offset 0
>  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
> -incompatible_features     0x0
> +incompatible_features     []
>  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
>  wrote 65536/65536 bytes at offset 0
>  64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py
> index d813b4fc81..91e4420b9f 100755
> --- a/tests/qemu-iotests/qcow2.py
> +++ b/tests/qemu-iotests/qcow2.py
> @@ -42,9 +42,9 @@ class QcowHeader:
>          [ uint64_t, '%#x',  'snapshot_offset' ],
>  
>          # Version 3 header fields
> -        [ uint64_t, '%#x',  'incompatible_features' ],
> -        [ uint64_t, '%#x',  'compatible_features' ],
> -        [ uint64_t, '%#x',  'autoclear_features' ],
> +        [ uint64_t, 'mask', 'incompatible_features' ],
> +        [ uint64_t, 'mask', 'compatible_features' ],
> +        [ uint64_t, 'mask', 'autoclear_features' ],
>          [ uint32_t, '%d',   'refcount_order' ],
>          [ uint32_t, '%d',   'header_length' ],
>      ];
> @@ -130,7 +130,17 @@ class QcowHeader:
>  
>      def dump(self):
>          for f in QcowHeader.fields:
> -            print("%-25s" % f[2], f[1] % self.__dict__[f[2]])
> +            value = self.__dict__[f[2]]
> +            if f[1] == 'mask':
> +                bits = []
> +                for bit in range(64):

Very very minor nitpick, the type size (64 bit) is hardcoded here
but I think it is OK.

> +                    if value & (1 << bit):
> +                        bits.append(bit)
> +                value_str = str(bits)
> +            else:
> +                value_str = f[1] % value
> +
> +            print("%-25s" % f[2], value_str)
>          print("")
>  
>      def dump_extensions(self):


This is  very good idea and implementation.
Thanks!

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>

Best regards,
	Maxim Levitsky
diff mbox series

Patch

diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out
index 68a74d03b9..d535e407bc 100644
--- a/tests/qemu-iotests/031.out
+++ b/tests/qemu-iotests/031.out
@@ -18,9 +18,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -46,9 +46,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -74,9 +74,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -109,9 +109,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -142,9 +142,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -175,9 +175,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             104
 
diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
index e489b44386..15229a9604 100644
--- a/tests/qemu-iotests/036.out
+++ b/tests/qemu-iotests/036.out
@@ -16,9 +16,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x8000000000000000
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     [63]
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -50,9 +50,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x8000000000000000
+incompatible_features     []
+compatible_features       []
+autoclear_features        [63]
 refcount_order            4
 header_length             104
 
@@ -78,9 +78,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             104
 
diff --git a/tests/qemu-iotests/039.out b/tests/qemu-iotests/039.out
index 2e356d51b6..bdafa3ace3 100644
--- a/tests/qemu-iotests/039.out
+++ b/tests/qemu-iotests/039.out
@@ -4,7 +4,7 @@  QA output created by 039
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-incompatible_features     0x0
+incompatible_features     []
 No errors were found on the image.
 
 == Creating a dirty image file ==
@@ -12,7 +12,7 @@  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
-incompatible_features     0x1
+incompatible_features     [0]
 ERROR cluster 5 refcount=0 reference=1
 ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
 
@@ -22,7 +22,7 @@  Data may be corrupted, or further writes to the image may corrupt it.
 == Read-only access must still work ==
 read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-incompatible_features     0x1
+incompatible_features     [0]
 
 == Repairing the image file must succeed ==
 ERROR cluster 5 refcount=0 reference=1
@@ -36,7 +36,7 @@  The following inconsistencies were found and repaired:
 
 Double checking the fixed image now...
 No errors were found on the image.
-incompatible_features     0x0
+incompatible_features     []
 
 == Data should still be accessible after repair ==
 read 512/512 bytes at offset 0
@@ -47,21 +47,21 @@  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
-incompatible_features     0x1
+incompatible_features     [0]
 ERROR cluster 5 refcount=0 reference=1
 Rebuilding refcount structure
 Repairing cluster 1 refcount=1 reference=0
 Repairing cluster 2 refcount=1 reference=0
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-incompatible_features     0x0
+incompatible_features     []
 
 == Creating an image file with lazy_refcounts=off ==
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
-incompatible_features     0x0
+incompatible_features     []
 No errors were found on the image.
 
 == Committing to a backing file with lazy_refcounts=on ==
@@ -70,8 +70,8 @@  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 Image committed.
-incompatible_features     0x0
-incompatible_features     0x0
+incompatible_features     []
+incompatible_features     []
 No errors were found on the image.
 No errors were found on the image.
 
@@ -80,7 +80,7 @@  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
-incompatible_features     0x1
+incompatible_features     [0]
 ERROR cluster 5 refcount=0 reference=1
 ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
 
@@ -90,6 +90,6 @@  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
-incompatible_features     0x0
+incompatible_features     []
 No errors were found on the image.
 *** done
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
index 0f6b0658a1..d27692a33c 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -7,10 +7,10 @@  ERROR cluster 3 refcount=1 reference=3
 
 1 errors were found on the image.
 Data may be corrupted, or further writes to the image may corrupt it.
-incompatible_features     0x0
+incompatible_features     []
 qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with active L1 table); further corruption events will be suppressed
 write failed: Input/output error
-incompatible_features     0x2
+incompatible_features     [1]
 image: TEST_DIR/t.IMGFMT
 file format: IMGFMT
 virtual size: 64 MiB (67108864 bytes)
@@ -33,10 +33,10 @@  ERROR cluster 2 refcount=1 reference=2
 
 2 errors were found on the image.
 Data may be corrupted, or further writes to the image may corrupt it.
-incompatible_features     0x0
+incompatible_features     []
 qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount block); further corruption events will be suppressed
 write failed: Input/output error
-incompatible_features     0x2
+incompatible_features     [1]
 ERROR refcount block 0 refcount=2
 ERROR cluster 2 refcount=1 reference=2
 Rebuilding refcount structure
@@ -49,10 +49,10 @@  The following inconsistencies were found and repaired:
 
 Double checking the fixed image now...
 No errors were found on the image.
-incompatible_features     0x0
+incompatible_features     []
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-incompatible_features     0x0
+incompatible_features     []
 
 === Testing cluster data reference into inactive L2 table ===
 
@@ -69,10 +69,10 @@  Data may be corrupted, or further writes to the image may corrupt it.
 
 1 leaked clusters were found on the image.
 This means waste of disk space, but no harm to data.
-incompatible_features     0x0
+incompatible_features     []
 qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with inactive L2 table); further corruption events will be suppressed
 write failed: Input/output error
-incompatible_features     0x2
+incompatible_features     [1]
 ERROR cluster 4 refcount=1 reference=2
 Leaked cluster 9 refcount=1 reference=0
 Repairing cluster 4 refcount=1 reference=2
@@ -85,10 +85,10 @@  The following inconsistencies were found and repaired:
 
 Double checking the fixed image now...
 No errors were found on the image.
-incompatible_features     0x0
+incompatible_features     []
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-incompatible_features     0x0
+incompatible_features     []
 read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 No errors were found on the image.
diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
index d6a7c2af95..8b3091a412 100644
--- a/tests/qemu-iotests/061.out
+++ b/tests/qemu-iotests/061.out
@@ -18,9 +18,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x1
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       [0]
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -42,9 +42,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -76,9 +76,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x1
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       [0]
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -100,9 +100,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -132,9 +132,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x1
-compatible_features       0x1
-autoclear_features        0x0
+incompatible_features     [0]
+compatible_features       [0]
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -161,9 +161,9 @@  refcount_table_offset     0x80000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -187,9 +187,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x40000000000
-autoclear_features        0x40000000000
+incompatible_features     []
+compatible_features       [42]
+autoclear_features        [42]
 refcount_order            4
 header_length             104
 
@@ -211,9 +211,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -237,9 +237,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             72
 
@@ -256,9 +256,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x1
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       [0]
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -290,9 +290,9 @@  refcount_table_offset     0x10000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x1
-compatible_features       0x1
-autoclear_features        0x0
+incompatible_features     [0]
+compatible_features       [0]
+autoclear_features        []
 refcount_order            4
 header_length             104
 
@@ -319,9 +319,9 @@  refcount_table_offset     0x80000
 refcount_table_clusters   1
 nb_snapshots              0
 snapshot_offset           0x0
-incompatible_features     0x0
-compatible_features       0x0
-autoclear_features        0x0
+incompatible_features     []
+compatible_features       []
+autoclear_features        []
 refcount_order            4
 header_length             104
 
diff --git a/tests/qemu-iotests/137.out b/tests/qemu-iotests/137.out
index 1c6569eb2c..bd4523a853 100644
--- a/tests/qemu-iotests/137.out
+++ b/tests/qemu-iotests/137.out
@@ -36,7 +36,7 @@  qemu-io: Unsupported value 'blubb' for qcow2 option 'overlap-check'. Allowed are
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 ./common.rc: Killed                  ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
-incompatible_features     0x0
+incompatible_features     []
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
 wrote 65536/65536 bytes at offset 0
 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py
index d813b4fc81..91e4420b9f 100755
--- a/tests/qemu-iotests/qcow2.py
+++ b/tests/qemu-iotests/qcow2.py
@@ -42,9 +42,9 @@  class QcowHeader:
         [ uint64_t, '%#x',  'snapshot_offset' ],
 
         # Version 3 header fields
-        [ uint64_t, '%#x',  'incompatible_features' ],
-        [ uint64_t, '%#x',  'compatible_features' ],
-        [ uint64_t, '%#x',  'autoclear_features' ],
+        [ uint64_t, 'mask', 'incompatible_features' ],
+        [ uint64_t, 'mask', 'compatible_features' ],
+        [ uint64_t, 'mask', 'autoclear_features' ],
         [ uint32_t, '%d',   'refcount_order' ],
         [ uint32_t, '%d',   'header_length' ],
     ];
@@ -130,7 +130,17 @@  class QcowHeader:
 
     def dump(self):
         for f in QcowHeader.fields:
-            print("%-25s" % f[2], f[1] % self.__dict__[f[2]])
+            value = self.__dict__[f[2]]
+            if f[1] == 'mask':
+                bits = []
+                for bit in range(64):
+                    if value & (1 << bit):
+                        bits.append(bit)
+                value_str = str(bits)
+            else:
+                value_str = f[1] % value
+
+            print("%-25s" % f[2], value_str)
         print("")
 
     def dump_extensions(self):