swap_free(entry);
ptr[offset] = (swp_entry_t) {0};
- while (inode && (PageWriteback(page) ||
- move_from_swap_cache(page, idx, inode->i_mapping))) {
+ while (inode && move_from_swap_cache(page, idx, inode->i_mapping)) {
/*
* Yield for kswapd, and try again - but we're still
* holding the page lock - ugh! fix this up later on.
* Beware of inode being unlinked or truncated: just
* leave try_to_unuse to delete_from_swap_cache if so.
- *
- * AKPM: We now wait on writeback too. Note that it's
- * the page lock which prevents new writeback from starting.
*/
spin_unlock(&info->lock);
- if (PageWriteback(page))
- wait_on_page_writeback(page);
- else
- yield();
+ yield();
spin_lock(&info->lock);
ptr = shmem_swp_entry(info, idx, 0);
if (IS_ERR(ptr))
spin_unlock(&info->lock);
wait_on_page_writeback(page);
unlock_page(page);
+ page_cache_release(page);
goto repeat;
}
error = move_from_swap_cache(page, idx, mapping);
if ((*swap_map > 1) && PageDirty(page) && PageSwapCache(page)) {
swap_writepage(page);
lock_page(page);
- }
- if (PageSwapCache(page)) {
wait_on_page_writeback(page);
- delete_from_swap_cache(page);
}
+ if (PageSwapCache(page))
+ delete_from_swap_cache(page);
/*
* So we could skip searching mms once swap count went