diff options
Diffstat (limited to 'mm/swap_state.c')
-rw-r--r-- | mm/swap_state.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/mm/swap_state.c b/mm/swap_state.c index 797c3831cbec..7a3ece0b5a3b 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -75,6 +75,7 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) | |||
75 | BUG_ON(!PageLocked(page)); | 75 | BUG_ON(!PageLocked(page)); |
76 | BUG_ON(PageSwapCache(page)); | 76 | BUG_ON(PageSwapCache(page)); |
77 | BUG_ON(PagePrivate(page)); | 77 | BUG_ON(PagePrivate(page)); |
78 | BUG_ON(!PageSwapBacked(page)); | ||
78 | error = radix_tree_preload(gfp_mask); | 79 | error = radix_tree_preload(gfp_mask); |
79 | if (!error) { | 80 | if (!error) { |
80 | page_cache_get(page); | 81 | page_cache_get(page); |
@@ -303,6 +304,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
303 | * May fail (-ENOMEM) if radix-tree node allocation failed. | 304 | * May fail (-ENOMEM) if radix-tree node allocation failed. |
304 | */ | 305 | */ |
305 | set_page_locked(new_page); | 306 | set_page_locked(new_page); |
307 | SetPageSwapBacked(new_page); | ||
306 | err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL); | 308 | err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL); |
307 | if (likely(!err)) { | 309 | if (likely(!err)) { |
308 | /* | 310 | /* |
@@ -312,6 +314,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
312 | swap_readpage(NULL, new_page); | 314 | swap_readpage(NULL, new_page); |
313 | return new_page; | 315 | return new_page; |
314 | } | 316 | } |
317 | ClearPageSwapBacked(new_page); | ||
315 | clear_page_locked(new_page); | 318 | clear_page_locked(new_page); |
316 | swap_free(entry); | 319 | swap_free(entry); |
317 | } while (err != -ENOMEM); | 320 | } while (err != -ENOMEM); |