From: Andrey Drobyshev <[email protected]> In case we're truncating an image opened with O_DIRECT, we might get -EINVAL on write with unaligned buffer. In particular, when running iotests/298 with '-nocache' we get:
qemu-io: Failed to resize underlying file: Could not write zeros for preallocation: Invalid argument Let's just allocate the buffer using qemu_blockalign0() instead. Signed-off-by: Andrey Drobyshev <[email protected]> Reviewed-by: Denis V. Lunev <[email protected]> Reviewed-by: Vladimir Sementsov-Ogievskiy <[email protected]> Message-ID: <[email protected]> Reviewed-by: Kevin Wolf <[email protected]> Signed-off-by: Kevin Wolf <[email protected]> --- block/file-posix.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 9aad156aad4..39d6a34456c 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -2366,7 +2366,7 @@ static int handle_aiocb_truncate(void *opaque) RawPosixAIOData *aiocb = opaque; int result = 0; int64_t current_length = 0; - char *buf = NULL; + QEMU_AUTO_VFREE char *buf = NULL; struct stat st; int fd = aiocb->aio_fildes; int64_t offset = aiocb->aio_offset; @@ -2433,7 +2433,7 @@ static int handle_aiocb_truncate(void *opaque) goto out; } - buf = g_malloc0(65536); + buf = qemu_blockalign0(aiocb->bs, 65536); seek_result = lseek(fd, current_length, SEEK_SET); if (seek_result < 0) { @@ -2492,7 +2492,6 @@ out: } } - g_free(buf); return result; } -- 2.56.0
