aboutsummaryrefslogtreecommitdiffstats
path: root/mm/swap_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/swap_state.c')
-rw-r--r--mm/swap_state.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/mm/swap_state.c b/mm/swap_state.c
index d8aadaf2a0ba..3e3381d6c7ee 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -64,7 +64,7 @@ void show_swap_cache_info(void)
64} 64}
65 65
66/* 66/*
67 * add_to_swap_cache resembles add_to_page_cache on swapper_space, 67 * add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
68 * but sets SwapCache flag and private instead of mapping and index. 68 * but sets SwapCache flag and private instead of mapping and index.
69 */ 69 */
70int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) 70int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
@@ -76,19 +76,26 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
76 BUG_ON(PagePrivate(page)); 76 BUG_ON(PagePrivate(page));
77 error = radix_tree_preload(gfp_mask); 77 error = radix_tree_preload(gfp_mask);
78 if (!error) { 78 if (!error) {
79 page_cache_get(page);
80 SetPageSwapCache(page);
81 set_page_private(page, entry.val);
82
79 write_lock_irq(&swapper_space.tree_lock); 83 write_lock_irq(&swapper_space.tree_lock);
80 error = radix_tree_insert(&swapper_space.page_tree, 84 error = radix_tree_insert(&swapper_space.page_tree,
81 entry.val, page); 85 entry.val, page);
82 if (!error) { 86 if (likely(!error)) {
83 page_cache_get(page);
84 SetPageSwapCache(page);
85 set_page_private(page, entry.val);
86 total_swapcache_pages++; 87 total_swapcache_pages++;
87 __inc_zone_page_state(page, NR_FILE_PAGES); 88 __inc_zone_page_state(page, NR_FILE_PAGES);
88 INC_CACHE_INFO(add_total); 89 INC_CACHE_INFO(add_total);
89 } 90 }
90 write_unlock_irq(&swapper_space.tree_lock); 91 write_unlock_irq(&swapper_space.tree_lock);
91 radix_tree_preload_end(); 92 radix_tree_preload_end();
93
94 if (unlikely(error)) {
95 set_page_private(page, 0UL);
96 ClearPageSwapCache(page);
97 page_cache_release(page);
98 }
92 } 99 }
93 return error; 100 return error;
94} 101}