opp: Always add entries in dev_list with opp_table->lock held
[linux-2.6-microblaze.git] / mm / page_io.c
index e485a6e..433df12 100644 (file)
@@ -252,6 +252,16 @@ int swap_writepage(struct page *page, struct writeback_control *wbc)
                unlock_page(page);
                goto out;
        }
+       /*
+        * Arch code may have to preserve more data than just the page
+        * contents, e.g. memory tags.
+        */
+       ret = arch_prepare_to_swap(page);
+       if (ret) {
+               set_page_dirty(page);
+               unlock_page(page);
+               goto out;
+       }
        if (frontswap_store(page) == 0) {
                set_page_writeback(page);
                unlock_page(page);
@@ -302,7 +312,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
        struct swap_info_struct *sis = page_swap_info(page);
 
        VM_BUG_ON_PAGE(!PageSwapCache(page), page);
-       if (data_race(sis->flags & SWP_FS)) {
+       if (data_race(sis->flags & SWP_FS_OPS)) {
                struct kiocb kiocb;
                struct file *swap_file = sis->swap_file;
                struct address_space *mapping = swap_file->f_mapping;
@@ -349,13 +359,11 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
                return 0;
        }
 
-       ret = 0;
        bio = get_swap_bio(GFP_NOIO, page, end_write_func);
        if (bio == NULL) {
                set_page_dirty(page);
                unlock_page(page);
-               ret = -ENOMEM;
-               goto out;
+               return -ENOMEM;
        }
        bio->bi_opf = REQ_OP_WRITE | REQ_SWAP | wbc_to_write_flags(wbc);
        bio_associate_blkg_from_page(bio, page);
@@ -363,8 +371,8 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
        set_page_writeback(page);
        unlock_page(page);
        submit_bio(bio);
-out:
-       return ret;
+
+       return 0;
 }
 
 int swap_readpage(struct page *page, bool synchronous)
@@ -393,7 +401,7 @@ int swap_readpage(struct page *page, bool synchronous)
                goto out;
        }
 
-       if (data_race(sis->flags & SWP_FS)) {
+       if (data_race(sis->flags & SWP_FS_OPS)) {
                struct file *swap_file = sis->swap_file;
                struct address_space *mapping = swap_file->f_mapping;
 
@@ -403,15 +411,17 @@ int swap_readpage(struct page *page, bool synchronous)
                goto out;
        }
 
-       ret = bdev_read_page(sis->bdev, swap_page_sector(page), page);
-       if (!ret) {
-               if (trylock_page(page)) {
-                       swap_slot_free_notify(page);
-                       unlock_page(page);
-               }
+       if (sis->flags & SWP_SYNCHRONOUS_IO) {
+               ret = bdev_read_page(sis->bdev, swap_page_sector(page), page);
+               if (!ret) {
+                       if (trylock_page(page)) {
+                               swap_slot_free_notify(page);
+                               unlock_page(page);
+                       }
 
-               count_vm_event(PSWPIN);
-               goto out;
+                       count_vm_event(PSWPIN);
+                       goto out;
+               }
        }
 
        ret = 0;
@@ -455,7 +465,7 @@ int swap_set_page_dirty(struct page *page)
 {
        struct swap_info_struct *sis = page_swap_info(page);
 
-       if (data_race(sis->flags & SWP_FS)) {
+       if (data_race(sis->flags & SWP_FS_OPS)) {
                struct address_space *mapping = sis->swap_file->f_mapping;
 
                VM_BUG_ON_PAGE(!PageSwapCache(page), page);