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