diff options
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -1608,7 +1608,6 @@ EXPORT_SYMBOL(find_vma); | |||
1608 | 1608 | ||
1609 | /* | 1609 | /* |
1610 | * Same as find_vma, but also return a pointer to the previous VMA in *pprev. | 1610 | * Same as find_vma, but also return a pointer to the previous VMA in *pprev. |
1611 | * Note: pprev is set to NULL when return value is NULL. | ||
1612 | */ | 1611 | */ |
1613 | struct vm_area_struct * | 1612 | struct vm_area_struct * |
1614 | find_vma_prev(struct mm_struct *mm, unsigned long addr, | 1613 | find_vma_prev(struct mm_struct *mm, unsigned long addr, |
@@ -1617,7 +1616,16 @@ find_vma_prev(struct mm_struct *mm, unsigned long addr, | |||
1617 | struct vm_area_struct *vma; | 1616 | struct vm_area_struct *vma; |
1618 | 1617 | ||
1619 | vma = find_vma(mm, addr); | 1618 | vma = find_vma(mm, addr); |
1620 | *pprev = vma ? vma->vm_prev : NULL; | 1619 | if (vma) { |
1620 | *pprev = vma->vm_prev; | ||
1621 | } else { | ||
1622 | struct rb_node *rb_node = mm->mm_rb.rb_node; | ||
1623 | *pprev = NULL; | ||
1624 | while (rb_node) { | ||
1625 | *pprev = rb_entry(rb_node, struct vm_area_struct, vm_rb); | ||
1626 | rb_node = rb_node->rb_right; | ||
1627 | } | ||
1628 | } | ||
1621 | return vma; | 1629 | return vma; |
1622 | } | 1630 | } |
1623 | 1631 | ||