X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Falpha%2Flib%2Fcsum_partial_copy.c;h=4ca75c74ce908f99bc7aea0887c73a327e995b44;hb=a2f44b27303a5353859d77a3e96a1d3f33f56ab7;hp=702efb639d3e9062fbf03f244e79f327388adaec;hpb=daddc0d38b3571bed170afa273a49a0eba090c1e;p=linux-2.6.git diff --git a/arch/alpha/lib/csum_partial_copy.c b/arch/alpha/lib/csum_partial_copy.c index 702efb639..4ca75c74c 100644 --- a/arch/alpha/lib/csum_partial_copy.c +++ b/arch/alpha/lib/csum_partial_copy.c @@ -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); }