[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] Re: [PATCH v4 1/5] docs: Add QED image format specifica
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-devel] Re: [PATCH v4 1/5] docs: Add QED image format specification |
Date: |
Fri, 12 Nov 2010 14:04:54 +0000 |
On Fri, Nov 12, 2010 at 1:58 PM, Kevin Wolf <address@hidden> wrote:
> Am 28.10.2010 13:01, schrieb Stefan Hajnoczi:
>> Signed-off-by: Stefan Hajnoczi <address@hidden>
>> ---
>> docs/specs/qed_spec.txt | 128
>> +++++++++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 128 insertions(+), 0 deletions(-)
>> create mode 100644 docs/specs/qed_spec.txt
>>
>> diff --git a/docs/specs/qed_spec.txt b/docs/specs/qed_spec.txt
>> new file mode 100644
>> index 0000000..e4425c8
>> --- /dev/null
>> +++ b/docs/specs/qed_spec.txt
>> @@ -0,0 +1,128 @@
>> +=Specification=
>> +
>> +The file format looks like this:
>> +
>> + +----------+----------+----------+-----+
>> + | cluster0 | cluster1 | cluster2 | ... |
>> + +----------+----------+----------+-----+
>> +
>> +The first cluster begins with the '''header'''. The header contains
>> information about where regular clusters start; this allows the header to be
>> extensible and store extra information about the image file. A regular
>> cluster may be a '''data cluster''', an '''L2''', or an '''L1 table'''. L1
>> and L2 tables are composed of one or more contiguous clusters.
>> +
>> +Normally the file size will be a multiple of the cluster size. If the file
>> size is not a multiple, extra information after the last cluster may not be
>> preserved if data is written. Legitimate extra information should use space
>> between the header and the first regular cluster.
>> +
>> +All fields are little-endian.
>> +
>> +==Header==
>> + Header {
>> + uint32_t magic; /* QED\0 */
>> +
>> + uint32_t cluster_size; /* in bytes */
>> + uint32_t table_size; /* for L1 and L2 tables, in clusters */
>> + uint32_t header_size; /* in clusters */
>> +
>> + uint64_t features; /* format feature bits */
>> + uint64_t compat_features; /* compat feature bits */
>> + uint64_t l1_table_offset; /* in bytes */
>> + uint64_t image_size; /* total logical image size, in bytes */
>> +
>> + /* if (features & QED_F_BACKING_FILE) */
>> + uint32_t backing_filename_offset; /* in bytes from start of header */
>> + uint32_t backing_filename_size; /* in bytes */
>> + }
>> +
>> +Field descriptions:
>> +* ''cluster_size'' must be a power of 2 in range [2^12, 2^26].
>> +* ''table_size'' must be a power of 2 in range [1, 16].
>> +* ''header_size'' is the number of clusters used by the header and any
>> additional information stored before regular clusters.
>> +* ''features'', ''compat_features'', and ''autoclear_features'' are file
>> format extension bitmaps. They work as follows:
>> +** An image with unknown ''features'' bits enabled must not be opened.
>> File format changes that are not backwards-compatible must use ''features''
>> bits.
>> +** An image with unknown ''compat_features'' bits enabled can be opened
>> safely. The unknown features are simply ignored and represent
>> backwards-compatible changes to the file format.
>> +** An image with unknown ''autoclear_features'' bits enable can be opened
>> safely after clearing the unknown bits. This allows for
>> backwards-compatible changes to the file format which degrade gracefully and
>> can be re-enabled again by a new program later.
>
> autoclear features aren't even part of the header in the spec.
Thanks for spotting this, I forgot to sync the header with the code.
>> +* ''l1_table_offset'' is the offset of the first byte of the L1 table in
>> the image file and must be a multiple of ''cluster_size''.
>> +* ''image_size'' is the block device size seen by the guest and must be a
>> multiple of 512 bytes.
>> +* ''backing_filename'' is a string in (byte offset, byte size) form. It is
>> not NUL-terminated and has no alignment constraints.
>> +
>> +Feature bits:
>> +* QED_F_BACKING_FILE = 0x01. The image uses a backing file. The backing
>> filename string is given in the ''backing_filename_{offset,size}'' fields
>> and may be an absolute path or relative to the image file.
>> +* QED_F_NEED_CHECK = 0x02. The image needs a consistency check before use.
>> +* QED_F_BACKING_FORMAT_NO_PROBE = 0x04. The backing file is a raw disk
>> image and no file format autodetection should be attempted. This should be
>> used to ensure that raw backing images are never detected as an image format
>> if they happen to contain magic constants.
>> +
>> +There are currently no defined ''compat_features'' or
>> ''autoclear_features'' bits.
>> +
>> +Fields predicated on a feature bit are only used when that feature is set.
>> The fields always take up header space, regardless of whether or not the
>> feature bit is set.
>> +
>> +==Tables==
>> +
>> +Tables provide the translation from logical offsets in the block device to
>> cluster offsets in the file.
>> +
>> + #define TABLE_NOFFSETS (table_size * cluster_size / sizeof(uint64_t))
>> +
>> + Table {
>> + uint64_t offsets[TABLE_NOFFSETS];
>> + }
>> +
>> +The tables are organized as follows:
>> +
>> + +----------+
>> + | L1 table |
>> + +----------+
>> + ,------' | '------.
>> + +----------+ | +----------+
>> + | L2 table | ... | L2 table |
>> + +----------+ +----------+
>> + ,------' | '------.
>> + +----------+ | +----------+
>> + | Data | ... | Data |
>> + +----------+ +----------+
>> +
>> +A table is made up of one or more contiguous clusters. The table_size
>> header field determines table size for an image file. For example,
>> cluster_size=64 KB and table_size=4 results in 256 KB tables.
>> +
>> +The logical image size must be less than or equal to the maximum possible
>> size of clusters rooted by the L1 table:
>> + header.image_size <= TABLE_NOFFSETS * TABLE_NOFFSETS * header.cluster_size
>> +
>> +All offsets in L1 and L2 tables are cluster-aligned. The least significant
>> bits up to ''cluster_size'' are reserved and must be zero.
>
> I know what you mean here, but the text leaves things a bit unclear.
> First I would expect a bit number instead of a byte offset for "bits up
> to x". Second, cluster_size is the first bit not reserved, whereas your
> description sounds to me as if it included cluster_size.
Will fix.
Stefan