|
@@ -1608,7 +1608,6 @@ EXPORT_SYMBOL(find_vma);
|
|
|
|
|
|
/*
|
|
|
* Same as find_vma, but also return a pointer to the previous VMA in *pprev.
|
|
|
- * Note: pprev is set to NULL when return value is NULL.
|
|
|
*/
|
|
|
struct vm_area_struct *
|
|
|
find_vma_prev(struct mm_struct *mm, unsigned long addr,
|
|
@@ -1617,7 +1616,16 @@ find_vma_prev(struct mm_struct *mm, unsigned long addr,
|
|
|
struct vm_area_struct *vma;
|
|
|
|
|
|
vma = find_vma(mm, addr);
|
|
|
- *pprev = vma ? vma->vm_prev : NULL;
|
|
|
+ if (vma) {
|
|
|
+ *pprev = vma->vm_prev;
|
|
|
+ } else {
|
|
|
+ struct rb_node *rb_node = mm->mm_rb.rb_node;
|
|
|
+ *pprev = NULL;
|
|
|
+ while (rb_node) {
|
|
|
+ *pprev = rb_entry(rb_node, struct vm_area_struct, vm_rb);
|
|
|
+ rb_node = rb_node->rb_right;
|
|
|
+ }
|
|
|
+ }
|
|
|
return vma;
|
|
|
}
|
|
|
|