Skip to content
  • Nir Soffer's avatar
    qemu-img: Enable BDRV_REQ_MAY_UNMAP in convert · a3d6ae22
    Nir Soffer authored and Kevin Wolf's avatar Kevin Wolf committed
    With Kevin's "block: Fix slow pre-zeroing in qemu-img convert"[1]
    (commit c9fdcf20, 'qemu-img: Use BDRV_REQ_NO_FALLBACK for
    pre-zeroing') we skip the pre zero step called like this:
    
        blk_make_zero(s->target, BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK)
    
    And we write zeroes later using:
    
        blk_co_pwrite_zeroes(s->target,
                             sector_num << BDRV_SECTOR_BITS,
                             n << BDRV_SECTOR_BITS, 0);
    
    Since we use flags=0, this is translated to NBD_CMD_WRITE_ZEROES with
    NBD_CMD_FLAG_NO_HOLE flag, which cause the NBD server to allocated space
    instead of punching a hole.
    
    Here is an example failure:
    
    $ dd if=/dev/urandom of=src.img bs=1M count=5
    $ truncate -s 50m src.img
    $ truncate -s 50m dst.img
    $ nbdkit -f -v -e '' -U nbd.sock file file=dst.img
    
    $ ./qemu-img convert -n src.img nbd:unix:nbd.sock
    
    We can see in nbdkit log that it received the NBD_CMD_FLAG_NO_HOLE
    (may_trim=0):
    
    nbdkit: file[1]: debug: newstyle negotiation: flags: export 0x4d
    nbdkit: file[1]: debug: pwrite count=2097152 offset=0
    nbdkit: file[1]: debug: pwrite count=2097152 offset=2097152
    nbdkit: file[1]: debug: pwrite count=1048576 offset=4194304
    nbdkit: file[1]: debug: zero count=33554432 offset=5242880 may_trim=0
    nbdkit: file[1]: debug: zero count=13631488 offset=38797312 may_trim=0
    nbdkit: file[1]: debug: flush
    
    And the image became fully allocated:
    
    $ qemu-img info dst.img
    virtual size: 50M (52428800 bytes)
    disk size: 50M
    
    With this change we see that nbdkit did not receive the
    NBD_CMD_FLAG_NO_HOLE (may_trim=1):
    
    nbdkit: file[1]: debug: newstyle negotiation: flags: export 0x4d
    nbdkit: file[1]: debug: pwrite count=2097152 offset=0
    nbdkit: file[1]: debug: pwrite count=2097152 offset=2097152
    nbdkit: file[1]: debug: pwrite count=1048576 offset=4194304
    nbdkit: file[1]: debug: zero count=33554432 offset=5242880 may_trim=1
    nbdkit: file[1]: debug: zero count=13631488 offset=38797312 may_trim=1
    nbdkit: file[1]: debug: flush
    
    And the file is sparse as expected:
    
    $ qemu-img info dst.img
    virtual size: 50M (52428800 bytes)
    disk size: 5.0M
    
    [1] http://lists.nongnu.org/archive/html/qemu-block/2019-03/msg00761.html
    
    
    
    Signed-off-by: default avatarNir Soffer <nsoffer@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    a3d6ae22