diff --git a/Makerules b/Makerules
index 7656c492da..f23f5b7896 100644
--- a/Makerules
+++ b/Makerules
@@ -1513,8 +1513,7 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
 		   $(common-objpfx)config.make
 	$(make-target-directory)
 	{ echo '#include "$(..)posix/bits/posix1_lim.h"';		\
-	  echo '#define _LIBC 1';					\
-	  echo '#include "$(..)misc/sys/uio.h"'; } |			\
+	} |								\
 	$(CC) -E -dM -MD -MP -MF $(@:st=dT) -MT '$(@:st=h) $(@:st=d)' 	\
 	      $(CPPUNDEFS) $(+includes) -xc - -o $(@:st=hT)
 	sed $(sed-remove-objpfx) $(sed-remove-dotdot)			\
@@ -1522,21 +1521,14 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
 	mv -f $(@:st=dt) $(@:st=d)
 	fopen_max=`sed -n 's/^#define OPEN_MAX //1p' $(@:st=hT)`; 	\
 	filename_max=`sed -n 's/^#define PATH_MAX //1p' $(@:st=hT)`;	\
-	iov_max=`sed -n 's/^#define UIO_MAXIOV //p' $(@:st=hT)`;	\
 	fopen_max=$${fopen_max:-16};					\
 	filename_max=$${filename_max:-1024};				\
-	if [ -z "$$iov_max" ]; then					\
-	  define_iov_max="# undef IOV_MAX";				\
-	else								\
-	  define_iov_max="# define IOV_MAX $$iov_max";			\
-	fi;								\
 	sed -e "s/@FOPEN_MAX@/$$fopen_max/"				\
 	    -e "s/@FILENAME_MAX@/$$filename_max/"			\
 	    -e "s/@L_tmpnam@/$(L_tmpnam)/"				\
 	    -e "s/@TMP_MAX@/$(TMP_MAX)/"				\
 	    -e "s/@L_ctermid@/$(L_ctermid)/"				\
 	    -e "s/@L_cuserid@/$(L_cuserid)/"				\
-	    -e "s/@define_IOV_MAX@/$$define_iov_max/"			\
 	    $< > $(@:st=h.new)
 	$(move-if-change) $(@:st=h.new) $(@:st=h)
 # Remove these last so that they can be examined if something went wrong.
diff --git a/bits/uio.h b/bits/uio_lim.h
similarity index 79%
rename from bits/uio.h
rename to bits/uio_lim.h
index 96a3a71d42..f6919f093c 100644
--- a/bits/uio.h
+++ b/bits/uio_lim.h
@@ -15,9 +15,11 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UIO_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
+#ifndef _BITS_UIO_LIM_H
+#define _BITS_UIO_LIM_H 1
+
+/* Maximum length of the 'struct iovec' array in a single call to
+   readv or writev.  If there is no limit, the macro is not defined.  */
+#undef __IOV_MAX
+
 #endif
-
-
-#include <bits/types/struct_iovec.h>
diff --git a/include/bits/xopen_lim.h b/include/bits/xopen_lim.h
index 2ae7cb3652..4c5e62f71b 100644
--- a/include/bits/xopen_lim.h
+++ b/include/bits/xopen_lim.h
@@ -29,9 +29,6 @@
 #ifndef _XOPEN_LIM_H
 #define _XOPEN_LIM_H	1
 
-#define __need_IOV_MAX
-#include <bits/stdio_lim.h>
-
 /* We do not provide fixed values for
 
    ARG_MAX	Maximum length of argument to the `exec' function
@@ -60,10 +57,16 @@
 */
 
 
-/* Maximum number of `iovec' structures that one process has available
-   for use with `readv' or writev'.  */
+/* Maximum number of `iovec' structures that may be used in a single call
+   to `readv', `writev', etc.  */
 #define	_XOPEN_IOV_MAX	_POSIX_UIO_MAXIOV
 
+#include <bits/uio_lim.h>
+#ifdef __IOV_MAX
+# define IOV_MAX __IOV_MAX
+#else
+# undef IOV_MAX
+#endif
 
 /* Maximum value of `digit' in calls to the `printf' and `scanf'
    functions.  We have no limit, so return a reasonable value.  */
diff --git a/misc/Makefile b/misc/Makefile
index 2db1fd8397..74b40e988f 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -23,7 +23,8 @@ subdir	:= misc
 
 include ../Makeconfig
 
-headers	:= sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
+headers	:= sys/uio.h sys/uio_ext.h bits/uio_lim.h \
+	   sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
 	   sys/ptrace.h sys/file.h sys/dir.h sys/cdefs.h \
 	   ar.h a.out.h libgen.h stab.h bits/stab.def sgtty.h \
 	   ttyent.h paths.h sys/reboot.h \
diff --git a/misc/sys/uio.h b/misc/sys/uio.h
index e80f0136c9..9ad7615a4f 100644
--- a/misc/sys/uio.h
+++ b/misc/sys/uio.h
@@ -19,15 +19,17 @@
 #define _SYS_UIO_H	1
 
 #include <features.h>
-
 #include <sys/types.h>
+#include <bits/types/struct_iovec.h>
+#include <bits/uio_lim.h>
+#ifdef __IOV_MAX
+# define UIO_MAXIOV __IOV_MAX
+#else
+# undef UIO_MAXIOV
+#endif
 
 __BEGIN_DECLS
 
-/* This file defines `struct iovec'.  */
-#include <bits/uio.h>
-
-
 /* Read data from file descriptor FD, and put the result in the
    buffers described by IOVEC, which is a vector of COUNT 'struct iovec's.
    The buffers are filled in the order specified.
@@ -119,4 +121,10 @@ extern ssize_t pwritev64 (int __fd, const struct iovec *__iovec, int __count,
 
 __END_DECLS
 
+/* Some operating systems provide system-specific extensions to this
+   header.  */
+#ifdef __USE_GNU
+# include <sys/uio_ext.h>
+#endif
+
 #endif /* sys/uio.h */
diff --git a/stdio-common/stdio_lim.h.in b/stdio-common/stdio_lim.h.in
index 510bf008aa..5288907469 100644
--- a/stdio-common/stdio_lim.h.in
+++ b/stdio-common/stdio_lim.h.in
@@ -15,28 +15,25 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if !defined _STDIO_H && !defined __need_FOPEN_MAX && !defined __need_IOV_MAX
+#ifndef _BITS_STDIO_LIM_H
+#define _BITS_STDIO_LIM_H 1
+
+#ifndef _STDIO_H
 # error "Never include <bits/stdio_lim.h> directly; use <stdio.h> instead."
 #endif
 
-#ifdef _STDIO_H
-# define L_tmpnam @L_tmpnam@
-# define TMP_MAX @TMP_MAX@
-# define FILENAME_MAX @FILENAME_MAX@
+#define L_tmpnam @L_tmpnam@
+#define TMP_MAX @TMP_MAX@
+#define FILENAME_MAX @FILENAME_MAX@
 
-# ifdef __USE_POSIX
-#  define L_ctermid @L_ctermid@
-#  if !defined __USE_XOPEN2K || defined __USE_GNU
-#   define L_cuserid @L_cuserid@
-#  endif
+#ifdef __USE_POSIX
+# define L_ctermid @L_ctermid@
+# if !defined __USE_XOPEN2K || defined __USE_GNU
+#  define L_cuserid @L_cuserid@
 # endif
 #endif
 
-#if defined __need_FOPEN_MAX || defined _STDIO_H
-# undef  FOPEN_MAX
-# define FOPEN_MAX @FOPEN_MAX@
-#endif
+#undef  FOPEN_MAX
+#define FOPEN_MAX @FOPEN_MAX@
 
-#if defined __need_IOV_MAX && !defined IOV_MAX
-@define_IOV_MAX@
-#endif
+#endif /* bits/stdio_lim.h */
diff --git a/sysdeps/generic/sys/uio_ext.h b/sysdeps/generic/sys/uio_ext.h
new file mode 100644
index 0000000000..bd49003a7c
--- /dev/null
+++ b/sysdeps/generic/sys/uio_ext.h
@@ -0,0 +1,25 @@
+/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_UIO_EXT_H
+#define _SYS_UIO_EXT_H 1
+
+#include <sys/uio.h>
+
+/* This operating system does not extend sys/uio.h.  */
+
+#endif /* sys/uio_ext.h */
diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
index 59d663196a..f68b2f22f6 100644
--- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
+++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
@@ -35,10 +35,10 @@
 */
 
 #ifdef __USE_GNU
-# include <bits/uio.h>
+# include <bits/types/struct_iovec.h>
 #endif
 
-/* open/fcntl.  */
+/* open/fcntl.	*/
 #define O_ACCMODE	   0003
 #define O_RDONLY	     00
 #define O_WRONLY	     01
@@ -76,7 +76,7 @@
 #endif
 
 #ifndef __O_DIRECTORY
-# define __O_DIRECTORY  0200000
+# define __O_DIRECTORY	0200000
 #endif
 #ifndef __O_NOFOLLOW
 # define __O_NOFOLLOW	0400000
@@ -104,7 +104,7 @@
 # ifndef __USE_FILE_OFFSET64
 #  define F_GETLK	5	/* Get record locking info.  */
 #  define F_SETLK	6	/* Set record locking info (non-blocking).  */
-#  define F_SETLKW	7	/* Set record locking info (blocking).	*/
+#  define F_SETLKW	7	/* Set record locking info (blocking).  */
 # else
 #  define F_GETLK	F_GETLK64  /* Get record locking info.	*/
 #  define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
@@ -114,7 +114,7 @@
 #ifndef F_GETLK64
 # define F_GETLK64	12	/* Get record locking info.  */
 # define F_SETLK64	13	/* Set record locking info (non-blocking).  */
-# define F_SETLKW64	14	/* Set record locking info (blocking).	*/
+# define F_SETLKW64	14	/* Set record locking info (blocking).  */
 #endif
 
 /* open file description locks.
@@ -139,27 +139,27 @@
 #endif
 
 #ifdef __USE_XOPEN2K8
-# define O_DIRECTORY	__O_DIRECTORY	/* Must be a directory.	 */
-# define O_NOFOLLOW	__O_NOFOLLOW	/* Do not follow links.	 */
+# define O_DIRECTORY	__O_DIRECTORY	/* Must be a directory.  */
+# define O_NOFOLLOW	__O_NOFOLLOW	/* Do not follow links.  */
 # define O_CLOEXEC	__O_CLOEXEC	/* Set close_on_exec.  */
 #endif
 
 #ifdef __USE_GNU
-# define O_DIRECT	__O_DIRECT	/* Direct disk access.	*/
+# define O_DIRECT	__O_DIRECT	/* Direct disk access.  */
 # define O_NOATIME	__O_NOATIME	/* Do not set atime.  */
 # define O_PATH		__O_PATH	/* Resolve pathname but do not open file.  */
 # define O_TMPFILE	__O_TMPFILE	/* Atomically create nameless file.  */
 #endif
 
-/* For now, Linux has no separate synchronicitiy options for read
+/* For now, Linux has no separate synchronicity options for read
    operations.  We define O_RSYNC therefore as the same as O_SYNC
    since this is a superset.  */
 #if defined __USE_POSIX199309 || defined __USE_UNIX98
 # define O_DSYNC	__O_DSYNC	/* Synchronize data.  */
 # if defined __O_RSYNC
-#  define O_RSYNC	__O_RSYNC	/* Synchronize read operations.	 */
+#  define O_RSYNC	__O_RSYNC	/* Synchronize read operations.  */
 # else
-#  define O_RSYNC	O_SYNC		/* Synchronize read operations.	 */
+#  define O_RSYNC	O_SYNC		/* Synchronize read operations.  */
 # endif
 #endif
 
@@ -197,7 +197,7 @@
 #endif
 
 #ifdef __USE_GNU
-# define F_SETLEASE	1024	/* Set a lease.	 */
+# define F_SETLEASE	1024	/* Set a lease.  */
 # define F_GETLEASE	1025	/* Enquire what lease is active.  */
 # define F_NOTIFY	1026	/* Request notifications on a directory.  */
 # define F_SETPIPE_SZ	1031	/* Set pipe page size array.  */
@@ -214,8 +214,8 @@
 #ifndef F_RDLCK
 /* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */
 # define F_RDLCK		0	/* Read lock.  */
-# define F_WRLCK		1	/* Write lock.	*/
-# define F_UNLCK		2	/* Remove lock.	 */
+# define F_WRLCK		1	/* Write lock.  */
+# define F_UNLCK		2	/* Remove lock.  */
 #endif
 
 
@@ -236,9 +236,9 @@
 
 #ifdef __USE_GNU
 # define LOCK_MAND	32	/* This is a mandatory flock:	*/
-# define LOCK_READ	64	/* ... which allows concurrent read operations.	 */
+# define LOCK_READ	64	/* ... which allows concurrent read operations.  */
 # define LOCK_WRITE	128	/* ... which allows concurrent write operations.  */
-# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.	 */
+# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.  */
 #endif
 
 #ifdef __USE_GNU
@@ -260,7 +260,7 @@ enum __pid_type
     F_OWNER_TID = 0,		/* Kernel thread.  */
     F_OWNER_PID,		/* Process.  */
     F_OWNER_PGRP,		/* Process group.  */
-    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.  */
+    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.	*/
   };
 
 /* Structure to use with F_GETOWN_EX and F_SETOWN_EX.  */
@@ -289,7 +289,7 @@ struct f_owner_ex
 #ifdef __USE_XOPEN2K
 # define POSIX_FADV_NORMAL	0 /* No further special treatment.  */
 # define POSIX_FADV_RANDOM	1 /* Expect random page references.  */
-# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.	 */
+# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.  */
 # define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */
 # define POSIX_FADV_DONTNEED	__POSIX_FADV_DONTNEED /* Don't need these pages.  */
 # define POSIX_FADV_NOREUSE	__POSIX_FADV_NOREUSE /* Data will be accessed once.  */
@@ -312,9 +312,9 @@ struct f_owner_ex
 # define SPLICE_F_MOVE		1	/* Move pages instead of copying.  */
 # define SPLICE_F_NONBLOCK	2	/* Don't block on the pipe splicing
 					   (but we may still block on the fd
-					   we splice from/to).  */
+					   we splice from/to).	*/
 # define SPLICE_F_MORE		4	/* Expect more data.  */
-# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.  */
+# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.	*/
 
 
 /* Flags for fallocate.  */
@@ -339,7 +339,7 @@ __BEGIN_DECLS
 #ifdef __USE_GNU
 
 /* Provide kernel hint to read ahead.  */
-extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
+extern __ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
     __THROW;
 
 
@@ -355,23 +355,23 @@ extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern ssize_t vmsplice (int __fdout, const struct iovec *__iov,
-			 size_t __count, unsigned int __flags);
+extern __ssize_t vmsplice (int __fdout, const struct iovec *__iov,
+			   size_t __count, unsigned int __flags);
 
 /* Splice two files together.
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
-		       __off64_t *__offout, size_t __len,
-		       unsigned int __flags);
+extern __ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
+			 __off64_t *__offout, size_t __len,
+			 unsigned int __flags);
 
 /* In-kernel implementation of tee for pipe buffers.
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern ssize_t tee (int __fdin, int __fdout, size_t __len,
-		    unsigned int __flags);
+extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
+		      unsigned int __flags);
 
 /* Reserve storage for the data of the file associated with FD.
 
diff --git a/sysdeps/unix/sysv/linux/bits/uio_lim.h b/sysdeps/unix/sysv/linux/bits/uio_lim.h
new file mode 100644
index 0000000000..7c69b93d31
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/uio_lim.h
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_UIO_LIM_H
+#define _BITS_UIO_LIM_H 1
+
+/* Maximum length of the 'struct iovec' array in a single call to
+   readv or writev.
+
+   This macro has different values in different kernel versions.  The
+   latest versions of the kernel use 1024 and this is good choice.  Since
+   the C library implementation of readv/writev is able to emulate the
+   functionality even if the currently running kernel does not support
+   this large value the readv/writev call will not fail because of this.  */
+#define __IOV_MAX	1024
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/uio.h b/sysdeps/unix/sysv/linux/sys/uio_ext.h
similarity index 57%
rename from sysdeps/unix/sysv/linux/bits/uio.h
rename to sysdeps/unix/sysv/linux/sys/uio_ext.h
index 1583f0455b..3999e91e5a 100644
--- a/sysdeps/unix/sysv/linux/bits/uio.h
+++ b/sysdeps/unix/sysv/linux/sys/uio_ext.h
@@ -15,38 +15,10 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if !defined _SYS_UIO_H && !defined _FCNTL_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
-#endif
+#ifndef _SYS_UIO_EXT_H
+#define _SYS_UIO_EXT_H 1
 
-#ifndef _BITS_UIO_H
-#define _BITS_UIO_H	1
-
-#include <sys/types.h>
-
-
-/* We should normally use the Linux kernel header file to define this
-   type and macros but this calls for trouble because of the header
-   includes other kernel headers.  */
-
-/* Size of object which can be written atomically.
-
-   This macro has different values in different kernel versions.  The
-   latest versions of the kernel use 1024 and this is good choice.  Since
-   the C library implementation of readv/writev is able to emulate the
-   functionality even if the currently running kernel does not support
-   this large value the readv/writev call will not fail because of this.  */
-#define UIO_MAXIOV	1024
-
-
-#include <bits/types/struct_iovec.h>
-
-#endif
-
-
-#ifdef __USE_GNU
-# if defined _SYS_UIO_H && !defined _BITS_UIO_H_FOR_SYS_UIO_H
-#  define _BITS_UIO_H_FOR_SYS_UIO_H 1
+#include <sys/uio.h>
 
 __BEGIN_DECLS
 
@@ -68,5 +40,4 @@ extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
 
 __END_DECLS
 
-# endif
-#endif
+#endif /* sys/uio_ext.h */
