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/readv.c | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) (limited to 'sysdeps/unix/sysv/linux/readv.c') diff --git a/sysdeps/unix/sysv/linux/readv.c b/sysdeps/unix/sysv/linux/readv.c index d12fa49..bff4a3f 100644 --- a/sysdeps/unix/sysv/linux/readv.c +++ b/sysdeps/unix/sysv/linux/readv.c @@ -37,42 +37,33 @@ static ssize_t __atomic_readv_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_readv (int fd, const struct iovec *vector, int count) -{ - ssize_t bytes_read; - - bytes_read = INLINE_SYSCALL (readv, 3, fd, CHECK_N (vector, count), count); - -#ifdef __ASSUME_COMPLETE_READV_WRITEV - return bytes_read; -#else - if (bytes_read >= 0 || errno != EINVAL || count <= UIO_FASTIOV) - return bytes_read; - - return __atomic_readv_replacement (fd, vector, count); -#endif -} - - ssize_t __libc_readv (fd, vector, count) int fd; const struct iovec *vector; int count; { - if (SINGLE_THREAD_P) - return do_readv (fd, vector, count); + ssize_t result; - int oldtype = LIBC_CANCEL_ASYNC (); + if (SINGLE_THREAD_P) + result = INLINE_SYSCALL (readv, 3, fd, CHECK_N (vector, count), count); + else + { + int oldtype = LIBC_CANCEL_ASYNC (); - int result = do_readv (fd, vector, count); + result = INLINE_SYSCALL (readv, 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_readv_replacement (fd, vector, count); +#endif } strong_alias (__libc_readv, __readv) weak_alias (__libc_readv, readv) -- cgit v1.1