diff -urNp 2.4.19rc1/mm/page_alloc.c vm-cleanups/mm/page_alloc.c
--- 2.4.19rc1/mm/page_alloc.c	Tue Jun 25 23:56:23 2002
+++ vm-cleanups/mm/page_alloc.c	Fri Jun 28 13:28:31 2002
@@ -82,8 +82,11 @@ static void __free_pages_ok (struct page
 	/* Yes, think what happens when other parts of the kernel take 
 	 * a reference to a page in order to pin it for io. -ben
 	 */
-	if (PageLRU(page))
+	if (PageLRU(page)) {
+		if (unlikely(in_interrupt()))
+			BUG();
 		lru_cache_del(page);
+	}
 
 	if (page->buffers)
 		BUG();
diff -urNp 2.4.19rc1/mm/shmem.c vm-cleanups/mm/shmem.c
--- 2.4.19rc1/mm/shmem.c	Tue Jun 25 23:56:23 2002
+++ vm-cleanups/mm/shmem.c	Fri Jun 28 13:37:51 2002
@@ -588,8 +588,8 @@ repeat:
 		swap_free(*entry);
 		*entry = (swp_entry_t) {0};
 		delete_from_swap_cache(page);
-		flags = page->flags & ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_referenced) | (1 << PG_arch_1));
-		page->flags = flags | (1 << PG_dirty);
+		/* delete_from_swap_cache marks the page dirty */
+		page->flags &= ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_referenced) | (1 << PG_arch_1));
 		add_to_page_cache_locked(page, mapping, idx);
 		info->swapped--;
 		spin_unlock (&info->lock);
diff -urNp 2.4.19rc1/mm/swap_state.c vm-cleanups/mm/swap_state.c
--- 2.4.19rc1/mm/swap_state.c	Tue Jan 22 12:55:27 2002
+++ vm-cleanups/mm/swap_state.c	Fri Jun 28 13:32:59 2002
@@ -99,7 +99,7 @@ void __delete_from_swap_cache(struct pag
 		BUG();
 	if (!PageSwapCache(page))
 		BUG();
-	ClearPageDirty(page);
+	SetPageDirty(page);
 	__remove_inode_page(page);
 	INC_CACHE_INFO(del_total);
 }
@@ -114,9 +114,6 @@ void delete_from_swap_cache(struct page 
 {
 	swp_entry_t entry;
 
-	if (!PageLocked(page))
-		BUG();
-
 	block_flushpage(page, 0);
 
 	entry.val = page->index;
diff -urNp 2.4.19rc1/mm/swapfile.c vm-cleanups/mm/swapfile.c
--- 2.4.19rc1/mm/swapfile.c	Tue Jun 25 23:56:23 2002
+++ vm-cleanups/mm/swapfile.c	Fri Jun 28 13:43:09 2002
@@ -309,7 +309,6 @@ int remove_exclusive_swap_page(struct pa
 		spin_lock(&pagecache_lock);
 		if (page_count(page) - !!page->buffers == 2) {
 			__delete_from_swap_cache(page);
-			SetPageDirty(page);
 			retval = 1;
 		}
 		spin_unlock(&pagecache_lock);
@@ -343,10 +342,8 @@ void free_swap_and_cache(swp_entry_t ent
 	if (page) {
 		page_cache_get(page);
 		/* Only cache user (+us), or swap space full? Free it! */
-		if (page_count(page) - !!page->buffers == 2 || vm_swap_full()) {
+		if (page_count(page) - !!page->buffers == 2 || vm_swap_full())
 			delete_from_swap_cache(page);
-			SetPageDirty(page);
-		}
 		UnlockPage(page);
 		page_cache_release(page);
 	}
@@ -683,7 +680,6 @@ static int try_to_unuse(unsigned int typ
 		 * to 1, we did not mark any present ptes as dirty: must
 		 * mark page dirty so try_to_swap_out will preserve it.
 		 */
-		SetPageDirty(page);
 		UnlockPage(page);
 		page_cache_release(page);