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: Kevin Wolf
Subject: Re: [Qemu-devel] Question about cow format with hexdump
Date: Wed, 3 Sep 2014 17:35:02 +0200
User-agent: Mutt/1.5.21 (2010-09-15)

Am 03.09.2014 um 12:59 hat Stefan Hajnoczi geschrieben:
> 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.

We can at least make it explicit like I did for qcow1 in ea54feff.

Kevin

Attachment: pgptMODJd6iRY.pgp
Description: PGP signature


reply via email to

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