struct rb_root_cached *root = NULL;
struct anon_vma *anon_vma = NULL;
struct file *file = vma->vm_file;
- bool start_changed = false, end_changed = false;
+ bool vma_changed = false;
long adjust_next = 0;
int remove_next = 0;
}
if (start != vma->vm_start) {
- unsigned long old_start = vma->vm_start;
+ if (vma->vm_start < start)
+ vma_mt_szero(mm, vma->vm_start, start);
+ else
+ vma_changed = true;
vma->vm_start = start;
- if (old_start < start)
- vma_mt_szero(mm, old_start, start);
- start_changed = true;
}
if (end != vma->vm_end) {
- unsigned long old_end = vma->vm_end;
+ if (vma->vm_end > end)
+ vma_mt_szero(mm, end, vma->vm_end);
+ else
+ vma_changed = true;
vma->vm_end = end;
- if (old_end > end)
- vma_mt_szero(mm, end, old_end);
- end_changed = true;
}
- if (end_changed || start_changed)
+ if (vma_changed)
vma_mt_store(mm, vma);
vma->vm_pgoff = pgoff;
* (it may either follow vma or precede it).
*/
__insert_vm_struct(mm, insert);
- } else if (end_changed && !next) {
+ } else if (vma_changed && !next) {
mm->highest_vm_end = vm_end_gap(vma);
}