Index: linux-2.6/mm/swapfile.c =================================================================== --- linux-2.6.orig/mm/swapfile.c +++ linux-2.6/mm/swapfile.c @@ -356,7 +356,7 @@ int remove_exclusive_swap_page(struct pa return 0; if (PageWriteback(page)) return 0; - if (page_count(page) != 2) /* 2: us + cache */ + if (page_mapcount(page) > 0) return 0; entry.val = page_private(page); @@ -367,9 +367,8 @@ int remove_exclusive_swap_page(struct pa /* Is the only swap cache user the cache itself? */ retval = 0; if (p->swap_map[swp_offset(entry)] == 1) { - /* Recheck the page count with the swapcache lock held.. */ write_lock_irq(&swapper_space.tree_lock); - if ((page_count(page) == 2) && !PageWriteback(page)) { + if (!PageWriteback(page)) { __delete_from_swap_cache(page); SetPageDirty(page); retval = 1; @@ -402,13 +401,11 @@ void free_swap_and_cache(swp_entry_t ent spin_unlock(&swap_lock); } if (page) { - int one_user; - BUG_ON(PagePrivate(page)); page_cache_get(page); - one_user = (page_count(page) == 2); - /* Only cache user (+us), or swap space full? Free it! */ - if (!PageWriteback(page) && (one_user || vm_swap_full())) { + /* No users, or swap space full? Free it! */ + if (!PageWriteback(page) && + (page_mapcount(page) == 0 || vm_swap_full())) { delete_from_swap_cache(page); SetPageDirty(page); }