Skip to content
  • MORITA Kazutaka's avatar
    block: Produce zeros when protocols reading beyond end of file · 893a8f62
    MORITA Kazutaka authored
    While Asias is debugging an issue creating qcow2 images on top of
    non-file protocols.  It boils down to this example using NBD:
    
    $ qemu-io -c 'open -g nbd+unix:///?socket=/tmp/nbd.sock' -c 'read -v 0 512'
    
    Notice the open -g option to set bs->growable.  This means you can
    read/write beyond end of file.  Reading beyond end of file is supposed
    to produce zeroes.
    
    We rely on this behavior in qcow2_create2() during qcow2 image
    creation.  We create a new file and then write the qcow2 header
    structure using bdrv_pwrite().  Since QCowHeader is not a multiple of
    sector size, block.c first uses bdrv_read() on the empty file to fetch
    the first sector (should be all zeroes).
    
    Here is the output from the qemu-io NBD example above:
    
    $ qemu-io -c 'open -g nbd+unix:///?socket=/tmp/nbd.sock
    
    ' -c 'read -v 0 512'
    00000000:  ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab  ................
    00000010:  ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab  ................
    00000020:  ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab  ................
    ...
    
    We are not zeroing the buffer!  As a result qcow2 image creation on top
    of protocols is not guaranteed to work even when file creation is
    supported by the protocol.
    
    [Adapted this patch to use bs->zero_beyond_eof.
    -- Stefan]
    
    Signed-off-by: default avatarMORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
    Signed-off-by: default avatarAsias He <asias@redhat.com>
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    893a8f62