mm: fix s390 BUG by __set_page_dirty_no_writeback on swap
[pandora-kernel.git] / mm / swap_state.c
index ea6b32d..4c5ff7f 100644 (file)
@@ -26,7 +26,7 @@
  */
 static const struct address_space_operations swap_aops = {
        .writepage      = swap_writepage,
-       .set_page_dirty = __set_page_dirty_nobuffers,
+       .set_page_dirty = __set_page_dirty_no_writeback,
        .migratepage    = migrate_page,
 };
 
@@ -372,25 +372,23 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
 struct page *swapin_readahead(swp_entry_t entry, gfp_t gfp_mask,
                        struct vm_area_struct *vma, unsigned long addr)
 {
-       int nr_pages;
        struct page *page;
-       unsigned long offset;
-       unsigned long end_offset;
+       unsigned long offset = swp_offset(entry);
+       unsigned long start_offset, end_offset;
+       unsigned long mask = (1UL << page_cluster) - 1;
 
-       /*
-        * Get starting offset for readaround, and number of pages to read.
-        * Adjust starting address by readbehind (for NUMA interleave case)?
-        * No, it's very unlikely that swap layout would follow vma layout,
-        * more likely that neighbouring swap pages came from the same node:
-        * so use the same "addr" to choose the same node for each swap read.
-        */
-       nr_pages = valid_swaphandles(entry, &offset);
-       for (end_offset = offset + nr_pages; offset < end_offset; offset++) {
+       /* Read a page_cluster sized and aligned cluster around offset. */
+       start_offset = offset & ~mask;
+       end_offset = offset | mask;
+       if (!start_offset)      /* First page is swap header. */
+               start_offset++;
+
+       for (offset = start_offset; offset <= end_offset ; offset++) {
                /* Ok, do the async read-ahead now */
                page = read_swap_cache_async(swp_entry(swp_type(entry), offset),
                                                gfp_mask, vma, addr);
                if (!page)
-                       break;
+                       continue;
                page_cache_release(page);
        }
        lru_add_drain();        /* Push any new pages onto the LRU now */