diff -urNp ref/mm/shmem.c 2.4.20pre5aa1/mm/shmem.c --- ref/mm/shmem.c Fri Aug 30 01:36:11 2002 +++ 2.4.20pre5aa1/mm/shmem.c Fri Aug 30 01:36:17 2002 @@ -587,8 +587,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 ref/mm/swap_state.c 2.4.20pre5aa1/mm/swap_state.c --- ref/mm/swap_state.c Thu Aug 29 02:13:21 2002 +++ 2.4.20pre5aa1/mm/swap_state.c Fri Aug 30 01:37:23 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(); - if (unlikely(!block_flushpage(page, 0))) BUG(); /* an anonymous page cannot have page->buffers set */ diff -urNp ref/mm/swapfile.c 2.4.20pre5aa1/mm/swapfile.c --- ref/mm/swapfile.c Fri Aug 9 14:52:29 2002 +++ 2.4.20pre5aa1/mm/swapfile.c Fri Aug 30 01:36:17 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);