diff options
Diffstat (limited to 'mm/maccess.c')
| -rw-r--r-- | mm/maccess.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/mm/maccess.c b/mm/maccess.c index 074f6b086671..518a25667323 100644 --- a/mm/maccess.c +++ b/mm/maccess.c @@ -5,6 +5,7 @@  #include <linux/export.h>  #include <linux/mm.h>  #include <linux/uaccess.h> +#include <asm/tlb.h>  bool __weak copy_from_kernel_nofault_allowed(const void *unsafe_src,  		size_t size) @@ -113,11 +114,16 @@ Efault:  long copy_from_user_nofault(void *dst, const void __user *src, size_t size)  {  	long ret = -EFAULT; -	if (access_ok(src, size)) { -		pagefault_disable(); -		ret = __copy_from_user_inatomic(dst, src, size); -		pagefault_enable(); -	} + +	if (!__access_ok(src, size)) +		return ret; + +	if (!nmi_uaccess_okay()) +		return ret; + +	pagefault_disable(); +	ret = __copy_from_user_inatomic(dst, src, size); +	pagefault_enable();  	if (ret)  		return -EFAULT;  |