--- expand-stack/include/linux/mm.h.~1~ Tue Jun 5 03:12:47 2001 +++ expand-stack/include/linux/mm.h Tue Jun 5 03:15:35 2001 @@ -505,22 +505,25 @@ struct vm_area_struct * prev_vma) { unsigned long grow; + int err = -ENOMEM; address &= PAGE_MASK; + spin_lock(&vma->vm_mm->page_table_lock); if (prev_vma && prev_vma->vm_end + (heap_stack_gap << PAGE_SHIFT) > address) - return -ENOMEM; + goto out_unlock; grow = (vma->vm_start - address) >> PAGE_SHIFT; if (vma->vm_end - address > current->rlim[RLIMIT_STACK].rlim_cur || ((vma->vm_mm->total_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_AS].rlim_cur) - return -ENOMEM; - spin_lock(&vma->vm_mm->page_table_lock); + goto out_unlock; vma->vm_start = address; vma->vm_pgoff -= grow; vma->vm_mm->total_vm += grow; if (vma->vm_flags & VM_LOCKED) vma->vm_mm->locked_vm += grow; + err = 0; + out_unlock: spin_unlock(&vma->vm_mm->page_table_lock); - return 0; + return err; } /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */