From b1e27a59c76a39e9cdcc85f3ed712ca74f45d2f0 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Mon, 25 Jan 2016 23:18:58 +0800 Subject: [PATCH] configure.ac: add pwritev check Signed-off-by: Haomai Wang --- configure.ac | 1 + src/common/buffer.cc | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 57d73e236010..908319b1a29c 100644 --- a/configure.ac +++ b/configure.ac @@ -1065,6 +1065,7 @@ AC_CHECK_HEADERS([sys/prctl.h]) AC_CHECK_FUNCS([prctl]) AC_CHECK_FUNCS([pipe2]) AC_CHECK_FUNCS([posix_fadvise]) +AC_CHECK_FUNCS([pwritev], AC_DEFINE([HAVE_PWRITEV], [1], [we have pwritev])) AC_MSG_CHECKING([for fdatasync]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 0cea23f9ba3e..ee50c0efabfd 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1954,8 +1954,18 @@ int buffer::list::write_file(const char *fn, int mode) static int do_writev(int fd, struct iovec *vec, uint64_t offset, unsigned veclen, unsigned bytes) { + ssize_t r = 0; while (bytes > 0) { - ssize_t r = ::pwritev(fd, vec, veclen, offset); +#ifdef HAVE_PWRITEV + r = ::pwritev(fd, vec, veclen, offset); +#else + r = ::lseek64(fd, offset, SEEK_SET); + if (r != offset) { + r = -errno; + return r; + } + r = ::writev(fd, vec, veclen); +#endif if (r < 0) { if (errno == EINTR) continue; -- 2.47.3