From 7166c77ad06b44571398d641e00153145da04a2b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 3 Apr 2009 18:50:34 +0000 Subject: * sysdeps/unix/sysv/linux/readv.c (__libc_readv): Fix calling of compatibility code. * sysdeps/unix/sysv/linux/writev.c (__libc_writev): Likewise. 2009-04-01 Ulrich Drepper --- sysdeps/unix/sysv/linux/writev.c | 41 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 25 deletions(-) (limited to 'sysdeps/unix/sysv/linux/writev.c') diff --git a/sysdeps/unix/sysv/linux/writev.c b/sysdeps/unix/sysv/linux/writev.c index 398a841bb3..55e915d34d 100644 --- a/sysdeps/unix/sysv/linux/writev.c +++ b/sysdeps/unix/sysv/linux/writev.c @@ -37,42 +37,33 @@ static ssize_t __atomic_writev_replacement (int, const struct iovec *, #endif -/* We should deal with kernel which have a smaller UIO_FASTIOV as well - as a very big count. */ -static ssize_t -do_writev (int fd, const struct iovec *vector, int count) -{ - ssize_t bytes_written; - - bytes_written = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), - count); - -#ifdef __ASSUME_COMPLETE_READV_WRITEV - return bytes_written; -#else - if (bytes_written >= 0 || errno != EINVAL || count <= UIO_FASTIOV) - return bytes_written; - - return __atomic_writev_replacement (fd, vector, count); -#endif -} - ssize_t __libc_writev (fd, vector, count) int fd; const struct iovec *vector; int count; { - if (SINGLE_THREAD_P) - return do_writev (fd, vector, count); + ssize_t result; - int oldtype = LIBC_CANCEL_ASYNC (); + if (SINGLE_THREAD_P) + result = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), count); + else + { + int oldtype = LIBC_CANCEL_ASYNC (); - ssize_t result = do_writev (fd, vector, count); + result = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), count); - LIBC_CANCEL_RESET (oldtype); + LIBC_CANCEL_RESET (oldtype); + } +#ifdef __ASSUME_COMPLETE_READV_WRITEV return result; +#else + if (result >= 0 || errno != EINVAL || count <= UIO_FASTIOV) + return result; + + return __atomic_writev_replacement (fd, vector, count); +#endif } strong_alias (__libc_writev, __writev) weak_alias (__libc_writev, writev) -- cgit 1.4.1