/*
  *     Note: when you get a NULL pointer exception here this means someone
  *     passed in an incorrect kernel address to one of these functions.
- *
- *     If you use these functions directly please don't forget the access_ok().
  */
 static inline
 __wsum csum_partial_copy_nocheck(const void *src, void *dst,
        return csum_partial_copy_generic(src, dst, len, sum, NULL, NULL);
 }
 
+#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
 static inline
-__wsum csum_partial_copy_from_user(const void __user *src, void *dst,
+__wsum csum_and_copy_from_user(const void __user *src, void *dst,
                                   int len, __wsum sum, int *err_ptr)
 {
-       return csum_partial_copy_generic((__force const void *)src, dst,
+       if (access_ok(dst, len))
+               return csum_partial_copy_generic((__force const void *)src, dst,
                                        len, sum, err_ptr, NULL);
+       if (len)
+               *err_ptr = -EFAULT;
+       return sum;
 }
 
 /*