diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2014-08-21 13:44:07 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2014-08-22 11:00:56 +0200 |
commit | 61ed73cff427206b3a959b18a4877952f566279b (patch) | |
tree | cb2d7b74168ca5023b3359df57de5eb0f2781d96 /block/raw-posix.c | |
parent | d832fb4d66ead62da4af7e44cce34cd939e865e1 (diff) |
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>
Diffstat (limited to 'block/raw-posix.c')
-rw-r--r-- | block/raw-posix.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/block/raw-posix.c b/block/raw-posix.c index 5c745b9a18..d737f3a0c5 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -747,6 +747,15 @@ static ssize_t handle_aiocb_rw_linear(RawPosixAIOData *aiocb, char *buf) } if (len == -1 && errno == EINTR) { 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) { offset = -errno; break; |