diff options
author | Antoine Damhet <antoine.damhet@blade-group.com> | 2020-07-17 15:56:04 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2020-07-21 16:28:57 +0200 |
commit | bae127d4dcf6158c5042e2eee9582430839a9967 (patch) | |
tree | 6919befe979e743830757f1d820baa06831f98bb /block | |
parent | 90218a9a393c7925f330e7dcc08658e2a01d3bd4 (diff) | |
download | qemu-bae127d4dcf6158c5042e2eee9582430839a9967.zip qemu-bae127d4dcf6158c5042e2eee9582430839a9967.tar.gz qemu-bae127d4dcf6158c5042e2eee9582430839a9967.tar.bz2 |
file-posix: Handle `EINVAL` fallocate return value
The `detect-zeroes=unmap` option may issue unaligned
`FALLOC_FL_PUNCH_HOLE` requests, raw block devices can (and will) return
`EINVAL`, qemu should then write the zeroes to the blockdev instead of
issuing an `IO_ERROR`.
The problem can be reprodced like this:
$ qemu-io -c 'write -P 0 42 1234' --image-opts driver=host_device,filename=/dev/loop0,detect-zeroes=unmap
write failed: Invalid argument
Signed-off-by: Antoine Damhet <antoine.damhet@blade-group.com>
Message-Id: <20200717135603.51180-1-antoine.damhet@blade-group.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/file-posix.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/block/file-posix.c b/block/file-posix.c index 8cc39a1..9a00d41 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1698,7 +1698,11 @@ static int handle_aiocb_write_zeroes_unmap(void *opaque) #ifdef CONFIG_FALLOCATE_PUNCH_HOLE int ret = do_fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, aiocb->aio_offset, aiocb->aio_nbytes); - if (ret != -ENOTSUP) { + switch (ret) { + case -ENOTSUP: + case -EINVAL: + break; + default: return ret; } #endif |