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,  		unsigned long len, unsigned long pgoff, unsigned long flags)  {  	struct mm_struct *mm = current->mm; -	struct vm_area_struct *vma; +	struct vm_area_struct *vma, *prev;  	unsigned long task_size = TASK_SIZE;  	int do_color_align, last_mmap;  	struct vm_unmapped_area_info info; @@ -117,9 +117,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,  		else  			addr = PAGE_ALIGN(addr); -		vma = find_vma(mm, addr); +		vma = find_vma_prev(mm, addr, &prev);  		if (task_size - len >= addr && -		    (!vma || addr + len <= vma->vm_start)) +		    (!vma || addr + len <= vm_start_gap(vma)) && +		    (!prev || addr >= vm_end_gap(prev)))  			goto found_addr;  	} @@ -143,7 +144,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			  const unsigned long len, const unsigned long pgoff,  			  const unsigned long flags)  { -	struct vm_area_struct *vma; +	struct vm_area_struct *vma, *prev;  	struct mm_struct *mm = current->mm;  	unsigned long addr = addr0;  	int do_color_align, last_mmap; @@ -177,9 +178,11 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			addr = COLOR_ALIGN(addr, last_mmap, pgoff);  		else  			addr = PAGE_ALIGN(addr); -		vma = find_vma(mm, addr); + +		vma = find_vma_prev(mm, addr, &prev);  		if (TASK_SIZE - len >= addr && -		    (!vma || addr + len <= vma->vm_start)) +		    (!vma || addr + len <= vm_start_gap(vma)) && +		    (!prev || addr >= vm_end_gap(prev)))  			goto found_addr;  	}  |