diff options
author | Max Reitz <mreitz@redhat.com> | 2019-05-09 19:52:36 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2019-05-10 16:45:40 +0200 |
commit | 1c6e87799252d166426f642c00be8927b68ab164 (patch) | |
tree | 5c661f17867fdba8be5c26d285e974297b7dfca0 /qemu-img.c | |
parent | 35ddd9300b81b70171da10134c36a7e22c845f16 (diff) |
qemu-img: Use zero writes after source backing EOF
Past the end of the source backing file, we memset() buf_old to zero, so
it is clearly easy to use blk_pwrite_zeroes() instead of blk_pwrite()
then.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'qemu-img.c')
-rw-r--r-- | qemu-img.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/qemu-img.c b/qemu-img.c index cfa44b4153..28fba1e7a7 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -3432,6 +3432,8 @@ static int img_rebase(int argc, char **argv) } for (offset = 0; offset < size; offset += n) { + bool buf_old_is_zero = false; + /* How many bytes can we handle with the next read? */ n = MIN(IO_BUF_SIZE, size - offset); @@ -3452,6 +3454,7 @@ static int img_rebase(int argc, char **argv) */ if (offset >= old_backing_size) { memset(buf_old, 0, n); + buf_old_is_zero = true; } else { if (offset + n > old_backing_size) { n = old_backing_size - offset; @@ -3487,8 +3490,12 @@ static int img_rebase(int argc, char **argv) if (compare_buffers(buf_old + written, buf_new + written, n - written, &pnum)) { - ret = blk_pwrite(blk, offset + written, - buf_old + written, pnum, 0); + if (buf_old_is_zero) { + ret = blk_pwrite_zeroes(blk, offset + written, pnum, 0); + } else { + ret = blk_pwrite(blk, offset + written, + buf_old + written, pnum, 0); + } if (ret < 0) { error_report("Error while writing to COW image: %s", strerror(-ret)); |