qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 2/1] qemu-img: Add "backing":true to unallocated map segments


From: Eric Blake
Subject: [PATCH v2 2/1] qemu-img: Add "backing":true to unallocated map segments
Date: Fri, 11 Jun 2021 14:03:16 -0500

To save the user from having to check 'qemu-img info --backing-chain'
or other followup command to determine which "depth":n goes beyond the
chain, add a boolean field "backing" that is set only for unallocated
portions of the disk.

Signed-off-by: Eric Blake <eblake@redhat.com>
---

Touches the same iotest output as 1/1.  If we decide that switching to
"depth":n+1 is too risky, and that the mere addition of "backing":true
while keeping "depth":n is good enough, then we'd have just one patch,
instead of this double churn.  Preferences?

 docs/tools/qemu-img.rst    |  3 ++
 qapi/block-core.json       |  7 ++-
 qemu-img.c                 | 15 +++++-
 tests/qemu-iotests/122.out | 34 +++++++-------
 tests/qemu-iotests/154.out | 96 +++++++++++++++++++-------------------
 tests/qemu-iotests/179.out | 66 +++++++++++++-------------
 tests/qemu-iotests/223.out | 24 +++++-----
 tests/qemu-iotests/244.out |  6 +--
 tests/qemu-iotests/252.out |  4 +-
 tests/qemu-iotests/274.out | 16 +++----
 tests/qemu-iotests/291.out |  8 ++--
 tests/qemu-iotests/309.out |  4 +-
 12 files changed, 150 insertions(+), 133 deletions(-)

diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
index c155b1bf3cc8..fbc623b645c3 100644
--- a/docs/tools/qemu-img.rst
+++ b/docs/tools/qemu-img.rst
@@ -601,6 +601,9 @@ Command description:
     a ``depth``; for example, a depth of 2 refers to the backing file
     of the backing file of *FILENAME*.  Depth will be one larger than
     the chain length if no file in the chain provides the data.
+  - an optional ``backing`` field is present with value true if no
+    file in the backing chain provides the data (making it easier to
+    identify when ``depth`` exceeds the chain length).

   In JSON format, the ``offset`` field is optional; it is absent in
   cases where ``human`` format would omit the entry or exit with an error.
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 2ea294129e08..cebe12ba16a0 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -264,6 +264,9 @@
 # @offset: if present, the image file stores the data for this range
 #          in raw format at the given (host) offset
 #
+# @backing: if present, the range is not allocated within the backing
+#           chain (since 6.1)
+#
 # @filename: filename that is referred to by @offset
 #
 # Since: 2.6
@@ -271,8 +274,8 @@
 ##
 { 'struct': 'MapEntry',
   'data': {'start': 'int', 'length': 'int', 'data': 'bool',
-           'zero': 'bool', 'depth': 'int', '*offset': 'int',
-           '*filename': 'str' } }
+           'zero': 'bool', 'depth': 'int', '*backing': 'bool',
+           '*offset': 'int', '*filename': 'str' } }

 ##
 # @BlockdevCacheInfo:
diff --git a/qemu-img.c b/qemu-img.c
index 33a5cd012b8b..4d357f534803 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -2977,8 +2977,13 @@ static int dump_map_entry(OutputFormat output_format, 
MapEntry *e,
         break;
     case OFORMAT_JSON:
         printf("{ \"start\": %"PRId64", \"length\": %"PRId64","
-               " \"depth\": %"PRId64", \"zero\": %s, \"data\": %s",
-               e->start, e->length, e->depth,
+               " \"depth\": %"PRId64, e->start, e->length, e->depth);
+        if (e->has_backing) {
+            /* Backing should only be set at the end of the chain */
+            assert(e->backing && e->depth > 0);
+            printf(", \"backing\": true");
+        }
+        printf(", \"zero\": %s, \"data\": %s",
                e->zero ? "true" : "false",
                e->data ? "true" : "false");
         if (e->has_offset) {
@@ -2999,6 +3004,7 @@ static int get_block_status(BlockDriverState *bs, int64_t 
offset,
 {
     int ret;
     int depth;
+    bool backing = false;
     BlockDriverState *file;
     bool has_offset;
     int64_t map;
@@ -3037,6 +3043,7 @@ static int get_block_status(BlockDriverState *bs, int64_t 
offset,
     }
     if (!(ret & BDRV_BLOCK_ALLOCATED)) {
         depth++;
+        backing = true;
     }

     *e = (MapEntry) {
@@ -3047,6 +3054,8 @@ static int get_block_status(BlockDriverState *bs, int64_t 
offset,
         .offset = map,
         .has_offset = has_offset,
         .depth = depth,
+        .has_backing = backing,
+        .backing = backing,
         .has_filename = filename,
         .filename = filename,
     };
@@ -3072,6 +3081,8 @@ static inline bool entry_mergeable(const MapEntry *curr, 
const MapEntry *next)
     if (curr->has_offset && curr->offset + curr->length != next->offset) {
         return false;
     }
+    /* backing should only ever be set for identical depth */
+    assert(curr->backing == next->backing);
     return true;
 }

diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
index 779dab4847f0..c5aa2c9866f1 100644
--- a/tests/qemu-iotests/122.out
+++ b/tests/qemu-iotests/122.out
@@ -68,11 +68,11 @@ read 65536/65536 bytes at offset 4194304
 read 65536/65536 bytes at offset 8388608
 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 [{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": true},
-{ "start": 65536, "length": 4128768, "depth": 1, "zero": true, "data": false},
+{ "start": 65536, "length": 4128768, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 4194304, "length": 65536, "depth": 0, "zero": false, "data": true},
-{ "start": 4259840, "length": 4128768, "depth": 1, "zero": true, "data": 
false},
+{ "start": 4259840, "length": 4128768, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 8388608, "length": 65536, "depth": 0, "zero": false, "data": true},
-{ "start": 8454144, "length": 4128768, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 8454144, "length": 4128768, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 read 65536/65536 bytes at offset 0
 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 65536/65536 bytes at offset 4194304
@@ -95,11 +95,11 @@ wrote 1024/1024 bytes at offset 1046528
 wrote 1024/1024 bytes at offset 0
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 [{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": true},
-{ "start": 65536, "length": 65536, "depth": 1, "zero": true, "data": false},
+{ "start": 65536, "length": 65536, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 131072, "length": 196608, "depth": 0, "zero": false, "data": true},
-{ "start": 327680, "length": 655360, "depth": 1, "zero": true, "data": false},
+{ "start": 327680, "length": 655360, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 983040, "length": 65536, "depth": 0, "zero": false, "data": true},
-{ "start": 1048576, "length": 1046528, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 1048576, "length": 1046528, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 read 16384/16384 bytes at offset 0
 16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 16384/16384 bytes at offset 16384
@@ -195,31 +195,31 @@ wrote 1024/1024 bytes at offset 17408

 convert -S 4k
 [{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 4096, "length": 4096, "depth": 1, "zero": true, "data": false},
+{ "start": 4096, "length": 4096, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 8192, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 12288, "length": 4096, "depth": 1, "zero": true, "data": false},
+{ "start": 12288, "length": 4096, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 16384, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 20480, "length": 67088384, "depth": 1, "zero": true, "data": false}]
+{ "start": 20480, "length": 67088384, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 convert -c -S 4k
 [{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true},
-{ "start": 1024, "length": 7168, "depth": 1, "zero": true, "data": false},
+{ "start": 1024, "length": 7168, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 8192, "length": 1024, "depth": 0, "zero": false, "data": true},
-{ "start": 9216, "length": 8192, "depth": 1, "zero": true, "data": false},
+{ "start": 9216, "length": 8192, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 17408, "length": 1024, "depth": 0, "zero": false, "data": true},
-{ "start": 18432, "length": 67090432, "depth": 1, "zero": true, "data": false}]
+{ "start": 18432, "length": 67090432, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 convert -S 8k
 [{ "start": 0, "length": 24576, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 24576, "length": 67084288, "depth": 1, "zero": true, "data": false}]
+{ "start": 24576, "length": 67084288, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 convert -c -S 8k
 [{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true},
-{ "start": 1024, "length": 7168, "depth": 1, "zero": true, "data": false},
+{ "start": 1024, "length": 7168, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 8192, "length": 1024, "depth": 0, "zero": false, "data": true},
-{ "start": 9216, "length": 8192, "depth": 1, "zero": true, "data": false},
+{ "start": 9216, "length": 8192, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 17408, "length": 1024, "depth": 0, "zero": false, "data": true},
-{ "start": 18432, "length": 67090432, "depth": 1, "zero": true, "data": false}]
+{ "start": 18432, "length": 67090432, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 === -n to a non-zero image ===

@@ -235,7 +235,7 @@ Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT 
size=67108864
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
 [{ "start": 0, "length": 67108864, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
-[{ "start": 0, "length": 67108864, "depth": 1, "zero": true, "data": false}]
+[{ "start": 0, "length": 67108864, "depth": 1, "backing": true, "zero": true, 
"data": false}]

 === -n to an empty image with a backing file ===

diff --git a/tests/qemu-iotests/154.out b/tests/qemu-iotests/154.out
index 34e65dc70759..a350273622e0 100644
--- a/tests/qemu-iotests/154.out
+++ b/tests/qemu-iotests/154.out
@@ -12,13 +12,13 @@ wrote 2048/2048 bytes at offset 17408
 wrote 2048/2048 bytes at offset 27648
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 [{ "start": 0, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 4096, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 4096, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 8192, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 12288, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 12288, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 16384, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 20480, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 20480, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 24576, "length": 8192, "depth": 0, "zero": true, "data": false},
-{ "start": 32768, "length": 134184960, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 32768, "length": 134184960, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == backing file contains non-zero data before write_zeroes ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -41,11 +41,11 @@ read 1024/1024 bytes at offset 65536
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 2048/2048 bytes at offset 67584
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 32768, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 32768, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 32768, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 36864, "length": 28672, "depth": 2, "zero": true, "data": false},
+{ "start": 36864, "length": 28672, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 69632, "length": 134148096, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 69632, "length": 134148096, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == backing file contains non-zero data after write_zeroes ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -68,11 +68,11 @@ read 1024/1024 bytes at offset 44032
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 3072/3072 bytes at offset 40960
 3 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 32768, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 32768, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 32768, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 36864, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 36864, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 40960, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 45056, "length": 134172672, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 45056, "length": 134172672, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == write_zeroes covers non-zero data ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -101,15 +101,15 @@ wrote 2048/2048 bytes at offset 29696
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 4096/4096 bytes at offset 28672
 4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 4096, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 4096, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 8192, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 8192, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 12288, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 16384, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 16384, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 20480, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 24576, "length": 4096, "depth": 2, "zero": true, "data": false},
+{ "start": 24576, "length": 4096, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 28672, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 32768, "length": 134184960, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 32768, "length": 134184960, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning two clusters, non-zero before request ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -142,16 +142,16 @@ read 1024/1024 bytes at offset 67584
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 5120/5120 bytes at offset 68608
 5 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 32768, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 32768, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 32768, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 36864, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 40960, "length": 8192, "depth": 2, "zero": true, "data": false},
+{ "start": 40960, "length": 8192, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 49152, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 53248, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 57344, "length": 8192, "depth": 2, "zero": true, "data": false},
+{ "start": 57344, "length": 8192, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 69632, "length": 4096, "depth": 0, "zero": true, "data": false},
-{ "start": 73728, "length": 134144000, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 73728, "length": 134144000, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning two clusters, non-zero after request ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -184,16 +184,16 @@ read 7168/7168 bytes at offset 65536
 7 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 1024/1024 bytes at offset 72704
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 32768, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 32768, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 32768, "length": 4096, "depth": 0, "zero": true, "data": false},
 { "start": 36864, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 40960, "length": 8192, "depth": 2, "zero": true, "data": false},
+{ "start": 40960, "length": 8192, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 49152, "length": 4096, "depth": 0, "zero": true, "data": false},
 { "start": 53248, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 57344, "length": 8192, "depth": 2, "zero": true, "data": false},
+{ "start": 57344, "length": 8192, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 4096, "depth": 0, "zero": true, "data": false},
 { "start": 69632, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 73728, "length": 134144000, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 73728, "length": 134144000, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning two clusters, partially overwriting backing file ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -213,7 +213,7 @@ read 1024/1024 bytes at offset 5120
 read 2048/2048 bytes at offset 6144
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 [{ "start": 0, "length": 8192, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 8192, "length": 134209536, "depth": 2, "zero": true, "data": false}]
+{ "start": 8192, "length": 134209536, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning multiple clusters, non-zero in first cluster ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -226,10 +226,10 @@ read 2048/2048 bytes at offset 65536
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 10240/10240 bytes at offset 67584
 10 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 65536, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 65536, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 69632, "length": 8192, "depth": 0, "zero": true, "data": false},
-{ "start": 77824, "length": 134139904, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 77824, "length": 134139904, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning multiple clusters, non-zero in intermediate cluster ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -240,9 +240,9 @@ wrote 7168/7168 bytes at offset 67584
 7 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 12288/12288 bytes at offset 65536
 12 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 65536, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 65536, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 12288, "depth": 0, "zero": true, "data": false},
-{ "start": 77824, "length": 134139904, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 77824, "length": 134139904, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning multiple clusters, non-zero in final cluster ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -255,10 +255,10 @@ read 10240/10240 bytes at offset 65536
 10 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 2048/2048 bytes at offset 75776
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 65536, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 65536, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 8192, "depth": 0, "zero": true, "data": false},
 { "start": 73728, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 77824, "length": 134139904, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 77824, "length": 134139904, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == spanning multiple clusters, partially overwriting backing file ==
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
@@ -277,61 +277,61 @@ read 2048/2048 bytes at offset 74752
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 1024/1024 bytes at offset 76800
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 65536, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 65536, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 65536, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 69632, "length": 4096, "depth": 0, "zero": true, "data": false},
 { "start": 73728, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 77824, "length": 134139904, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 77824, "length": 134139904, "depth": 2, "backing": true, "zero": 
true, "data": false}]

 == unaligned image tail cluster, no allocation needed ==
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776
 wrote 512/512 bytes at offset 134217728
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776
 wrote 512/512 bytes at offset 134219264
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776
 wrote 1024/1024 bytes at offset 134218240
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776
 wrote 2048/2048 bytes at offset 134217728
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134218752
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 512/512 bytes at offset 134217728
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 512/512 bytes at offset 134219264
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 1024/1024 bytes at offset 134218240
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 2048/2048 bytes at offset 134217728
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 wrote 512/512 bytes at offset 134217728
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@@ -339,25 +339,25 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/
 wrote 512/512 bytes at offset 134217728
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 512/512 bytes at offset 134219264
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 1024/1024 bytes at offset 134218240
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
 wrote 2048/2048 bytes at offset 134217728
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 2048/2048 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": false}]
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134218752
 wrote 1024/1024 bytes at offset 134217728
@@ -369,14 +369,14 @@ read 512/512 bytes at offset 134217728
 read 512/512 bytes at offset 134218240
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 1024/1024 bytes allocated at offset 128 MiB
-[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 1024, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET}]
 wrote 1024/1024 bytes at offset 134217728
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 1024/1024 bytes allocated at offset 128 MiB
 read 1024/1024 bytes at offset 134217728
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 1024, "depth": 0, "zero": true, "data": false, 
"offset": OFFSET}]

 == unaligned image tail cluster, allocation required ==
@@ -390,7 +390,7 @@ read 512/512 bytes at offset 134217728
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 1536/1536 bytes at offset 134218240
 1.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET}]
 Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134218752
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134219776 
backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
@@ -412,6 +412,6 @@ read 512/512 bytes at offset 134218240
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 1024/1024 bytes at offset 134218752
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-[{ "start": 0, "length": 134217728, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 134217728, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 134217728, "length": 2048, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET}]
 *** done
diff --git a/tests/qemu-iotests/179.out b/tests/qemu-iotests/179.out
index 2e2c33138902..38176a5fbf2e 100644
--- a/tests/qemu-iotests/179.out
+++ b/tests/qemu-iotests/179.out
@@ -13,11 +13,11 @@ wrote 2097152/2097152 bytes at offset 6291456
 2 MiB (0x200000) bytes not allocated at offset 4 MiB (0x400000)
 2 MiB (0x200000) bytes     allocated at offset 6 MiB (0x600000)
 56 MiB (0x3800000) bytes not allocated at offset 8 MiB (0x800000)
-[{ "start": 0, "length": 2097152, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 2097152, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 2097152, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 4194304, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 4194304, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 6291456, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 8388608, "length": 58720256, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 8388608, "length": 58720256, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 wrote 2097150/2097150 bytes at offset 10485761
 2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 2097150/2097150 bytes at offset 14680065
@@ -31,15 +31,15 @@ wrote 2097150/2097150 bytes at offset 14680065
 2 MiB (0x200000) bytes not allocated at offset 12 MiB (0xc00000)
 2 MiB (0x200000) bytes     allocated at offset 14 MiB (0xe00000)
 48 MiB (0x3000000) bytes not allocated at offset 16 MiB (0x1000000)
-[{ "start": 0, "length": 2097152, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 2097152, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 2097152, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 4194304, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 4194304, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 6291456, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 8388608, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 8388608, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 10485760, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 12582912, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 12582912, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 14680064, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 16777216, "length": 50331648, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 16777216, "length": 50331648, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 wrote 14680064/14680064 bytes at offset 18874368
 14 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 2097152/2097152 bytes at offset 20971520
@@ -57,21 +57,21 @@ wrote 6291456/6291456 bytes at offset 25165824
 2 MiB (0x200000) bytes not allocated at offset 16 MiB (0x1000000)
 14 MiB (0xe00000) bytes     allocated at offset 18 MiB (0x1200000)
 32 MiB (0x2000000) bytes not allocated at offset 32 MiB (0x2000000)
-[{ "start": 0, "length": 2097152, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 2097152, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 2097152, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 4194304, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 4194304, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 6291456, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 8388608, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 8388608, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 10485760, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 12582912, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 12582912, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 14680064, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 16777216, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 16777216, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 20971520, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
 { "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 25165824, "length": 6291456, "depth": 0, "zero": true, "data": 
false, "offset": OFFSET},
 { "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
-{ "start": 33554432, "length": 33554432, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 33554432, "length": 33554432, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 wrote 2097152/2097152 bytes at offset 27262976
 2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 2097152/2097152 bytes at offset 29360128
@@ -87,15 +87,15 @@ wrote 2097152/2097152 bytes at offset 29360128
 2 MiB (0x200000) bytes not allocated at offset 16 MiB (0x1000000)
 14 MiB (0xe00000) bytes     allocated at offset 18 MiB (0x1200000)
 32 MiB (0x2000000) bytes not allocated at offset 32 MiB (0x2000000)
-[{ "start": 0, "length": 2097152, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 2097152, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 2097152, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 4194304, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 4194304, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 6291456, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 8388608, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 8388608, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 10485760, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 12582912, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 12582912, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 14680064, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 16777216, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 16777216, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 20971520, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
 { "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
@@ -103,7 +103,7 @@ wrote 2097152/2097152 bytes at offset 29360128
 { "start": 27262976, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
 { "start": 29360128, "length": 2097152, "depth": 0, "zero": true, "data": 
false, "offset": OFFSET},
 { "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
-{ "start": 33554432, "length": 33554432, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 33554432, "length": 33554432, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 wrote 8388608/8388608 bytes at offset 33554432
 8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 2097152/2097152 bytes at offset 35651584
@@ -121,15 +121,15 @@ wrote 2097152/2097152 bytes at offset 37748736
 2 MiB (0x200000) bytes not allocated at offset 16 MiB (0x1000000)
 22 MiB (0x1600000) bytes     allocated at offset 18 MiB (0x1200000)
 24 MiB (0x1800000) bytes not allocated at offset 40 MiB (0x2800000)
-[{ "start": 0, "length": 2097152, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 2097152, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 2097152, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 4194304, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 4194304, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 6291456, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 8388608, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 8388608, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 10485760, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 12582912, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 12582912, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 14680064, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
-{ "start": 16777216, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
+{ "start": 16777216, "length": 2097152, "depth": 1, "backing": true, "zero": 
true, "data": false},
 { "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 20971520, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
 { "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
@@ -138,7 +138,7 @@ wrote 2097152/2097152 bytes at offset 37748736
 { "start": 29360128, "length": 2097152, "depth": 0, "zero": true, "data": 
false, "offset": OFFSET},
 { "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 33554432, "length": 8388608, "depth": 0, "zero": true, "data": 
false},
-{ "start": 41943040, "length": 25165824, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 41943040, "length": 25165824, "depth": 1, "backing": true, "zero": 
true, "data": false}]
 wrote 8388608/8388608 bytes at offset 41943040
 8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 8388608/8388608 bytes at offset 50331648
@@ -162,15 +162,15 @@ wrote 2097152/2097152 bytes at offset 62914560
 4 MiB (0x400000) bytes not allocated at offset 54 MiB (0x3600000)
 4 MiB (0x400000) bytes     allocated at offset 58 MiB (0x3a00000)
 2 MiB (0x200000) bytes not allocated at offset 62 MiB (0x3e00000)
-[{ "start": 0, "length": 2097152, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 2097152, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 2097152, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
-{ "start": 4194304, "length": 2097152, "depth": 2, "zero": true, "data": 
false},
+{ "start": 4194304, "length": 2097152, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 6291456, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
-{ "start": 8388608, "length": 2097152, "depth": 2, "zero": true, "data": 
false},
+{ "start": 8388608, "length": 2097152, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 10485760, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
-{ "start": 12582912, "length": 2097152, "depth": 2, "zero": true, "data": 
false},
+{ "start": 12582912, "length": 2097152, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 14680064, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
-{ "start": 16777216, "length": 2097152, "depth": 2, "zero": true, "data": 
false},
+{ "start": 16777216, "length": 2097152, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 18874368, "length": 2097152, "depth": 1, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 20971520, "length": 2097152, "depth": 1, "zero": true, "data": 
false},
 { "start": 23068672, "length": 2097152, "depth": 1, "zero": false, "data": 
true, "offset": OFFSET},
@@ -184,9 +184,9 @@ wrote 2097152/2097152 bytes at offset 62914560
 { "start": 50331648, "length": 2097152, "depth": 1, "zero": false, "data": 
true, "offset": OFFSET},
 { "start": 52428800, "length": 4194304, "depth": 0, "zero": true, "data": 
false},
 { "start": 56623104, "length": 2097152, "depth": 1, "zero": false, "data": 
true, "offset": OFFSET},
-{ "start": 58720256, "length": 2097152, "depth": 2, "zero": true, "data": 
false},
+{ "start": 58720256, "length": 2097152, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 60817408, "length": 4194304, "depth": 0, "zero": true, "data": 
false},
-{ "start": 65011712, "length": 2097152, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 65011712, "length": 2097152, "depth": 2, "backing": true, "zero": 
true, "data": false}]
 No errors were found on the image.
 No errors were found on the image.

diff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out
index 101d1e89a8db..f3e3516b4908 100644
--- a/tests/qemu-iotests/223.out
+++ b/tests/qemu-iotests/223.out
@@ -103,16 +103,16 @@ read 2097152/2097152 bytes at offset 2097152
 [{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, 
"offset": OFFSET},
 { "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
-[{ "start": 0, "length": 65536, "depth": 1, "zero": false, "data": false},
+[{ "start": 0, "length": 65536, "depth": 1, "backing": true, "zero": false, 
"data": false},
 { "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 2097152, "depth": 1, "zero": false, "data": 
false}]
+{ "start": 2097152, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false}]

 === Contrast to small granularity dirty-bitmap ===

 [{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 512, "length": 512, "depth": 1, "zero": false, "data": false},
+{ "start": 512, "length": 512, "depth": 1, "backing": true, "zero": false, 
"data": false},
 { "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 2097152, "depth": 1, "zero": false, "data": 
false}]
+{ "start": 2097152, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false}]

 === End qemu NBD server ===

@@ -204,16 +204,16 @@ read 2097152/2097152 bytes at offset 2097152
 [{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, 
"offset": OFFSET},
 { "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
-[{ "start": 0, "length": 65536, "depth": 1, "zero": false, "data": false},
+[{ "start": 0, "length": 65536, "depth": 1, "backing": true, "zero": false, 
"data": false},
 { "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 2097152, "depth": 1, "zero": false, "data": 
false}]
+{ "start": 2097152, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false}]

 === Contrast to small granularity dirty-bitmap ===

 [{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 512, "length": 512, "depth": 1, "zero": false, "data": false},
+{ "start": 512, "length": 512, "depth": 1, "backing": true, "zero": false, 
"data": false},
 { "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 2097152, "depth": 1, "zero": false, "data": 
false}]
+{ "start": 2097152, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false}]

 === End qemu NBD server ===

@@ -238,12 +238,12 @@ read 2097152/2097152 bytes at offset 2097152

 === Use qemu-nbd as server ===

-[{ "start": 0, "length": 65536, "depth": 1, "zero": false, "data": false},
+[{ "start": 0, "length": 65536, "depth": 1, "backing": true, "zero": false, 
"data": false},
 { "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 2097152, "depth": 1, "zero": false, "data": 
false}]
+{ "start": 2097152, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false}]
 [{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 512, "length": 512, "depth": 1, "zero": false, "data": false},
+{ "start": 512, "length": 512, "depth": 1, "backing": true, "zero": false, 
"data": false},
 { "start": 1024, "length": 11321, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET}]
 [{ "start": 12345, "length": 2084807, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 2097152, "depth": 1, "zero": false, "data": 
false}]
+{ "start": 2097152, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false}]
 *** done
diff --git a/tests/qemu-iotests/244.out b/tests/qemu-iotests/244.out
index b934f2d9b792..d46f89ae4e95 100644
--- a/tests/qemu-iotests/244.out
+++ b/tests/qemu-iotests/244.out
@@ -57,12 +57,12 @@ wrote 3145728/3145728 bytes at offset 3145728
 3 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 No errors were found on the image.

-[{ "start": 0, "length": 1048576, "depth": 1, "zero": true, "data": false},
+[{ "start": 0, "length": 1048576, "depth": 1, "backing": true, "zero": true, 
"data": false},
 { "start": 1048576, "length": 1048576, "depth": 0, "zero": false, "data": 
true, "offset": 1048576},
 { "start": 2097152, "length": 2097152, "depth": 0, "zero": true, "data": 
false},
 { "start": 4194304, "length": 1048576, "depth": 0, "zero": true, "data": 
false, "offset": 4194304},
 { "start": 5242880, "length": 1048576, "depth": 0, "zero": true, "data": 
false},
-{ "start": 6291456, "length": 60817408, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 6291456, "length": 60817408, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 read 1048576/1048576 bytes at offset 0
 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@@ -124,7 +124,7 @@ read 1048576/1048576 bytes at offset 0
 Offset          Length          Mapped to       File
 0               0x100000        0               TEST_DIR/t.qcow2.data
 [{ "start": 0, "length": 1048576, "depth": 0, "zero": false, "data": true, 
"offset": 0},
-{ "start": 1048576, "length": 66060288, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 1048576, "length": 66060288, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 === Copy offloading ===

diff --git a/tests/qemu-iotests/252.out b/tests/qemu-iotests/252.out
index b057b825739e..c9a56c78aae3 100644
--- a/tests/qemu-iotests/252.out
+++ b/tests/qemu-iotests/252.out
@@ -24,7 +24,7 @@ read 131072/131072 bytes at offset 262144
 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)

 [{ "start": 0, "length": 262144, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 262144, "length": 131072, "depth": 1, "zero": true, "data": false}]
+{ "start": 262144, "length": 131072, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 read 131072/131072 bytes at offset 0
 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@@ -35,5 +35,5 @@ read 131072/131072 bytes at offset 262144

 [{ "start": 0, "length": 262144, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 262144, "length": 65536, "depth": 0, "zero": true, "data": false},
-{ "start": 327680, "length": 65536, "depth": 2, "zero": true, "data": false}]
+{ "start": 327680, "length": 65536, "depth": 2, "backing": true, "zero": true, 
"data": false}]
 *** done
diff --git a/tests/qemu-iotests/274.out b/tests/qemu-iotests/274.out
index 9a4de18c4cf2..1c8138306fde 100644
--- a/tests/qemu-iotests/274.out
+++ b/tests/qemu-iotests/274.out
@@ -37,7 +37,7 @@ Offset          Length          Mapped to       File
 0               0x100000        0x50000         TEST_DIR/PID-base

 [{ "start": 0, "length": 1048576, "depth": 2, "zero": false, "data": true, 
"offset": 327680},
-{ "start": 1048576, "length": 1048576, "depth": 1, "zero": true, "data": 
false}]
+{ "start": 1048576, "length": 1048576, "depth": 1, "backing": true, "zero": 
true, "data": false}]

 Offset          Length          Mapped to       File
 0               0x100000        0x50000         TEST_DIR/PID-base
@@ -220,7 +220,7 @@ read 65536/65536 bytes at offset 5368709120
 1 GiB (0x40000000) bytes not allocated at offset 0 bytes (0x0)
 7 GiB (0x1c0000000) bytes     allocated at offset 1 GiB (0x40000000)

-[{ "start": 0, "length": 1073741824, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 1073741824, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 1073741824, "length": 7516192768, "depth": 0, "zero": true, "data": 
false}]

 === preallocation=metadata ===
@@ -239,7 +239,7 @@ read 65536/65536 bytes at offset 33285996544
 30 GiB (0x780000000) bytes not allocated at offset 0 bytes (0x0)
 3 GiB (0xc0000000) bytes     allocated at offset 30 GiB (0x780000000)

-[{ "start": 0, "length": 32212254720, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 32212254720, "depth": 2, "backing": true, "zero": 
true, "data": false},
 { "start": 32212254720, "length": 536870912, "depth": 0, "zero": true, "data": 
false, "offset": 327680},
 { "start": 32749125632, "length": 536870912, "depth": 0, "zero": true, "data": 
false, "offset": 537264128},
 { "start": 33285996544, "length": 536870912, "depth": 0, "zero": true, "data": 
false, "offset": 1074200576},
@@ -263,7 +263,7 @@ read 65536/65536 bytes at offset 9437184
 5 MiB (0x500000) bytes not allocated at offset 0 bytes (0x0)
 10 MiB (0xa00000) bytes     allocated at offset 5 MiB (0x500000)

-[{ "start": 0, "length": 5242880, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 5242880, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 5242880, "length": 10485760, "depth": 0, "zero": false, "data": 
true, "offset": 327680}]

 === preallocation=full ===
@@ -282,7 +282,7 @@ read 65536/65536 bytes at offset 11534336
 8 MiB (0x800000) bytes not allocated at offset 0 bytes (0x0)
 4 MiB (0x400000) bytes     allocated at offset 8 MiB (0x800000)

-[{ "start": 0, "length": 8388608, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 8388608, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 8388608, "length": 4194304, "depth": 0, "zero": false, "data": 
true, "offset": 327680}]

 === preallocation=off ===
@@ -301,7 +301,7 @@ read 65536/65536 bytes at offset 259072
 192 KiB (0x30000) bytes not allocated at offset 0 bytes (0x0)
 320 KiB (0x50000) bytes     allocated at offset 192 KiB (0x30000)

-[{ "start": 0, "length": 196608, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 196608, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 196608, "length": 65536, "depth": 0, "zero": false, "data": true, 
"offset": 327680},
 { "start": 262144, "length": 262144, "depth": 0, "zero": true, "data": false}]

@@ -321,7 +321,7 @@ read 65536/65536 bytes at offset 344064
 256 KiB (0x40000) bytes not allocated at offset 0 bytes (0x0)
 256 KiB (0x40000) bytes     allocated at offset 256 KiB (0x40000)

-[{ "start": 0, "length": 262144, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 262144, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 262144, "length": 262144, "depth": 0, "zero": true, "data": false}]

 === preallocation=off ===
@@ -340,6 +340,6 @@ read 65536/65536 bytes at offset 446464
 256 KiB (0x40000) bytes not allocated at offset 0 bytes (0x0)
 244 KiB (0x3d000) bytes     allocated at offset 256 KiB (0x40000)

-[{ "start": 0, "length": 262144, "depth": 2, "zero": true, "data": false},
+[{ "start": 0, "length": 262144, "depth": 2, "backing": true, "zero": true, 
"data": false},
 { "start": 262144, "length": 249856, "depth": 0, "zero": true, "data": false}]

diff --git a/tests/qemu-iotests/291.out b/tests/qemu-iotests/291.out
index 5b997eb8d744..841286fb2607 100644
--- a/tests/qemu-iotests/291.out
+++ b/tests/qemu-iotests/291.out
@@ -104,15 +104,15 @@ Format specific information:
 === Check bitmap contents ===

 [{ "start": 0, "length": 3145728, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 3145728, "length": 1048576, "depth": 1, "zero": false, "data": 
false},
+{ "start": 3145728, "length": 1048576, "depth": 1, "backing": true, "zero": 
false, "data": false},
 { "start": 4194304, "length": 6291456, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
 [{ "start": 0, "length": 1048576, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 1048576, "length": 1048576, "depth": 1, "zero": false, "data": 
false},
+{ "start": 1048576, "length": 1048576, "depth": 1, "backing": true, "zero": 
false, "data": false},
 { "start": 2097152, "length": 8388608, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
 [{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 1048576, "depth": 1, "zero": false, "data": 
false},
+{ "start": 2097152, "length": 1048576, "depth": 1, "backing": true, "zero": 
false, "data": false},
 { "start": 3145728, "length": 7340032, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
 [{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
-{ "start": 2097152, "length": 1048576, "depth": 1, "zero": false, "data": 
false},
+{ "start": 2097152, "length": 1048576, "depth": 1, "backing": true, "zero": 
false, "data": false},
 { "start": 3145728, "length": 7340032, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
 *** done
diff --git a/tests/qemu-iotests/309.out b/tests/qemu-iotests/309.out
index 7020bd33d7c1..d3de6a8fed13 100644
--- a/tests/qemu-iotests/309.out
+++ b/tests/qemu-iotests/309.out
@@ -13,10 +13,10 @@ wrote 2097152/2097152 bytes at offset 1048576

 [{ "start": 0, "length": 1048576, "depth": 1, "zero": false, "data": true, 
"offset": 327680},
 { "start": 1048576, "length": 2097152, "depth": 0, "zero": false, "data": 
true, "offset": 327680},
-{ "start": 3145728, "length": 1048576, "depth": 2, "zero": true, "data": 
false}]
+{ "start": 3145728, "length": 1048576, "depth": 2, "backing": true, "zero": 
true, "data": false}]
 [{ "start": 0, "length": 3145728, "depth": 0, "zero": false, "data": true, 
"offset": OFFSET},
 { "start": 3145728, "length": 1048576, "depth": 0, "zero": true, "data": 
false, "offset": OFFSET}]
 [{ "start": 0, "length": 1048576, "depth": 0, "zero": true, "data": true, 
"offset": OFFSET},
-{ "start": 1048576, "length": 2097152, "depth": 1, "zero": false, "data": 
false},
+{ "start": 1048576, "length": 2097152, "depth": 1, "backing": true, "zero": 
false, "data": false},
 { "start": 3145728, "length": 1048576, "depth": 0, "zero": false, "data": 
true, "offset": OFFSET}]
 *** done
-- 
2.31.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]