On 09/20/2017 10:31 AM, Daniel P. Berrange wrote: > The iohelper currently calls saferead() to get data from the > underlying file. This has a problem with O_DIRECT when hitting > end-of-file. saferead() is asked to read 1MB, but the first > read() it does may return only a few KB, so it'll try another > read() to fill the remaining buffer. Unfortunately the buffer > pointer passed into this 2nd read() is likely not aligned > to the extent that O_DIRECT requires, so rather than seeing > '0' for end-of-file, we'll get -1 + EINVAL due to misaligned > buffer. > > The way the iohelper is currently written, it already handles > getting short reads, so there is actually no need to use > saferead() at all. We can simply call read() directly. The > benefit of this is that we can now write() the data immediately > so when we go into the subsequent reads() we'll always have a > correctly aligned buffer. > > Technically the file position ought to be aligned for O_DIRECT > too, but this does not appear to matter when at end-of-file. > > Tested-by: Nikolay Shirokovskiy <[email protected]> > Signed-off-by: Daniel P. Berrange <[email protected]> > --- > src/util/iohelper.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-)
Reviewed-by: Eric Blake <[email protected]> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
