--- 2.4.10pre11aa1/mm/vmscan.c.~1~	Tue Sep 18 21:23:49 2001
+++ 2.4.10pre11aa1/mm/vmscan.c	Thu Sep 20 01:29:58 2001
@@ -415,7 +415,10 @@
 				spin_unlock(&pagemap_lru_lock);
 
 				ClearPageDirty(page);
+
+				page_cache_get(page);
 				writepage(page);
+				page_cache_release(page);
 
 				spin_lock(&pagemap_lru_lock);
 				continue;
diff -urN 2.4.10pre12/mm/page_io.c backout/mm/page_io.c
--- 2.4.10pre12/mm/page_io.c	Thu Sep 20 01:44:20 2001
+++ backout/mm/page_io.c	Thu Sep 20 06:45:23 2001
@@ -78,15 +78,7 @@
  	if (!wait) {
  		SetPageDecrAfter(page);
  		atomic_inc(&nr_async_pages);
- 	} else
-		/*
-		 * Must hold a reference until after wait_on_page()
-		 * returned or it could be freed by the VM after
-		 * I/O is completed and the page is been unlocked.
-		 * The asynchronous path is fine since it never
-		 * references the page after brw_page().
-		 */
-		page_cache_get(page);
+ 	}
 
  	/* block_size == PAGE_SIZE/zones_used */
  	brw_page(rw, page, dev, zones, block_size);
@@ -102,7 +94,6 @@
 	/* This shouldn't happen, but check to be sure. */
 	if (page_count(page) == 0)
 		printk(KERN_ERR "rw_swap_page: page unused while waiting!\n");
-	page_cache_release(page);
 
 	return 1;
 }