diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 10 | ||||
-rw-r--r-- | mm/filemap_xip.c | 2 | ||||
-rw-r--r-- | mm/vmalloc.c | 3 |
3 files changed, 10 insertions, 5 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 23acefe51808..60fd56772cc6 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1816,14 +1816,14 @@ EXPORT_SYMBOL(file_remove_suid); | |||
1816 | static size_t __iovec_copy_from_user_inatomic(char *vaddr, | 1816 | static size_t __iovec_copy_from_user_inatomic(char *vaddr, |
1817 | const struct iovec *iov, size_t base, size_t bytes) | 1817 | const struct iovec *iov, size_t base, size_t bytes) |
1818 | { | 1818 | { |
1819 | size_t copied = 0, left = 0; | 1819 | size_t copied = 0, left = 0, total = bytes; |
1820 | 1820 | ||
1821 | while (bytes) { | 1821 | while (bytes) { |
1822 | char __user *buf = iov->iov_base + base; | 1822 | char __user *buf = iov->iov_base + base; |
1823 | int copy = min(bytes, iov->iov_len - base); | 1823 | int copy = min(bytes, iov->iov_len - base); |
1824 | 1824 | ||
1825 | base = 0; | 1825 | base = 0; |
1826 | left = __copy_from_user_inatomic_nocache(vaddr, buf, copy); | 1826 | left = __copy_from_user_inatomic_nocache(vaddr, buf, copy, total); |
1827 | copied += copy; | 1827 | copied += copy; |
1828 | bytes -= copy; | 1828 | bytes -= copy; |
1829 | vaddr += copy; | 1829 | vaddr += copy; |
@@ -1851,8 +1851,9 @@ size_t iov_iter_copy_from_user_atomic(struct page *page, | |||
1851 | if (likely(i->nr_segs == 1)) { | 1851 | if (likely(i->nr_segs == 1)) { |
1852 | int left; | 1852 | int left; |
1853 | char __user *buf = i->iov->iov_base + i->iov_offset; | 1853 | char __user *buf = i->iov->iov_base + i->iov_offset; |
1854 | |||
1854 | left = __copy_from_user_inatomic_nocache(kaddr + offset, | 1855 | left = __copy_from_user_inatomic_nocache(kaddr + offset, |
1855 | buf, bytes); | 1856 | buf, bytes, bytes); |
1856 | copied = bytes - left; | 1857 | copied = bytes - left; |
1857 | } else { | 1858 | } else { |
1858 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, | 1859 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, |
@@ -1880,7 +1881,8 @@ size_t iov_iter_copy_from_user(struct page *page, | |||
1880 | if (likely(i->nr_segs == 1)) { | 1881 | if (likely(i->nr_segs == 1)) { |
1881 | int left; | 1882 | int left; |
1882 | char __user *buf = i->iov->iov_base + i->iov_offset; | 1883 | char __user *buf = i->iov->iov_base + i->iov_offset; |
1883 | left = __copy_from_user_nocache(kaddr + offset, buf, bytes); | 1884 | |
1885 | left = __copy_from_user_nocache(kaddr + offset, buf, bytes, bytes); | ||
1884 | copied = bytes - left; | 1886 | copied = bytes - left; |
1885 | } else { | 1887 | } else { |
1886 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, | 1888 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, |
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index 0c04615651b7..bf54f8a2cf1d 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
@@ -354,7 +354,7 @@ __xip_file_write(struct file *filp, const char __user *buf, | |||
354 | break; | 354 | break; |
355 | 355 | ||
356 | copied = bytes - | 356 | copied = bytes - |
357 | __copy_from_user_nocache(xip_mem + offset, buf, bytes); | 357 | __copy_from_user_nocache(xip_mem + offset, buf, bytes, bytes); |
358 | 358 | ||
359 | if (likely(copied > 0)) { | 359 | if (likely(copied > 0)) { |
360 | status = copied; | 360 | status = copied; |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 903cad46e796..7774c6328970 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -1259,6 +1259,7 @@ EXPORT_SYMBOL(vfree); | |||
1259 | void vunmap(const void *addr) | 1259 | void vunmap(const void *addr) |
1260 | { | 1260 | { |
1261 | BUG_ON(in_interrupt()); | 1261 | BUG_ON(in_interrupt()); |
1262 | might_sleep(); | ||
1262 | __vunmap(addr, 0); | 1263 | __vunmap(addr, 0); |
1263 | } | 1264 | } |
1264 | EXPORT_SYMBOL(vunmap); | 1265 | EXPORT_SYMBOL(vunmap); |
@@ -1278,6 +1279,8 @@ void *vmap(struct page **pages, unsigned int count, | |||
1278 | { | 1279 | { |
1279 | struct vm_struct *area; | 1280 | struct vm_struct *area; |
1280 | 1281 | ||
1282 | might_sleep(); | ||
1283 | |||
1281 | if (count > num_physpages) | 1284 | if (count > num_physpages) |
1282 | return NULL; | 1285 | return NULL; |
1283 | 1286 | ||