From: Nikolay Shirokovskiy Date: Thu, 28 Sep 2017 07:06:47 +0000 (+0300) Subject: iohelper: use saferead if later write with O_DIRECT X-Git-Tag: v3.9.0-rc1~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05021e727d80527c4b53debed98b87b565780a16;p=thirdparty%2Flibvirt.git iohelper: use saferead if later write with O_DIRECT 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. Signed-off-by: Jiri Denemark --- diff --git a/src/util/iohelper.c b/src/util/iohelper.c index 5416d45066..bb8a8dde69 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; }