Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision 2e4e706a8704952b76f052d1fa9f7a72e9f6d471)
+++ kernel/generic/src/mm/as.c	(revision ba4a63b85a4380c6b8324933e535690fa7ca1d70)
@@ -422,4 +422,6 @@
 		 * No need to check for overlaps.
 		 */
+
+		page_table_lock(as, false);
 
 		/*
@@ -486,5 +488,4 @@
 					pte_t *pte;
 			
-					page_table_lock(as, false);
 					pte = page_mapping_find(as, b +
 					    i * PAGE_SIZE);
@@ -499,5 +500,4 @@
 					page_mapping_remove(as, b +
 					    i * PAGE_SIZE);
-					page_table_unlock(as, false);
 				}
 			}
@@ -510,4 +510,5 @@
 		tlb_invalidate_pages(as->asid, area->base + pages * PAGE_SIZE,
 		    area->pages - pages);
+
 		/*
 		 * Invalidate software translation caches (e.g. TSB on sparc64).
@@ -516,4 +517,6 @@
 		    pages * PAGE_SIZE, area->pages - pages);
 		tlb_shootdown_finalize();
+
+		page_table_unlock(as, false);
 		
 	} else {
@@ -565,4 +568,6 @@
 
 	base = area->base;
+
+	page_table_lock(as, false);
 
 	/*
@@ -586,5 +591,4 @@
 			
 			for (j = 0; j < (size_t) node->value[i]; j++) {
-				page_table_lock(as, false);
 				pte = page_mapping_find(as, b + j * PAGE_SIZE);
 				ASSERT(pte && PTE_VALID(pte) &&
@@ -596,5 +600,4 @@
 				}
 				page_mapping_remove(as, b + j * PAGE_SIZE);				
-				page_table_unlock(as, false);
 			}
 		}
@@ -606,4 +609,5 @@
 
 	tlb_invalidate_pages(as->asid, area->base, area->pages);
+
 	/*
 	 * Invalidate potential software translation caches (e.g. TSB on
@@ -612,4 +616,6 @@
 	as_invalidate_translation_cache(as, area->base, area->pages);
 	tlb_shootdown_finalize();
+
+	page_table_unlock(as, false);
 	
 	btree_destroy(&area->used_space);
@@ -858,4 +864,6 @@
 	old_frame = malloc(used_pages * sizeof(uintptr_t), 0);
 
+	page_table_lock(as, false);
+
 	/*
 	 * Start TLB shootdown sequence.
@@ -881,5 +889,4 @@
 			
 			for (j = 0; j < (size_t) node->value[i]; j++) {
-				page_table_lock(as, false);
 				pte = page_mapping_find(as, b + j * PAGE_SIZE);
 				ASSERT(pte && PTE_VALID(pte) &&
@@ -889,5 +896,4 @@
 				/* Remove old mapping */
 				page_mapping_remove(as, b + j * PAGE_SIZE);
-				page_table_unlock(as, false);
 			}
 		}
@@ -906,4 +912,6 @@
 	as_invalidate_translation_cache(as, area->base, area->pages);
 	tlb_shootdown_finalize();
+
+	page_table_unlock(as, false);
 
 	/*
