aboutsummaryrefslogtreecommitdiffstats
path: root/arch/parisc/kernel/sys_parisc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/parisc/kernel/sys_parisc.c')
-rw-r--r--arch/parisc/kernel/sys_parisc.c15
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