The feature table is supposed to advertise the name of all feature
bits that we support; however, we forgot to update the table for
autoclear bits. While at it, move the table to read-only memory in
code, and tweak the qcow2 spec to name the second autoclear bit.
Update iotests that are affected by the longer header length.
Fixes: 88ddffae
Fixes: 93c24936
Signed-off-by: Eric Blake <eblake@redhat.com>
---
block/qcow2.c | 12 +++++++++++-
docs/interop/qcow2.txt | 3 ++-
tests/qemu-iotests/031.out | 8 ++++----
tests/qemu-iotests/036.out | 4 ++--
tests/qemu-iotests/061.out | 14 +++++++-------
5 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index 30fd3d13032a..d3e7709ac2b4 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2821,7 +2821,7 @@ int qcow2_update_header(BlockDriverState *bs)
/* Feature table */
if (s->qcow_version >= 3) {
- Qcow2Feature features[] = {
+ static const Qcow2Feature features[] = {
{
.type = QCOW2_FEAT_TYPE_INCOMPATIBLE,
.bit = QCOW2_INCOMPAT_DIRTY_BITNR,
@@ -2842,6 +2842,16 @@ int qcow2_update_header(BlockDriverState *bs)
.bit = QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR,
.name = "lazy refcounts",
},
+ {
+ .type = QCOW2_FEAT_TYPE_AUTOCLEAR,
+ .bit = QCOW2_AUTOCLEAR_BITMAPS_BITNR,
+ .name = "consistent bitmaps",
+ },
+ {
+ .type = QCOW2_FEAT_TYPE_AUTOCLEAR,
+ .bit = QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR,
+ .name = "raw external data",
+ },
};
ret = header_ext_add(buf, QCOW2_EXT_MAGIC_FEATURE_TABLE,
diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt
index af5711e53371..8510d74c8079 100644
--- a/docs/interop/qcow2.txt
+++ b/docs/interop/qcow2.txt
@@ -138,7 +138,8 @@ in the description of a field.
bit is unset, the bitmaps extension data must be
considered inconsistent.
- Bit 1: If this bit is set, the external data file can
+ Bit 1: Raw external data bit
+ If this bit is set, the external data file can
be read as a consistent standalone raw image
without looking at the qcow2 metadata.
diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out
index d535e407bc30..46f97c5a4ea4 100644
--- a/tests/qemu-iotests/031.out
+++ b/tests/qemu-iotests/031.out
@@ -117,7 +117,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
Header extension:
@@ -150,7 +150,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
Header extension:
@@ -164,7 +164,7 @@ No errors were found on the image.
magic 0x514649fb
version 3
-backing_file_offset 0x178
+backing_file_offset 0x1d8
backing_file_size 0x17
cluster_bits 16
size 67108864
@@ -188,7 +188,7 @@ data 'host_device'
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
Header extension:
diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
index 0b52b934e115..23b699ce0622 100644
--- a/tests/qemu-iotests/036.out
+++ b/tests/qemu-iotests/036.out
@@ -26,7 +26,7 @@ compatible_features []
autoclear_features [63]
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
@@ -38,7 +38,7 @@ compatible_features []
autoclear_features []
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
*** done
diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
index 8b3091a412bc..413cc4e0f4ab 100644
--- a/tests/qemu-iotests/061.out
+++ b/tests/qemu-iotests/061.out
@@ -26,7 +26,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
magic 0x514649fb
@@ -84,7 +84,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
magic 0x514649fb
@@ -140,7 +140,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
ERROR cluster 5 refcount=0 reference=1
@@ -195,7 +195,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
magic 0x514649fb
@@ -264,7 +264,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
read 65536/65536 bytes at offset 44040192
@@ -298,7 +298,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
ERROR cluster 5 refcount=0 reference=1
@@ -327,7 +327,7 @@ header_length 104
Header extension:
magic 0x6803f857
-length 192
+length 288
data <binary>
read 131072/131072 bytes at offset 0
--
2.24.1
31.01.2020 20:44, Eric Blake wrote: > The feature table is supposed to advertise the name of all feature > bits that we support; however, we forgot to update the table for > autoclear bits. While at it, move the table to read-only memory in > code, and tweak the qcow2 spec to name the second autoclear bit. > Update iotests that are affected by the longer header length. > > Fixes: 88ddffae > Fixes: 93c24936 > Signed-off-by: Eric Blake <eblake@redhat.com> > --- > block/qcow2.c | 12 +++++++++++- > docs/interop/qcow2.txt | 3 ++- > tests/qemu-iotests/031.out | 8 ++++---- > tests/qemu-iotests/036.out | 4 ++-- > tests/qemu-iotests/061.out | 14 +++++++------- > 5 files changed, 26 insertions(+), 15 deletions(-) > > diff --git a/block/qcow2.c b/block/qcow2.c > index 30fd3d13032a..d3e7709ac2b4 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -2821,7 +2821,7 @@ int qcow2_update_header(BlockDriverState *bs) > > /* Feature table */ > if (s->qcow_version >= 3) { > - Qcow2Feature features[] = { > + static const Qcow2Feature features[] = { > { > .type = QCOW2_FEAT_TYPE_INCOMPATIBLE, > .bit = QCOW2_INCOMPAT_DIRTY_BITNR, > @@ -2842,6 +2842,16 @@ int qcow2_update_header(BlockDriverState *bs) > .bit = QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR, > .name = "lazy refcounts", > }, > + { > + .type = QCOW2_FEAT_TYPE_AUTOCLEAR, > + .bit = QCOW2_AUTOCLEAR_BITMAPS_BITNR, > + .name = "consistent bitmaps", Hmm, what do you mean by "consistent" ? Each bitmap has own in_use flag, and my be "inconsistent" on its own. I'd prefer to name it just "bitmaps", as extension is named "Bitmaps". With this change: Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > + }, > + { > + .type = QCOW2_FEAT_TYPE_AUTOCLEAR, > + .bit = QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR, > + .name = "raw external data", > + }, > }; > > ret = header_ext_add(buf, QCOW2_EXT_MAGIC_FEATURE_TABLE, > diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt > index af5711e53371..8510d74c8079 100644 > --- a/docs/interop/qcow2.txt > +++ b/docs/interop/qcow2.txt > @@ -138,7 +138,8 @@ in the description of a field. > bit is unset, the bitmaps extension data must be > considered inconsistent. > > - Bit 1: If this bit is set, the external data file can > + Bit 1: Raw external data bit > + If this bit is set, the external data file can > be read as a consistent standalone raw image > without looking at the qcow2 metadata. > > diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out > index d535e407bc30..46f97c5a4ea4 100644 > --- a/tests/qemu-iotests/031.out > +++ b/tests/qemu-iotests/031.out > @@ -117,7 +117,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > Header extension: > @@ -150,7 +150,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > Header extension: > @@ -164,7 +164,7 @@ No errors were found on the image. > > magic 0x514649fb > version 3 > -backing_file_offset 0x178 > +backing_file_offset 0x1d8 > backing_file_size 0x17 > cluster_bits 16 > size 67108864 > @@ -188,7 +188,7 @@ data 'host_device' > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > Header extension: > diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out > index 0b52b934e115..23b699ce0622 100644 > --- a/tests/qemu-iotests/036.out > +++ b/tests/qemu-iotests/036.out > @@ -26,7 +26,7 @@ compatible_features [] > autoclear_features [63] > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > > @@ -38,7 +38,7 @@ compatible_features [] > autoclear_features [] > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > *** done > diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out > index 8b3091a412bc..413cc4e0f4ab 100644 > --- a/tests/qemu-iotests/061.out > +++ b/tests/qemu-iotests/061.out > @@ -26,7 +26,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > magic 0x514649fb > @@ -84,7 +84,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > magic 0x514649fb > @@ -140,7 +140,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > ERROR cluster 5 refcount=0 reference=1 > @@ -195,7 +195,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > magic 0x514649fb > @@ -264,7 +264,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > read 65536/65536 bytes at offset 44040192 > @@ -298,7 +298,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > ERROR cluster 5 refcount=0 reference=1 > @@ -327,7 +327,7 @@ header_length 104 > > Header extension: > magic 0x6803f857 > -length 192 > +length 288 > data <binary> > > read 131072/131072 bytes at offset 0 > -- Best regards, Vladimir
© 2016 - 2025 Red Hat, Inc.