diff options
author | Gleb Natapov <gleb@redhat.com> | 2010-10-26 17:22:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-26 19:52:11 -0400 |
commit | 70384dc6dcc6aa76762200262820bdb8b724ecd5 (patch) | |
tree | 2a1692b185b2bbb9dc3890cdb897ef2a0d375c15 | |
parent | 66d7dd518ae413a383ab2c6c263cc30617329842 (diff) |
mm: fix error reporting in move_pages() syscall
The vma returned by find_vma does not necessarily include the target
address. If this happens the code tries to follow a page outside of any
vma and returns ENOENT instead of EFAULT.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Acked-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/migrate.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index 35e454189966..fe5a3c6a5426 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -1037,7 +1037,7 @@ static int do_move_page_to_node_array(struct mm_struct *mm, | |||
1037 | 1037 | ||
1038 | err = -EFAULT; | 1038 | err = -EFAULT; |
1039 | vma = find_vma(mm, pp->addr); | 1039 | vma = find_vma(mm, pp->addr); |
1040 | if (!vma || !vma_migratable(vma)) | 1040 | if (!vma || pp->addr < vma->vm_start || !vma_migratable(vma)) |
1041 | goto set_status; | 1041 | goto set_status; |
1042 | 1042 | ||
1043 | page = follow_page(vma, pp->addr, FOLL_GET); | 1043 | page = follow_page(vma, pp->addr, FOLL_GET); |
@@ -1204,7 +1204,7 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages, | |||
1204 | int err = -EFAULT; | 1204 | int err = -EFAULT; |
1205 | 1205 | ||
1206 | vma = find_vma(mm, addr); | 1206 | vma = find_vma(mm, addr); |
1207 | if (!vma) | 1207 | if (!vma || addr < vma->vm_start) |
1208 | goto set_status; | 1208 | goto set_status; |
1209 | 1209 | ||
1210 | page = follow_page(vma, addr, 0); | 1210 | page = follow_page(vma, addr, 0); |