--- 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; }