return NULL;
}
err = expand_stack(vma, addr, false);
- if (unlikely(err)){
- if (err != -EAGAIN) {
- mmap_read_unlock(mm);
- return NULL;
- }
+ if (err == -EAGAIN){
if (!upgrade_mmap_lock_carefully(mm, regs))
return NULL;
- vma = find_vma(mm, addr);
- if (!vma || expand_stack(vma, addr, true)) {
- mmap_write_unlock(mm);
- return NULL;
- }
+ vma = find_extend_vma_locked(mm, addr, true);
mmap_write_downgrade(mm);
+ } else if (err) {
+ mmap_read_unlock(mm);
+ return NULL;
}
return vma;
}
return vma;
start = vma->vm_start;
err = expand_stack(vma, addr, write_locked);
- if (unlikely(err)) {
- if (err != -EAGAIN)
- return NULL;
+ if (err == -EAGAIN) {
if (!upgrade_mmap_lock_carefully(mm, NULL))
return NULL;
vma = find_vma(mm, addr);
return NULL;
}
mmap_write_downgrade(mm);
+ } else if (err) {
+ return NULL;
}
if (vma->vm_flags & VM_LOCKED)
populate_vma_page_range(vma, addr, start, NULL);