__wsum
csum_partial_copy_from_user(const void __user *src, void *dst, int len,
			       __wsum sum, int *errp)
{
	unsigned long checksum = (__force u32) sum;
	unsigned long soff = 7 & (unsigned long) src;
	unsigned long doff = 7 & (unsigned long) dst;

	if (len) {
		if (!access_ok(VERIFY_READ, src, len)) {
			if (errp) *errp = -EFAULT;
			memset(dst, 0, len);
			return sum;
		}
		if (!doff) {
			if (!soff)
				checksum = csum_partial_cfu_aligned(
					(const unsigned long __user *) src,
					(unsigned long *) dst,
					len-8, checksum, errp);
			else
				checksum = csum_partial_cfu_dest_aligned(
					(const unsigned long __user *) src,
					(unsigned long *) dst,
					soff, len-8, checksum, errp);
		} else {
			unsigned long partial_dest;
			ldq_u(partial_dest, dst);
			if (!soff)
				checksum = csum_partial_cfu_src_aligned(
					(const unsigned long __user *) src,
					(unsigned long *) dst,
					doff, len-8, checksum,
					partial_dest, errp);
			else
				checksum = csum_partial_cfu_unaligned(
					(const unsigned long __user *) src,
					(unsigned long *) dst,
					soff, doff, len-8, checksum,
					partial_dest, errp);
		}
		checksum = from64to16 (checksum);
	}
	return (__force __wsum)checksum;
}
static unsigned int
do_csum_partial_copy_from_user(const char __user *src, char *dst, int len,
                               unsigned int sum, int *errp)
{
    unsigned long checksum = (unsigned) sum;
    unsigned long soff = 7 & (unsigned long) src;
    unsigned long doff = 7 & (unsigned long) dst;

    if (len) {
        if (!doff) {
            if (!soff)
                checksum = csum_partial_cfu_aligned(
                               (const unsigned long __user *) src,
                               (unsigned long *) dst,
                               len-8, checksum, errp);
            else
                checksum = csum_partial_cfu_dest_aligned(
                               (const unsigned long __user *) src,
                               (unsigned long *) dst,
                               soff, len-8, checksum, errp);
        } else {
            unsigned long partial_dest;
            ldq_u(partial_dest, dst);
            if (!soff)
                checksum = csum_partial_cfu_src_aligned(
                               (const unsigned long __user *) src,
                               (unsigned long *) dst,
                               doff, len-8, checksum,
                               partial_dest, errp);
            else
                checksum = csum_partial_cfu_unaligned(
                               (const unsigned long __user *) src,
                               (unsigned long *) dst,
                               soff, doff, len-8, checksum,
                               partial_dest, errp);
        }
        checksum = from64to16 (checksum);
    }
    return checksum;
}