提交 05021e72 编写于 作者: N Nikolay Shirokovskiy 提交者: Jiri Denemark

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: NJiri Denemark <jdenemar@redhat.com>
上级 55ac6a5d
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册