qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] Question about cow format with hexdump


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] Question about cow format with hexdump
Date: Wed, 3 Sep 2014 11:59:43 +0100
User-agent: Mutt/1.5.23 (2014-03-12)

On Wed, Sep 03, 2014 at 01:27:00PM +0800, shhuiw wrote:
> I'm reading the source code of cow.c: 
> https://github.com/qemu/qemu/blob/master/block/cow.c
> and try to understand the format better.

The 'cow' format is an old format that is rarely used.  It's not a good
example.

qcow2 is actively developed and performs better.  Unfortunately it is a
lot more complex.

> I created a cow format imagefile and can run 'qume-img info' to query the 
> header info
> -------------------------------------------------------------------------------
> -bash-4.1$ qemu-img create -f cow dummy 1M
> Formatting 'test/dummy', fmt=cow size=1048576 
> -bash-4.1$ qemu-img info dummy 
> image: dummy
> file format: cow
> virtual size: 1.0M (1048576 bytes)
> disk size: 4.0K
> 
> 
> But when I used hexdump to dis the header part, I cannot find all info 
> recorded:
> (compared the define of struct cow_header_v2 and cow_create())
> ------------------------------------------------------------------------------
> 1) recognize the magic and version info:
> -bash-4.1$ hexdump -C dummy -n 8
> 00000000  4f 4f 4f 4d 00 00 00 02                           |OOOM....|
> 00000008
> 
> 2) backing_file and mtime fields are 0s:                                      
>       # I think the "dummy" should be recorded
> -bash-4.1$ hexdump -C dummy -n 1032
> 00000000  4f 4f 4f 4d 00 00 00 02  00 00 00 00 00 00 00 00  |OOOM............|
> 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> *
> 00000400  00 00 00 00 00 00 00 00                           |........|
> 00000408
> -bash-4.1$ hexdump -C dummy -n 1036
> 00000000  4f 4f 4f 4d 00 00 00 02  00 00 00 00 00 00 00 00  |OOOM............|
> 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> *
> 00000400  00 00 00 00 00 00 00 00  00 00 00 00              |............|
> 0000040c
> 
> 3) size field is 0s:
> -bash-4.1$ hexdump -C dummy -n 1044                                           
>      # size should be 1M
> 00000000  4f 4f 4f 4d 00 00 00 02  00 00 00 00 00 00 00 00  |OOOM............|
> 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
> *
> 00000410  00 00 00 00                                       |....|
> 00000414

$ sudo yum install dwarves
$ pahole block/cow.o
...
struct cow_header_v2 {
        uint32_t                   magic;                /*     0     4 */
        uint32_t                   version;              /*     4     4 */
        char                       backing_file[1024];   /*     8  1024 */
        /* --- cacheline 16 boundary (1024 bytes) was 8 bytes ago --- */
        int32_t                    mtime;                /*  1032     4 */

        /* XXX 4 bytes hole, try to pack */

        uint64_t                   size;                 /*  1040     8 */
        uint32_t                   sectorsize;           /*  1048     4 */

        /* size: 1056, cachelines: 17, members: 6 */
        /* sum members: 1048, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* last cacheline: 32 bytes */
};

Ooops, the compiler has inserted padding into the struct because the
size field was not aligned.

We can't change this because QEMU must stay backwards compatible.

Stefan

Attachment: pgpruMXYHlrd7.pgp
Description: PGP signature


reply via email to

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