fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / alpha / lib / csum_partial_copy.c
index 702efb6..4ca75c7 100644 (file)
@@ -99,7 +99,7 @@ static inline unsigned short from64to16(unsigned long x)
  * Ok. This isn't fun, but this is the EASY case.
  */
 static inline unsigned long
-csum_partial_cfu_aligned(const unsigned long *src, unsigned long *dst,
+csum_partial_cfu_aligned(const unsigned long __user *src, unsigned long *dst,
                         long len, unsigned long checksum,
                         int *errp)
 {
@@ -139,7 +139,8 @@ csum_partial_cfu_aligned(const unsigned long *src, unsigned long *dst,
  * easy.
  */
 static inline unsigned long
-csum_partial_cfu_dest_aligned(const unsigned long *src, unsigned long *dst,
+csum_partial_cfu_dest_aligned(const unsigned long __user *src,
+                             unsigned long *dst,
                              unsigned long soff,
                              long len, unsigned long checksum,
                              int *errp)
@@ -192,7 +193,8 @@ csum_partial_cfu_dest_aligned(const unsigned long *src, unsigned long *dst,
  * This is slightly less fun than the above..
  */
 static inline unsigned long
-csum_partial_cfu_src_aligned(const unsigned long *src, unsigned long *dst,
+csum_partial_cfu_src_aligned(const unsigned long __user *src,
+                            unsigned long *dst,
                             unsigned long doff,
                             long len, unsigned long checksum,
                             unsigned long partial_dest,
@@ -249,7 +251,8 @@ out:
  * look at this too closely, you'll go blind.
  */
 static inline unsigned long
-csum_partial_cfu_unaligned(const unsigned long * src, unsigned long * dst,
+csum_partial_cfu_unaligned(const unsigned long __user * src,
+                          unsigned long * dst,
                           unsigned long soff, unsigned long doff,
                           long len, unsigned long checksum,
                           unsigned long partial_dest,
@@ -326,11 +329,11 @@ csum_partial_cfu_unaligned(const unsigned long * src, unsigned long * dst,
        return checksum;
 }
 
-static unsigned int
-do_csum_partial_copy_from_user(const char *src, char *dst, int len,
-                              unsigned int sum, int *errp)
+__wsum
+csum_partial_copy_from_user(const void __user *src, void *dst, int len,
+                              __wsum sum, int *errp)
 {
-       unsigned long checksum = (unsigned) sum;
+       unsigned long checksum = (__force u32) sum;
        unsigned long soff = 7 & (unsigned long) src;
        unsigned long doff = 7 & (unsigned long) dst;
 
@@ -338,12 +341,12 @@ do_csum_partial_copy_from_user(const char *src, char *dst, int len,
                if (!doff) {
                        if (!soff)
                                checksum = csum_partial_cfu_aligned(
-                                       (const unsigned long *) src,
+                                       (const unsigned long __user *) src,
                                        (unsigned long *) dst,
                                        len-8, checksum, errp);
                        else
                                checksum = csum_partial_cfu_dest_aligned(
-                                       (const unsigned long *) src,
+                                       (const unsigned long __user *) src,
                                        (unsigned long *) dst,
                                        soff, len-8, checksum, errp);
                } else {
@@ -351,37 +354,25 @@ do_csum_partial_copy_from_user(const char *src, char *dst, int len,
                        ldq_u(partial_dest, dst);
                        if (!soff)
                                checksum = csum_partial_cfu_src_aligned(
-                                       (const unsigned long *) src,
+                                       (const unsigned long __user *) src,
                                        (unsigned long *) dst,
                                        doff, len-8, checksum,
                                        partial_dest, errp);
                        else
                                checksum = csum_partial_cfu_unaligned(
-                                       (const unsigned long *) src,
+                                       (const unsigned long __user *) src,
                                        (unsigned long *) dst,
                                        soff, doff, len-8, checksum,
                                        partial_dest, errp);
                }
                checksum = from64to16 (checksum);
        }
-       return checksum;
-}
-
-unsigned int
-csum_partial_copy_from_user(const char *src, char *dst, int len,
-                           unsigned int sum, int *errp)
-{
-       if (!access_ok(src, len, VERIFY_READ)) {
-               *errp = -EFAULT;
-               memset(dst, 0, len);
-               return sum;
-       }
-
-       return do_csum_partial_copy_from_user(src, dst, len, sum, errp);
+       return (__force __wsum)checksum;
 }
 
-unsigned int
-csum_partial_copy_nocheck(const char *src, char *dst, int len, unsigned int sum)
+__wsum
+csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
 {
-       return do_csum_partial_copy_from_user(src, dst, len, sum, NULL);
+       return csum_partial_copy_from_user((__force const void __user *)src,
+                       dst, len, sum, NULL);
 }