qemu-img: conditionally zero out target on convert

If the target has_zero_init = 0, but supports efficiently
writing zeroes by unmapping we call bdrv_make_zero to
avoid fully allocating the target. This currently works
only for iscsi.  It can be extended to raw with
BLKDISCARDZEROES for example.

Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Peter Lieven <pl@kamp.de>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
stable-2.0
Peter Lieven 2013-10-24 12:07:06 +02:00 committed by Kevin Wolf
parent 11b6699af5
commit 5a37b60a61
1 changed files with 9 additions and 1 deletions

View File

@ -1355,7 +1355,7 @@ static int img_convert(int argc, char **argv)
}
}
flags = BDRV_O_RDWR;
flags = min_sparse ? (BDRV_O_RDWR | BDRV_O_UNMAP) : BDRV_O_RDWR;
ret = bdrv_parse_cache_flags(cache, &flags);
if (ret < 0) {
error_report("Invalid cache option: %s", cache);
@ -1471,6 +1471,14 @@ static int img_convert(int argc, char **argv)
} else {
int has_zero_init = min_sparse ? bdrv_has_zero_init(out_bs) : 0;
if (!has_zero_init && bdrv_can_write_zeroes_with_unmap(out_bs)) {
ret = bdrv_make_zero(out_bs, BDRV_REQ_MAY_UNMAP);
if (ret < 0) {
goto out;
}
has_zero_init = 1;
}
sector_num = 0; // total number of sectors converted so far
nb_sectors = total_sectors - sector_num;
if (nb_sectors != 0) {