diff options
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index f43601827607..9ce7f81c8abc 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -889,7 +889,16 @@ static int try_to_unuse(unsigned int type) | |||
889 | lock_page(page); | 889 | lock_page(page); |
890 | wait_on_page_writeback(page); | 890 | wait_on_page_writeback(page); |
891 | } | 891 | } |
892 | if (PageSwapCache(page)) | 892 | |
893 | /* | ||
894 | * It is conceivable that a racing task removed this page from | ||
895 | * swap cache just before we acquired the page lock at the top, | ||
896 | * or while we dropped it in unuse_mm(). The page might even | ||
897 | * be back in swap cache on another swap area: that we must not | ||
898 | * delete, since it may not have been written out to swap yet. | ||
899 | */ | ||
900 | if (PageSwapCache(page) && | ||
901 | likely(page_private(page) == entry.val)) | ||
893 | delete_from_swap_cache(page); | 902 | delete_from_swap_cache(page); |
894 | 903 | ||
895 | /* | 904 | /* |