On Fri, 16 May 2025 at 16:01, <conte.souleym...@gmail.com> wrote:
>
> From: Souleymane Conte <conte.souleym...@gmail.com>
>
> buglink: https://gitlab.com/qemu-project/qemu/-/issues/527
>
> Signed-off-by: Souleymane Conte <conte.souleym...@gmail.com>

Thanks for this patch. It looks good, so I only have
some minor changes to suggest below.

A minor thing: for a single patch, please don't send a
cover letter -- it confuses some of our automated tooling.
Cover letters are only needed for multi-patch series.

For a single patch, if you want to add notes about e.g.
changes between v1 and v2, you can put them below the '---'
line...

> ---

...here. Text here won't go into the final git commit
message.

>  docs/interop/index.rst                |   1 +
>  docs/interop/{qcow2.txt => qcow2.rst} | 218 +++++++++++++++-----------
>  2 files changed, 128 insertions(+), 91 deletions(-)
>  rename docs/interop/{qcow2.txt => qcow2.rst} (88%)
>
> diff --git a/docs/interop/index.rst b/docs/interop/index.rst
> index 999e44eae1..bfe3cf0beb 100644
> --- a/docs/interop/index.rst
> +++ b/docs/interop/index.rst
> @@ -23,6 +23,7 @@ are useful for making QEMU interoperate with other software.
>     qemu-ga-ref
>     qemu-qmp-ref
>     qemu-storage-daemon-qmp-ref
> +   qcow2

I think I would put this a little further up in the
index, just below "parallels". That way it goes together
with the other image-format specs in the index list.

>     vhost-user
>     vhost-user-gpu
>     vhost-vdpa
> diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.rst
> similarity index 88%
> rename from docs/interop/qcow2.txt
> rename to docs/interop/qcow2.rst
> index 2c4618375a..2295dd4ae6 100644
> --- a/docs/interop/qcow2.txt
> +++ b/docs/interop/qcow2.rst
> @@ -1,6 +1,8 @@
> -== General ==
> +================
> +Qcow2 Image File
> +================
>
> -A qcow2 image file is organized in units of constant size, which are called
> +A *qcow2* image file is organized in units of constant size, which are called
>  (host) clusters. A cluster is the unit in which all allocations are done,
>  both for actual guest data and for image metadata.
>
> @@ -9,10 +11,10 @@ clusters of the same size.
>
>  All numbers in qcow2 are stored in Big Endian byte order.
>
> +Header
> +------
>
> -== Header ==
> -
> -The first cluster of a qcow2 image contains the file header:
> +The first cluster of a qcow2 image contains the file header::
>
>      Byte  0 -  3:   magic
>                      QCOW magic string ("QFI\xfb")
> @@ -38,7 +40,7 @@ The first cluster of a qcow2 image contains the file header:
>                      within a cluster (1 << cluster_bits is the cluster size).
>                      Must not be less than 9 (i.e. 512 byte clusters).
>
> -                    Note: qemu as of today has an implementation limit of 2 
> MB
> +                    Note: Qemu as of today has an implementation limit of 2 
> MB

If we're going to change this kind of thing: the correct spelling
is all-caps "QEMU".

>                      as the maximum cluster size and won't be able to open 
> images
>                      with larger cluster sizes.
>
> @@ -48,7 +50,7 @@ The first cluster of a qcow2 image contains the file header:
>           24 - 31:   size
>                      Virtual disk size in bytes.
>
> -                    Note: qemu has an implementation limit of 32 MB as
> +                    Note: Qemu has an implementation limit of 32 MB as
>                      the maximum L1 table size.  With a 2 MB cluster
>                      size, it is unable to populate a virtual cluster
>                      beyond 2 EB (61 bits); with a 512 byte cluster
> @@ -88,6 +90,7 @@ The first cluster of a qcow2 image contains the file header:
>  For version 2, the header is exactly 72 bytes in length, and finishes here.
>  For version 3 or higher, the header length is at least 104 bytes, including
>  the next fields through header_length.
> +::
>
>           72 -  79:  incompatible_features
>                      Bitmask of incompatible features. An implementation must
> @@ -185,7 +188,8 @@ the next fields through header_length.
>                      of 8.
>
>
> -=== Additional fields (version 3 and higher) ===
> +Additional fields (version 3 and higher)
> +----------------------------------------
>
>  In general, these fields are optional and may be safely ignored by the 
> software,
>  as well as filled by zeros (which is equal to field absence), if software 
> needs
> @@ -193,21 +197,25 @@ to set field B, but does not care about field A which 
> precedes B. More
>  formally, additional fields have the following compatibility rules:
>
>  1. If the value of the additional field must not be ignored for correct
> -handling of the file, it will be accompanied by a corresponding incompatible
> -feature bit.
> +   handling of the file, it will be accompanied by a corresponding 
> incompatible
> +   feature bit.
>
>  2. If there are no unrecognized incompatible feature bits set, an unknown
> -additional field may be safely ignored other than preserving its value when
> -rewriting the image header.
> +   additional field may be safely ignored other than preserving its value 
> when
> +   rewriting the image header.
> +
> +.. _ref_rules_3:
>
>  3. An explicit value of 0 will have the same behavior as when the field is 
> not
> -present*, if not altered by a specific incompatible bit.
> +   present*, if not altered by a specific incompatible bit.
>
> -*. A field is considered not present when header_length is less than or equal
> +(*) A field is considered not present when *header_length* is less than or 
> equal
>  to the field's offset. Also, all additional fields are not present for
>  version 2.

For references in formatted text to things like field names, function
names, filenames and similar fixed-strings, I recommend ``header_length``
(which gives monospaced) rather than *header_length* (which is italics)
or **header_length** (which is bold).

> -              104:  compression_type
> +::
> +
> +        104:        compression_type
>
>                      Defines the compression method used for compressed 
> clusters.
>                      All compressed clusters in an image use the same 
> compression
> @@ -219,28 +227,30 @@ version 2.
>                      or must be zero (which means deflate).
>
>                      Available compression type values:
> -                        0: deflate <https://www.ietf.org/rfc/rfc1951.txt>
> -                        1: zstd <http://github.com/facebook/zstd>
> +                       - 0: deflate https://www.ietf.org/rfc/rfc1951.txt
> +                       - 1: zstd <http://github.com/facebook/zstd>

We should be consistent about whether we have the angle brackets
or not.

This is all in a fixed-width text block, so the URL isn't going
to be formatted anyway. Might as well leave the angleb rackets in,
for consistency with e.g. below.

>
> -                    The deflate compression type is called "zlib"
> +                    The deflate compression type is called zlib

Any reason to drop the quotes here ?

>                      <https://www.zlib.net/> in QEMU. However, clusters with 
> the
>                      deflate compression type do not have zlib headers.
>
>          105 - 111:  Padding, contents defined below.
>
> -=== Header padding ===
> +Header padding
> +--------------
>
> -@header_length must be a multiple of 8, which means that if the end of the 
> last
> +*header_length* must be a multiple of 8, which means that if the end of the 
> last
>  additional field is not aligned, some padding is needed. This padding must be
>  zeroed, so that if some existing (or future) additional field will fall into
> -the padding, it will be interpreted accordingly to point [3.] of the previous
> +the padding, it will be interpreted accordingly to point `[3.] 
> <#ref_rules_3>`_ of the previous
>  paragraph, i.e.  in the same manner as when this field is not present.
>
>
> -=== Header extensions ===
> +Header extensions
> +-----------------
>
>  Directly after the image header, optional sections called header extensions 
> can
> -be stored. Each extension has a structure like the following:
> +be stored. Each extension has a structure like the following::
>
>      Byte  0 -  3:   Header extension type:
>                          0x00000000 - End of the header extension area
> @@ -270,17 +280,19 @@ data of compatible features that it doesn't support. 
> Compatible features that
>  need space for additional data can use a header extension.
>
>
> -== String header extensions ==
> +String header extensions
> +------------------------
>
>  Some header extensions (such as the backing file format name and the external
>  data file name) are just a single string. In this case, the header extension
>  length is the string length and the string is not '\0' terminated. (The 
> header
> -extension padding can make it look like a string is '\0' terminated, but
> +extension padding can make it looks like a string is '\0' terminated, but

The original text is correct: this should be "make it look like".

Sphinx will interpret the '\' in '\0' as an escape, so it renders this
as "'0' terminated". If you write this with the ``...`` for fixed-width
text:
    make it look like a string is ``\0`` terminated
then Sphinx will output the backslash as a literal in the output.


> @@ -377,35 +392,42 @@ Logically the layout looks like
>
>    +-----------------------------+
>    | QCow2 header                |
> +  +-----------------------------+
>    | QCow2 header extension X    |
> +  +-----------------------------+
>    | QCow2 header extension FDE  |
> +  +-----------------------------+
>    | QCow2 header extension ...  |
> +  +-----------------------------+
>    | QCow2 header extension Z    |
>    +-----------------------------+
> +  | ...                         |
> +  +-----------------------------+
> +  | ...                         |
> +  +-----------------------------+
>    | ....other QCow2 tables....  |
> -  .                             .
> -  .                             .
>    +-----------------------------+
> -  | +-------------------------+ |
> -  | | LUKS partition header   | |
> -  | +-------------------------+ |
> -  | | LUKS key material 1     | |
> -  | +-------------------------+ |
> -  | | LUKS key material 2     | |
> -  | +-------------------------+ |
> -  | | LUKS key material ...   | |
> -  | +-------------------------+ |
> -  | | LUKS key material 8     | |
> -  | +-------------------------+ |
> +  | +------------------------+  |
> +  | | LUKS partition header  |  |
> +  | +------------------------+  |
> +  | | LUKS key material 1    |  |
> +  | +------------------------+  |
> +  | | LUKS key material 2    |  |
> +  | +------------------------+  |
> +  | | LUKS key material ...  |  |
> +  | +------------------------+  |
> +  | | LUKS key material 8    |  |
> +  | +------------------------+  |
> +  +-----------------------------+

This does not seem to render as a nested table.

Probably the simplest thing is to use the "::" syntax to
keep this as ASCII art, similar to the way you've handled
the other fixed-width tables in this document.

> +  |   QCow2 cluster payload     |
> +  +-----------------------------+
> +  |                             |
>    +-----------------------------+
> -  | QCow2 cluster payload       |
> -  .                             .
> -  .                             .
> -  .                             .
>    |                             |
>    +-----------------------------+
>

>
> -Refcount block entry (x = refcount_bits - 1):
> +Refcount block entry (x = refcount_bits - 1)::

You could put ``(x = refcount_bits - 1)`` to make the code fragment
render in monospace.


> -Compressed Clusters Descriptor (x = 62 - (cluster_bits - 8)):
> +Compressed Clusters Descriptor (x = 62 - (cluster_bits - 8))::

and similarly here.

thanks
-- PMM

Reply via email to