aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorIngo Molnar <mingo@redhat.com>2004-08-26 20:33:18 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-08-26 20:33:18 -0700
commit026a14f002f20339ea70ec66c8b738bc59b9d08b (patch)
tree32c58da59aa962d137271c7fd17503944597f9f4 /mm
parentc46cde9d384836cfb1ea6a0731434ffa060e7450 (diff)
downloadhistory-026a14f002f20339ea70ec66c8b738bc59b9d08b.tar.gz
[PATCH] Add a few might_sleep() checks
Add a whole bunch more might_sleep() checks. We also enable might_sleep() checking in copy_*_user(). This was non-trivial because of the "copy_*_user() in atomic regions" trick would generate false positives. Fix that up by adding a new __copy_*_user_inatomic(), which avoids the might_sleep() check. Only i386 is supported in this patch. With: Arjan van de Ven <arjanv@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/filemap.c7
-rw-r--r--mm/mempool.c1
-rw-r--r--mm/mmap.c1
3 files changed, 6 insertions, 3 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index 4db9ba3d152b93..542e4af90c67a6 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -888,7 +888,8 @@ int file_read_actor(read_descriptor_t *desc, struct page *page,
*/
if (!fault_in_pages_writeable(desc->arg.buf, size)) {
kaddr = kmap_atomic(page, KM_USER0);
- left = __copy_to_user(desc->arg.buf, kaddr + offset, size);
+ left = __copy_to_user_inatomic(desc->arg.buf,
+ kaddr + offset, size);
kunmap_atomic(kaddr, KM_USER0);
if (left == 0)
goto success;
@@ -1685,7 +1686,7 @@ filemap_copy_from_user(struct page *page, unsigned long offset,
int left;
kaddr = kmap_atomic(page, KM_USER0);
- left = __copy_from_user(kaddr + offset, buf, bytes);
+ left = __copy_from_user_inatomic(kaddr + offset, buf, bytes);
kunmap_atomic(kaddr, KM_USER0);
if (left != 0) {
@@ -1708,7 +1709,7 @@ __filemap_copy_from_user_iovec(char *vaddr,
int copy = min(bytes, iov->iov_len - base);
base = 0;
- left = __copy_from_user(vaddr, buf, copy);
+ left = __copy_from_user_inatomic(vaddr, buf, copy);
copied += copy;
bytes -= copy;
vaddr += copy;
diff --git a/mm/mempool.c b/mm/mempool.c
index a6c1537ee49f01..8dec8779e28f0c 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -194,6 +194,7 @@ void * mempool_alloc(mempool_t *pool, int gfp_mask)
DEFINE_WAIT(wait);
int gfp_nowait = gfp_mask & ~(__GFP_WAIT | __GFP_IO);
+ might_sleep_if(gfp_mask & __GFP_WAIT);
repeat_alloc:
element = pool->alloc(gfp_nowait|__GFP_NOWARN, pool->pool_data);
if (likely(element != NULL))
diff --git a/mm/mmap.c b/mm/mmap.c
index 87536f82831572..e2b929e5b13210 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -90,6 +90,7 @@ static void remove_vm_struct(struct vm_area_struct *vma)
{
struct file *file = vma->vm_file;
+ might_sleep();
if (file) {
struct address_space *mapping = file->f_mapping;
spin_lock(&mapping->i_mmap_lock);