mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
[PATCH] mm: swap write failure fixup
Currently we can silently drop data if the write to swap failed. It usually doesn't result in data-corruption because on page-in the process will receive SIGBUS (assuming write-failure implies read-failure). This assumption might or might not be valid. This patch will avoid the page being discarded after a failed write. But will print a warning the sysadmin _should_ take to heart, if a lot of swap space becomes un-writeable, OOM is not far off. Tested by making the write fail 'randomly' once every 50 writes or so. [akpm@osdl.org: printk warning fix] Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
ca5f9703df
commit
6ddab3b9eb
1 changed files with 20 additions and 1 deletions
21
mm/page_io.c
21
mm/page_io.c
|
@ -52,8 +52,23 @@ static int end_swap_bio_write(struct bio *bio, unsigned int bytes_done, int err)
|
||||||
if (bio->bi_size)
|
if (bio->bi_size)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (!uptodate)
|
if (!uptodate) {
|
||||||
SetPageError(page);
|
SetPageError(page);
|
||||||
|
/*
|
||||||
|
* We failed to write the page out to swap-space.
|
||||||
|
* Re-dirty the page in order to avoid it being reclaimed.
|
||||||
|
* Also print a dire warning that things will go BAD (tm)
|
||||||
|
* very quickly.
|
||||||
|
*
|
||||||
|
* Also clear PG_reclaim to avoid rotate_reclaimable_page()
|
||||||
|
*/
|
||||||
|
set_page_dirty(page);
|
||||||
|
printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n",
|
||||||
|
imajor(bio->bi_bdev->bd_inode),
|
||||||
|
iminor(bio->bi_bdev->bd_inode),
|
||||||
|
(unsigned long long)bio->bi_sector);
|
||||||
|
ClearPageReclaim(page);
|
||||||
|
}
|
||||||
end_page_writeback(page);
|
end_page_writeback(page);
|
||||||
bio_put(bio);
|
bio_put(bio);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -70,6 +85,10 @@ static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err)
|
||||||
if (!uptodate) {
|
if (!uptodate) {
|
||||||
SetPageError(page);
|
SetPageError(page);
|
||||||
ClearPageUptodate(page);
|
ClearPageUptodate(page);
|
||||||
|
printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n",
|
||||||
|
imajor(bio->bi_bdev->bd_inode),
|
||||||
|
iminor(bio->bi_bdev->bd_inode),
|
||||||
|
(unsigned long long)bio->bi_sector);
|
||||||
} else {
|
} else {
|
||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue