Commit b1c72a96 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Use BIO_RW_SYNC in swap write page

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.
parent 6d27f67b
...@@ -90,7 +90,7 @@ static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err) ...@@ -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) int swap_writepage(struct page *page, struct writeback_control *wbc)
{ {
struct bio *bio; struct bio *bio;
int ret = 0; int ret = 0, rw = WRITE;
if (remove_exclusive_swap_page(page)) { if (remove_exclusive_swap_page(page)) {
unlock_page(page); unlock_page(page);
...@@ -103,10 +103,12 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) ...@@ -103,10 +103,12 @@ int swap_writepage(struct page *page, struct writeback_control *wbc)
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
if (wbc->sync_mode == WB_SYNC_ALL)
rw |= (1 << BIO_RW_SYNC);
inc_page_state(pswpout); inc_page_state(pswpout);
set_page_writeback(page); set_page_writeback(page);
unlock_page(page); unlock_page(page);
submit_bio(WRITE, bio); submit_bio(rw, bio);
out: out:
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment