[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
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)
|
||||
return 1;
|
||||
|
||||
if (!uptodate)
|
||||
if (!uptodate) {
|
||||
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);
|
||||
bio_put(bio);
|
||||
return 0;
|
||||
|
@ -70,6 +85,10 @@ static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err)
|
|||
if (!uptodate) {
|
||||
SetPageError(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 {
|
||||
SetPageUptodate(page);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue