--- 2.5.69-mm3/mm/memory.c 2003-05-13 10:34:56.000000000 -0500 +++ 2.5.69-mm3-test/mm/memory.c 2003-05-13 17:39:45.000000000 -0500 @@ -1085,21 +1085,21 @@ static void vmtruncate_list(struct list_ len = end - start; /* mapping wholly truncated? */ - if (vma->vm_pgoff >= pgoff) { - zap_page_range(vma, start, len); - continue; - } + if (vma->vm_pgoff < pgoff) { - /* mapping wholly unaffected? */ - len = len >> PAGE_SHIFT; - diff = pgoff - vma->vm_pgoff; - if (diff >= len) - continue; - - /* Ok, partially affected.. */ - start += diff << PAGE_SHIFT; - len = (len - diff) << PAGE_SHIFT; + /* mapping wholly unaffected? */ + len = len >> PAGE_SHIFT; + diff = pgoff - vma->vm_pgoff; + if (diff >= len) + continue; + + /* Ok, partially affected.. */ + start += diff << PAGE_SHIFT; + len = (len - diff) << PAGE_SHIFT; + } + down_write(&vma->vm_mm->mmap_sem); zap_page_range(vma, start, len); + up_write(&vma->vm_mm->mmap_sem); } }