From: Manfred Spraul <manfred@colorfullife.com>

Linus noticed that put_user doesn't to the manual page table lookup that is
required for cpus without a working WP flag.  The solution is simple: if
CONFIG_X86_WP_WORKS_OK is not set, then the put_user macros must call
__copy_to_user_ll().  That function contains the required checks.

This is already implemented for __put_user_size(), somehow I overlooked
__put_user_{1,2,4,8,X}.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/include/asm-i386/uaccess.h |   17 +++++++++++++++++
 1 files changed, 17 insertions(+)

diff -puN include/asm-i386/uaccess.h~fix-put_user-for-80386 include/asm-i386/uaccess.h
--- 25/include/asm-i386/uaccess.h~fix-put_user-for-80386	2005-03-16 21:41:57.000000000 -0800
+++ 25-akpm/include/asm-i386/uaccess.h	2005-03-16 21:41:57.000000000 -0800
@@ -217,6 +217,8 @@ extern void __put_user_8(void);
  *
  * Returns zero on success, or -EFAULT on error.
  */
+#ifdef CONFIG_X86_WP_WORKS_OK
+
 #define put_user(x,ptr)						\
 ({	int __ret_pu;						\
 	__chk_user_ptr(ptr);					\
@@ -230,6 +232,21 @@ extern void __put_user_8(void);
 	__ret_pu;						\
 })
 
+#else
+#define put_user(x,ptr)						\
+({								\
+ 	int __ret_pu;						\
+	__typeof__(*(ptr)) __pus_tmp = x;			\
+	__ret_pu=0;						\
+	if(unlikely(__copy_to_user_ll(ptr, &__pus_tmp,		\
+				sizeof(*(ptr))) != 0))		\
+ 		__ret_pu=-EFAULT;				\
+ 	__ret_pu;						\
+ })
+
+
+#endif
+
 /**
  * __get_user: - Get a simple variable from user space, with less checking.
  * @x:   Variable to store result.
_