From: Haomai Wang Date: Mon, 25 Jan 2016 15:18:58 +0000 (+0800) Subject: configure.ac: add pwritev check X-Git-Tag: v10.1.0~418^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b1e27a59c76a39e9cdcc85f3ed712ca74f45d2f0;p=ceph.git configure.ac: add pwritev check Signed-off-by: Haomai Wang --- 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;