---

 memhotplug-dave/include/linux/mm.h |    5 +++++
 memhotplug-dave/mm/memory.c        |   15 ++++++++-------
 2 files changed, 13 insertions(+), 7 deletions(-)

diff -puN include/linux/mm.h~AA-PM-22.1-cow-on-zeropage include/linux/mm.h
--- memhotplug/include/linux/mm.h~AA-PM-22.1-cow-on-zeropage	2005-03-28 16:38:32.000000000 -0800
+++ memhotplug-dave/include/linux/mm.h	2005-03-28 16:38:32.000000000 -0800
@@ -181,6 +181,11 @@ extern unsigned int kobjsize(const void 
 #define VM_NormalReadHint(v)		(!((v)->vm_flags & VM_READHINTMASK))
 #define VM_SequentialReadHint(v)	((v)->vm_flags & VM_SEQ_READ)
 #define VM_RandomReadHint(v)		((v)->vm_flags & VM_RAND_READ)
+#ifdef CONFIG_MEMORY_HOTPLUG
+#define VM_Immovable(v)			((v)->vm_flags & VM_IMMOVABLE)
+#else
+#define VM_Immovable(v)			(0)
+#endif
 
 /*
  * mapping from the currently active vm_flags protection bits (the
diff -puN mm/memory.c~AA-PM-22.1-cow-on-zeropage mm/memory.c
--- memhotplug/mm/memory.c~AA-PM-22.1-cow-on-zeropage	2005-03-28 16:38:32.000000000 -0800
+++ memhotplug-dave/mm/memory.c	2005-03-28 16:38:32.000000000 -0800
@@ -1204,15 +1204,18 @@ static int do_wp_page(struct mm_struct *
 		goto no_new_page;
 
 	if (old_page == ZERO_PAGE(address)) {
-		new_page = alloc_zeroed_user_highpage(vma, address);
+		if (VM_Immovable(vma)) {
+			new_page = alloc_page_vma(GFP_USER, vma, address);
+			if (new_page)
+				clear_user_page(address, address, new_page);
+		} else
+			new_page = alloc_zeroed_user_highpage(vma, address);
 		if (!new_page)
 			goto no_new_page;
 	} else {
-#ifdef CONFIG_MEMORY_HOTPLUG
-		if (vma->vm_flags & VM_IMMOVABLE)
+		if (VM_Immovable(vma))
 			new_page = alloc_page_vma(GFP_USER, vma, address);
 		else
-#endif
 			new_page = alloc_page_vma(GFP_HIGHUSER, vma, address);
 
 		if (!new_page)
@@ -1692,11 +1695,9 @@ do_anonymous_page(struct mm_struct *mm, 
 
 		if (unlikely(anon_vma_prepare(vma)))
 			goto no_mem;
-#ifdef CONFIG_MEMORY_HOTPLUG
-		if (vma->vm_flags & VM_IMMOVABLE)
+		if (VM_Immovable(vma))
 			page = alloc_page_vma(GFP_USER, vma, addr);
 		else
-#endif
 			page = alloc_zeroed_user_highpage(vma, addr);
 		if (!page)
 			goto no_mem;
_
