summaryrefslogtreecommitdiff
path: root/mm/nommu.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2010-03-25 16:48:44 +0000
committerLinus Torvalds <torvalds@linux-foundation.org>2010-03-25 14:13:27 -0700
commite1ee65d85904c5dd4b9cea1b15d5e85e20eae8a1 (patch)
tree5de7d6dd923a04eda69fdedd1209ea249ef081cf /mm/nommu.c
parent7561e8ca0dfaf6fca3feef982830de3b65300e5b (diff)
downloadlinux-3.10-e1ee65d85904c5dd4b9cea1b15d5e85e20eae8a1.tar.gz
linux-3.10-e1ee65d85904c5dd4b9cea1b15d5e85e20eae8a1.tar.bz2
linux-3.10-e1ee65d85904c5dd4b9cea1b15d5e85e20eae8a1.zip
NOMMU: Fix __get_user_pages() to pin last page on offset buffers
Fix __get_user_pages() to make it pin the last page on a buffer that doesn't begin at the start of a page, but is a multiple of PAGE_SIZE in size. The problem is that __get_user_pages() advances the pointer too much when it iterates to the next page if the page it's currently looking at isn't used from the first byte. This can cause the end of a short VMA to be reached prematurely, resulting in the last page being lost. Signed-off-by: Steven J. Magnani <steve@digidescorp.com> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/nommu.c')
-rw-r--r--mm/nommu.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/nommu.c b/mm/nommu.c
index 089982f5a4c..63fa17d121f 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -162,7 +162,7 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
}
if (vmas)
vmas[i] = vma;
- start += PAGE_SIZE;
+ start = (start + PAGE_SIZE) & PAGE_MASK;
}
return i;