Now that copy_{to/from}_user_partial() are used by callers which expect partial copy with number of not copied bytes as return value, change copy_{to/from}_user() to return an int, and return -EFAULT when the copy is not complete. Signed-off-by: Christophe Leroy (CS GROUP) --- include/linux/uaccess.h | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h index 2d37173782b3..33b7d0f5f808 100644 --- a/include/linux/uaccess.h +++ b/include/linux/uaccess.h @@ -211,7 +211,7 @@ extern __must_check unsigned long _copy_to_user(void __user *, const void *, unsigned long); static __always_inline unsigned long __must_check -copy_from_user(void *to, const void __user *from, unsigned long n) +copy_from_user_common(void *to, const void __user *from, unsigned long n, bool partial) { if (!check_copy_size(to, n, false)) return n; @@ -221,10 +221,20 @@ copy_from_user(void *to, const void __user *from, unsigned long n) return _inline_copy_from_user(to, from, n); } -#define copy_from_user_partial copy_from_user +static __always_inline unsigned long __must_check +copy_from_user_partial(void *to, const void __user *from, unsigned long n) +{ + return copy_from_user_common(to, from, n, true); +} + +static __always_inline int __must_check +copy_from_user(void *to, const void __user *from, unsigned long n) +{ + return copy_from_user_common(to, from, n, false) ? -EFAULT : 0; +} static __always_inline unsigned long __must_check -copy_to_user(void __user *to, const void *from, unsigned long n) +copy_to_user_common(void __user *to, const void *from, unsigned long n, bool partial) { if (!check_copy_size(from, n, true)) return n; @@ -235,7 +245,17 @@ copy_to_user(void __user *to, const void *from, unsigned long n) return _inline_copy_to_user(to, from, n); } -#define copy_to_user_partial copy_to_user +static __always_inline unsigned long __must_check +copy_to_user_partial(void __user *to, const void *from, unsigned long n) +{ + return copy_to_user_common(to, from, n, true); +} + +static __always_inline int __must_check +copy_to_user(void __user *to, const void *from, unsigned long n) +{ + return copy_to_user_common(to, from, n, false) ? -EFAULT : 0; +} #ifndef copy_mc_to_kernel /* -- 2.49.0