A customer reported that running qemu-img convert -t none -O qcow2 -f qcow2 input.qcow2 output.qcow2
fails for them with the following error message when the images are stored on a GPFS file system: qemu-img: error while writing sector 0: Invalid argument After analyzing the strace output, it seems like the problem is in handle_aiocb_write_zeroes(): The call to fallocate(FALLOC_FL_PUNCH_HOLE) returns EINVAL, which can apparently happen if the file system has a different idea of the granularity of the operation. It's arguably a bug in GPFS, since the PUNCH_HOLE mode should not result in EINVAL according to the man-page of fallocate(), but the file system is out there in production and so we have to deal with it. In commit 294682cc3a ("block: workaround for unaligned byte range in fallocate()") we also already applied the a work-around for the same problem to the earlier fallocate(FALLOC_FL_ZERO_RANGE) call, so do it now similar with the PUNCH_HOLE call. Signed-off-by: Thomas Huth <th...@redhat.com> --- block/file-posix.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/block/file-posix.c b/block/file-posix.c index 20e14f8e96..7a40428d52 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1675,6 +1675,13 @@ static int handle_aiocb_write_zeroes(void *opaque) } s->has_fallocate = false; } else if (ret != -ENOTSUP) { + if (ret == -EINVAL) { + /* + * File systems like GPFS do not like unaligned byte ranges, + * treat it like unsupported (so caller falls back to pwrite) + */ + return -ENOTSUP; + } return ret; } else { s->has_discard = false; -- 2.27.0