Index: linux-2.6/kernel/fork.c =================================================================== --- linux-2.6.orig/kernel/fork.c 2005-08-04 15:24:36.000000000 +1000 +++ linux-2.6/kernel/fork.c 2005-08-26 00:20:50.000000000 +1000 @@ -256,7 +256,6 @@ static inline int dup_mmap(struct mm_str * Note that, exceptionally, here the vma is inserted * without holding mm->mmap_sem. */ - spin_lock(&mm->page_table_lock); *pprev = tmp; pprev = &tmp->vm_next; @@ -265,8 +264,11 @@ static inline int dup_mmap(struct mm_str rb_parent = &tmp->vm_rb; mm->map_count++; - retval = copy_page_range(mm, current->mm, tmp); - spin_unlock(&mm->page_table_lock); + if (!(file && (tmp->vm_flags & VM_SHARED))) { + spin_lock(&mm->page_table_lock); + retval = copy_page_range(mm, current->mm, tmp); + spin_unlock(&mm->page_table_lock); + } if (tmp->vm_ops && tmp->vm_ops->open) tmp->vm_ops->open(tmp);