summaryrefslogtreecommitdiff
path: root/mm/maccess.c
diff options
context:
space:
mode:
authorChris Zankel <chris@zankel.net>2016-01-21 05:16:13 +0000
committerChris Zankel <chris@zankel.net>2016-01-21 05:16:13 +0000
commitd1208404dd477c142680437137c9996b95bfd508 (patch)
tree0cba53f59f487c0de2b1a0d9fb1b11ae27de96ec /mm/maccess.c
parentafaa7c542cc9c4d8a99ba252a8ea5e8bc7c897e2 (diff)
parentafd2ff9b7e1b367172f18ba7f693dfb62bdcb2dc (diff)
Merge tag 'v4.4'
Linux 4.4
Diffstat (limited to 'mm/maccess.c')
-rw-r--r--mm/maccess.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/mm/maccess.c b/mm/maccess.c
index 34fe24759ed1..d159b1c96e48 100644
--- a/mm/maccess.c
+++ b/mm/maccess.c
@@ -13,6 +13,11 @@
*
* Safely read from address @src to the buffer at @dst. If a kernel fault
* happens, handle that and return -EFAULT.
+ *
+ * We ensure that the copy_from_user is executed in atomic context so that
+ * do_page_fault() doesn't attempt to take mmap_sem. This makes
+ * probe_kernel_read() suitable for use within regions where the caller
+ * already holds mmap_sem, or other locks which nest inside mmap_sem.
*/
long __weak probe_kernel_read(void *dst, const void *src, size_t size)
@@ -99,5 +104,5 @@ long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count)
pagefault_enable();
set_fs(old_fs);
- return ret < 0 ? ret : src - unsafe_addr;
+ return ret ? -EFAULT : src - unsafe_addr;
}