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 | /* |
