One of the usecases of iohelper is to read from pipe and write to file with O_DIRECT. As we read from pipe we can have partial read and then we fail to write this data because output file is open with O_DIRECT and buffer size is not aligned. --- src/util/iohelper.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/util/iohelper.c b/src/util/iohelper.c index 5416d45..bb8a8dd 100644 --- a/src/util/iohelper.c +++ b/src/util/iohelper.c @@ -109,9 +109,21 @@ runIO(const char *path, int fd, int oflags) while (1) { ssize_t got; - if ((got = read(fdin, buf, buflen)) < 0) { - if (errno == EINTR) + /* If we read with O_DIRECT from file we can't use saferead as + * it can lead to unaligned read after reading last bytes. + * If we write with O_DIRECT use should use saferead so that + * writes will be aligned. + * In other cases using saferead reduces number of syscalls. + */ + if (fdin == fd && direct) { + if ((got = read(fdin, buf, buflen)) < 0 && + errno == EINTR) continue; + } else { + got = saferead(fdin, buf, buflen); + } + + if (got < 0) { virReportSystemError(errno, _("Unable to read %s"), fdinname); goto cleanup; } -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list