0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/export.h>
0009 #include <linux/compiler.h>
0010 #include <linux/types.h>
0011 #include <asm/checksum.h>
0012 #include <linux/uaccess.h>
0013
0014 __wsum csum_and_copy_from_user(const void __user *src, void *dst,
0015 int len)
0016 {
0017 __wsum csum;
0018
0019 if (unlikely(!user_read_access_begin(src, len)))
0020 return 0;
0021
0022 csum = csum_partial_copy_generic((void __force *)src, dst, len);
0023
0024 user_read_access_end();
0025 return csum;
0026 }
0027
0028 __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len)
0029 {
0030 __wsum csum;
0031
0032 if (unlikely(!user_write_access_begin(dst, len)))
0033 return 0;
0034
0035 csum = csum_partial_copy_generic(src, (void __force *)dst, len);
0036
0037 user_write_access_end();
0038 return csum;
0039 }