Message ID | 1408625048-21994-2-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
The Thursday 21 Aug 2014 à 13:44:07 (+0100), Stefan Hajnoczi wrote : > 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. > > Suggested-by: Kevin Wolf <kwolf@redhat.com> > Reported-by: Markus Armbruster <armbru@redhat.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > block/raw-posix.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/block/raw-posix.c b/block/raw-posix.c > index 1194eb0..a48ce91 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; > -- > 1.9.3 > > Reviewed-by: Benoît Canet <benoit.canet@nodalink.com>
diff --git a/block/raw-posix.c b/block/raw-posix.c index 1194eb0..a48ce91 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;
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. Suggested-by: Kevin Wolf <kwolf@redhat.com> Reported-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- block/raw-posix.c | 9 +++++++++ 1 file changed, 9 insertions(+)