diff -purN -X /home/mbligh/.diff.exclude 863-vgtod3/mm/mmap.c 870-objrmap_fixes/mm/mmap.c
--- 863-vgtod3/mm/mmap.c	2004-03-14 09:50:14.000000000 -0800
+++ 870-objrmap_fixes/mm/mmap.c	2004-03-14 10:01:35.000000000 -0800
@@ -1285,8 +1285,8 @@ int do_munmap(struct mm_struct *mm, unsi
 	/*
 	 * Remove the vma's, and unmap the actual pages
 	 */
-	detach_vmas_to_be_unmapped(mm, mpnt, prev, end);
 	spin_lock(&mm->page_table_lock);
+	detach_vmas_to_be_unmapped(mm, mpnt, prev, end);
 	unmap_region(mm, mpnt, prev, start, end);
 	spin_unlock(&mm->page_table_lock);
 
diff -purN -X /home/mbligh/.diff.exclude 863-vgtod3/mm/rmap.c 870-objrmap_fixes/mm/rmap.c
--- 863-vgtod3/mm/rmap.c	2004-03-14 09:50:14.000000000 -0800
+++ 870-objrmap_fixes/mm/rmap.c	2004-03-14 10:01:35.000000000 -0800
@@ -470,7 +470,7 @@ try_to_unmap_obj_one(struct vm_area_stru
 	if (!pte)
 		goto out;
 
-	if (vma->vm_flags & VM_LOCKED) {
+	if (vma->vm_flags & (VM_LOCKED|VM_RESERVED)) {
 		ret =  SWAP_FAIL;
 		goto out_unmap;
 	}
diff -purN -X /home/mbligh/.diff.exclude 863-vgtod3/mm/swapfile.c 870-objrmap_fixes/mm/swapfile.c
--- 863-vgtod3/mm/swapfile.c	2004-03-14 09:50:14.000000000 -0800
+++ 870-objrmap_fixes/mm/swapfile.c	2004-03-14 10:01:36.000000000 -0800
@@ -499,7 +499,6 @@ static int unuse_process(struct mm_struc
 	/*
 	 * Go through process' page directory.
 	 */
-	down_read(&mm->mmap_sem);
 	spin_lock(&mm->page_table_lock);
 	for (vma = mm->mmap; vma; vma = vma->vm_next) {
 		pgd_t * pgd = pgd_offset(mm, vma->vm_start);
@@ -507,7 +506,6 @@ static int unuse_process(struct mm_struc
 			break;
 	}
 	spin_unlock(&mm->page_table_lock);
-	up_read(&mm->mmap_sem);
 	pte_chain_free(pte_chain);
 	return 0;
 }