diff options
Diffstat (limited to 'arch/alpha/lib/csum_partial_copy.c')
| -rw-r--r-- | arch/alpha/lib/csum_partial_copy.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/arch/alpha/lib/csum_partial_copy.c b/arch/alpha/lib/csum_partial_copy.c index ffb19b7da99..5675dca8dbb 100644 --- a/arch/alpha/lib/csum_partial_copy.c +++ b/arch/alpha/lib/csum_partial_copy.c @@ -130,7 +130,7 @@ csum_partial_cfu_aligned(const unsigned long __user *src, unsigned long *dst,  		*dst = word | tmp;  		checksum += carry;  	} -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -185,7 +185,7 @@ csum_partial_cfu_dest_aligned(const unsigned long __user *src,  		*dst = word | tmp;  		checksum += carry;  	} -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -242,7 +242,7 @@ csum_partial_cfu_src_aligned(const unsigned long __user *src,  	stq_u(partial_dest | second_dest, dst);  out:  	checksum += carry; -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -325,7 +325,7 @@ csum_partial_cfu_unaligned(const unsigned long __user * src,  		stq_u(partial_dest | word | second_dest, dst);  		checksum += carry;  	} -	if (err) *errp = err; +	if (err && errp) *errp = err;  	return checksum;  } @@ -339,7 +339,7 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,  	if (len) {  		if (!access_ok(VERIFY_READ, src, len)) { -			*errp = -EFAULT; +			if (errp) *errp = -EFAULT;  			memset(dst, 0, len);  			return sum;  		} @@ -378,6 +378,11 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,  __wsum  csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)  { -	return csum_partial_copy_from_user((__force const void __user *)src, -			dst, len, sum, NULL); +	__wsum checksum; +	mm_segment_t oldfs = get_fs(); +	set_fs(KERNEL_DS); +	checksum = csum_partial_copy_from_user((__force const void __user *)src, +						dst, len, sum, NULL); +	set_fs(oldfs); +	return checksum;  }  | 
