x86/smpboot: Init apic mapping before usage
[cascardo/linux.git] / mm / swap_state.c
index c8310a3..35d7e0e 100644 (file)
@@ -37,6 +37,8 @@ struct address_space swapper_spaces[MAX_SWAPFILES] = {
                .page_tree      = RADIX_TREE_INIT(GFP_ATOMIC|__GFP_NOWARN),
                .i_mmap_writable = ATOMIC_INIT(0),
                .a_ops          = &swap_aops,
+               /* swap cache doesn't use writeback related tags */
+               .flags          = 1 << AS_NO_WRITEBACK_TAGS,
        }
 };
 
@@ -92,7 +94,7 @@ int __add_to_swap_cache(struct page *page, swp_entry_t entry)
        address_space = swap_address_space(entry);
        spin_lock_irq(&address_space->tree_lock);
        error = radix_tree_insert(&address_space->page_tree,
-                                       entry.val, page);
+                                 swp_offset(entry), page);
        if (likely(!error)) {
                address_space->nrpages++;
                __inc_node_page_state(page, NR_FILE_PAGES);
@@ -143,7 +145,7 @@ void __delete_from_swap_cache(struct page *page)
 
        entry.val = page_private(page);
        address_space = swap_address_space(entry);
-       radix_tree_delete(&address_space->page_tree, page_private(page));
+       radix_tree_delete(&address_space->page_tree, swp_offset(entry));
        set_page_private(page, 0);
        ClearPageSwapCache(page);
        address_space->nrpages--;
@@ -252,9 +254,7 @@ static inline void free_swap_cache(struct page *page)
 void free_page_and_swap_cache(struct page *page)
 {
        free_swap_cache(page);
-       if (is_huge_zero_page(page))
-               put_huge_zero_page();
-       else
+       if (!is_huge_zero_page(page))
                put_page(page);
 }
 
@@ -283,7 +283,7 @@ struct page * lookup_swap_cache(swp_entry_t entry)
 {
        struct page *page;
 
-       page = find_get_page(swap_address_space(entry), entry.val);
+       page = find_get_page(swap_address_space(entry), swp_offset(entry));
 
        if (page) {
                INC_CACHE_INFO(find_success);
@@ -310,7 +310,7 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
                 * called after lookup_swap_cache() failed, re-calling
                 * that would confuse statistics.
                 */
-               found_page = find_get_page(swapper_space, entry.val);
+               found_page = find_get_page(swapper_space, swp_offset(entry));
                if (found_page)
                        break;