]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] Use BIO_RW_SYNC in swap write page
authorAndrew Morton <akpm@osdl.org>
Mon, 12 Apr 2004 07:16:04 +0000 (00:16 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 12 Apr 2004 07:16:04 +0000 (00:16 -0700)
From: Jens Axboe <axboe@suse.de>

Dog slow software suspend found this one. If WB_SYNC_ALL, then you need
to mark the bio as sync as well.

This is because swap_writepage() does a remove_exclusive_swap_page() (going
to __delete_from_swap_cache -> __remove_from_page_cache) which can kill
page->mapping, thus aops->sync_page() has nothing to work with for unplugging
the address space.

mm/page_io.c

index dde9d23f99bdf9ca9a58914345b6b8c1e887c19e..7ec159ded5cad6c0a315a140f143991beb5f44df 100644 (file)
@@ -90,7 +90,7 @@ static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err)
 int swap_writepage(struct page *page, struct writeback_control *wbc)
 {
        struct bio *bio;
-       int ret = 0;
+       int ret = 0, rw = WRITE;
 
        if (remove_exclusive_swap_page(page)) {
                unlock_page(page);
@@ -103,10 +103,12 @@ int swap_writepage(struct page *page, struct writeback_control *wbc)
                ret = -ENOMEM;
                goto out;
        }
+       if (wbc->sync_mode == WB_SYNC_ALL)
+               rw |= (1 << BIO_RW_SYNC);
        inc_page_state(pswpout);
        set_page_writeback(page);
        unlock_page(page);
-       submit_bio(WRITE, bio);
+       submit_bio(rw, bio);
 out:
        return ret;
 }