[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 2/9] qemu-img: Enable BDRV_REQ_MAY_UNMAP in convert
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PULL 2/9] qemu-img: Enable BDRV_REQ_MAY_UNMAP in convert |
Date: |
Tue, 2 Apr 2019 14:49:00 +0200 |
From: Nir Soffer <address@hidden>
With Kevin's "block: Fix slow pre-zeroing in qemu-img convert"[1]
(commit c9fdcf202f, '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: Nir Soffer <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
qemu-img.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/qemu-img.c b/qemu-img.c
index 76a961df82..aa6f81f1ea 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1756,7 +1756,8 @@ static int coroutine_fn convert_co_write(ImgConvertState
*s, int64_t sector_num,
}
ret = blk_co_pwrite_zeroes(s->target,
sector_num << BDRV_SECTOR_BITS,
- n << BDRV_SECTOR_BITS, 0);
+ n << BDRV_SECTOR_BITS,
+ BDRV_REQ_MAY_UNMAP);
if (ret < 0) {
return ret;
}
--
2.20.1
- [Qemu-block] [PULL 0/9] Block layer patches, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 1/9] iotests: Fix test 200 on s390x without virtio-pci, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 2/9] qemu-img: Enable BDRV_REQ_MAY_UNMAP in convert,
Kevin Wolf <=
- [Qemu-block] [PULL 5/9] block/file-posix: do not fail on unlock bytes, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 3/9] block/gluster: limit the transfer size to 512 MiB, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 6/9] block: continue until base is found in bdrv_freeze_backing_chain() et al, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 8/9] block: test block-stream with a base node that is used by block-commit, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 7/9] block: freeze the backing chain earlier in stream_start(), Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 4/9] tests/qemu-iotests: Remove redundant COPYING file, Kevin Wolf, 2019/04/02
- [Qemu-block] [PULL 9/9] tests/qemu-iotests/235: Allow fallback to tcg, Kevin Wolf, 2019/04/02
- Re: [Qemu-block] [PULL 0/9] Block layer patches, Peter Maydell, 2019/04/02