diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/readv.c | 41 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/writev.c | 41 |
3 files changed, 37 insertions, 51 deletions
@@ -1,5 +1,9 @@ 2009-04-03 Ulrich Drepper <drepper@redhat.com> + * sysdeps/unix/sysv/linux/readv.c (__libc_readv): Fix calling of + compatibility code. + * sysdeps/unix/sysv/linux/writev.c (__libc_writev): Likewise. + * sysdeps/unix/sysv/linux/kernel-features.h: Define __ASSUME_COMPLETE_READV_WRITEV. * sysdeps/unix/sysv/linux/readv.c: No need for userlevel fallback @@ -41,7 +45,7 @@ (R_SPARC_NUM): Update. From Dave Miller <davem@davemloft.net>. -c2009-04-01 Ulrich Drepper <drepper@redhat.com> +2009-04-01 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/sys/eventfd.h (EFD_SEMAPHORE): Define. 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) diff --git a/sysdeps/unix/sysv/linux/writev.c b/sysdeps/unix/sysv/linux/writev.c index 398a841..55e915d 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) |