mirror of https://gitee.com/openkylin/qemu.git
raw-posix: fix O_DIRECT short reads
The following O_DIRECT read from a <512 byte file fails: $ truncate -s 320 test.img $ qemu-io -n -c 'read -P 0 0 512' test.img qemu-io: can't open device test.img: Could not read image for determining its format: Invalid argument Note that qemu-io completes successfully without the -n (O_DIRECT) option. This patch fixes qemu-iotests ./check -nocache -vmdk 059. Cc: qemu-stable@nongnu.org Suggested-by: Kevin Wolf <kwolf@redhat.com> Reported-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
d832fb4d66
commit
61ed73cff4
|
@ -747,6 +747,15 @@ static ssize_t handle_aiocb_rw_linear(RawPosixAIOData *aiocb, char *buf)
|
||||||
}
|
}
|
||||||
if (len == -1 && errno == EINTR) {
|
if (len == -1 && errno == EINTR) {
|
||||||
continue;
|
continue;
|
||||||
|
} else if (len == -1 && errno == EINVAL &&
|
||||||
|
(aiocb->bs->open_flags & BDRV_O_NOCACHE) &&
|
||||||
|
!(aiocb->aio_type & QEMU_AIO_WRITE) &&
|
||||||
|
offset > 0) {
|
||||||
|
/* O_DIRECT pread() may fail with EINVAL when offset is unaligned
|
||||||
|
* after a short read. Assume that O_DIRECT short reads only occur
|
||||||
|
* at EOF. Therefore this is a short read, not an I/O error.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
} else if (len == -1) {
|
} else if (len == -1) {
|
||||||
offset = -errno;
|
offset = -errno;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue