diff options
Diffstat (limited to 'arch/parisc/kernel/sys_parisc.c')
-rw-r--r-- | arch/parisc/kernel/sys_parisc.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c index e5288638a1d9..378a754ca186 100644 --- a/arch/parisc/kernel/sys_parisc.c +++ b/arch/parisc/kernel/sys_parisc.c | |||
@@ -90,7 +90,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
90 | unsigned long len, unsigned long pgoff, unsigned long flags) | 90 | unsigned long len, unsigned long pgoff, unsigned long flags) |
91 | { | 91 | { |
92 | struct mm_struct *mm = current->mm; | 92 | struct mm_struct *mm = current->mm; |
93 | struct vm_area_struct *vma; | 93 | struct vm_area_struct *vma, *prev; |
94 | unsigned long task_size = TASK_SIZE; | 94 | unsigned long task_size = TASK_SIZE; |
95 | int do_color_align, last_mmap; | 95 | int do_color_align, last_mmap; |
96 | struct vm_unmapped_area_info info; | 96 | struct vm_unmapped_area_info info; |
@@ -117,9 +117,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
117 | else | 117 | else |
118 | addr = PAGE_ALIGN(addr); | 118 | addr = PAGE_ALIGN(addr); |
119 | 119 | ||
120 | vma = find_vma(mm, addr); | 120 | vma = find_vma_prev(mm, addr, &prev); |
121 | if (task_size - len >= addr && | 121 | if (task_size - len >= addr && |
122 | (!vma || addr + len <= vma->vm_start)) | 122 | (!vma || addr + len <= vm_start_gap(vma)) && |
123 | (!prev || addr >= vm_end_gap(prev))) | ||
123 | goto found_addr; | 124 | goto found_addr; |
124 | } | 125 | } |
125 | 126 | ||
@@ -143,7 +144,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
143 | const unsigned long len, const unsigned long pgoff, | 144 | const unsigned long len, const unsigned long pgoff, |
144 | const unsigned long flags) | 145 | const unsigned long flags) |
145 | { | 146 | { |
146 | struct vm_area_struct *vma; | 147 | struct vm_area_struct *vma, *prev; |
147 | struct mm_struct *mm = current->mm; | 148 | struct mm_struct *mm = current->mm; |
148 | unsigned long addr = addr0; | 149 | unsigned long addr = addr0; |
149 | int do_color_align, last_mmap; | 150 | int do_color_align, last_mmap; |
@@ -177,9 +178,11 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
177 | addr = COLOR_ALIGN(addr, last_mmap, pgoff); | 178 | addr = COLOR_ALIGN(addr, last_mmap, pgoff); |
178 | else | 179 | else |
179 | addr = PAGE_ALIGN(addr); | 180 | addr = PAGE_ALIGN(addr); |
180 | vma = find_vma(mm, addr); | 181 | |
182 | vma = find_vma_prev(mm, addr, &prev); | ||
181 | if (TASK_SIZE - len >= addr && | 183 | if (TASK_SIZE - len >= addr && |
182 | (!vma || addr + len <= vma->vm_start)) | 184 | (!vma || addr + len <= vm_start_gap(vma)) && |
185 | (!prev || addr >= vm_end_gap(prev))) | ||
183 | goto found_addr; | 186 | goto found_addr; |
184 | } | 187 | } |
185 | 188 | ||