diff options
Diffstat (limited to 'include/linux/uaccess.h')
-rw-r--r-- | include/linux/uaccess.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h index 67918c22339c..76c3fe325101 100644 --- a/include/linux/uaccess.h +++ b/include/linux/uaccess.h | |||
@@ -65,14 +65,22 @@ static inline unsigned long __copy_from_user_nocache(void *to, | |||
65 | * do_page_fault() doesn't attempt to take mmap_sem. This makes | 65 | * do_page_fault() doesn't attempt to take mmap_sem. This makes |
66 | * probe_kernel_address() suitable for use within regions where the caller | 66 | * probe_kernel_address() suitable for use within regions where the caller |
67 | * already holds mmap_sem, or other locks which nest inside mmap_sem. | 67 | * already holds mmap_sem, or other locks which nest inside mmap_sem. |
68 | * This must be a macro because __get_user() needs to know the types of the | ||
69 | * args. | ||
70 | * | ||
71 | * We don't include enough header files to be able to do the set_fs(). We | ||
72 | * require that the probe_kernel_address() caller will do that. | ||
68 | */ | 73 | */ |
69 | #define probe_kernel_address(addr, retval) \ | 74 | #define probe_kernel_address(addr, retval) \ |
70 | ({ \ | 75 | ({ \ |
71 | long ret; \ | 76 | long ret; \ |
77 | mm_segment_t old_fs = get_fs(); \ | ||
72 | \ | 78 | \ |
79 | set_fs(KERNEL_DS); \ | ||
73 | pagefault_disable(); \ | 80 | pagefault_disable(); \ |
74 | ret = __get_user(retval, addr); \ | 81 | ret = __get_user(retval, addr); \ |
75 | pagefault_enable(); \ | 82 | pagefault_enable(); \ |
83 | set_fs(old_fs); \ | ||
76 | ret; \ | 84 | ret; \ |
77 | }) | 85 | }) |
78 | 86 | ||