Commit aa261f54 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen

HWPOISON: Enable .remove_error_page for migration aware file systems

Enable removing of corrupted pages through truncation
for a bunch of file systems: ext*, xfs, gfs2, ocfs2, ntfs
These should cover most server needs.

I chose the set of migration aware file systems for this
for now, assuming they have been especially audited.
But in general it should be safe for all file systems
on the data area that support read/write and truncate.

Caveat: the hardware error handler does not take i_mutex
for now before calling the truncate function. Is that ok?

Cc: tytso@mit.edu
Cc: hch@infradead.org
Cc: mfasheh@suse.com
Cc: aia21@cantab.net
Cc: hugh.dickins@tiscali.co.uk
Cc: swhiteho@redhat.com
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
parent 6a46079c
...@@ -819,6 +819,7 @@ const struct address_space_operations ext2_aops = { ...@@ -819,6 +819,7 @@ const struct address_space_operations ext2_aops = {
.writepages = ext2_writepages, .writepages = ext2_writepages,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
const struct address_space_operations ext2_aops_xip = { const struct address_space_operations ext2_aops_xip = {
...@@ -837,6 +838,7 @@ const struct address_space_operations ext2_nobh_aops = { ...@@ -837,6 +838,7 @@ const struct address_space_operations ext2_nobh_aops = {
.direct_IO = ext2_direct_IO, .direct_IO = ext2_direct_IO,
.writepages = ext2_writepages, .writepages = ext2_writepages,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.error_remove_page = generic_error_remove_page,
}; };
/* /*
......
...@@ -1819,6 +1819,7 @@ static const struct address_space_operations ext3_ordered_aops = { ...@@ -1819,6 +1819,7 @@ static const struct address_space_operations ext3_ordered_aops = {
.direct_IO = ext3_direct_IO, .direct_IO = ext3_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations ext3_writeback_aops = { static const struct address_space_operations ext3_writeback_aops = {
...@@ -1834,6 +1835,7 @@ static const struct address_space_operations ext3_writeback_aops = { ...@@ -1834,6 +1835,7 @@ static const struct address_space_operations ext3_writeback_aops = {
.direct_IO = ext3_direct_IO, .direct_IO = ext3_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations ext3_journalled_aops = { static const struct address_space_operations ext3_journalled_aops = {
...@@ -1848,6 +1850,7 @@ static const struct address_space_operations ext3_journalled_aops = { ...@@ -1848,6 +1850,7 @@ static const struct address_space_operations ext3_journalled_aops = {
.invalidatepage = ext3_invalidatepage, .invalidatepage = ext3_invalidatepage,
.releasepage = ext3_releasepage, .releasepage = ext3_releasepage,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
void ext3_set_aops(struct inode *inode) void ext3_set_aops(struct inode *inode)
......
...@@ -3373,6 +3373,7 @@ static const struct address_space_operations ext4_ordered_aops = { ...@@ -3373,6 +3373,7 @@ static const struct address_space_operations ext4_ordered_aops = {
.direct_IO = ext4_direct_IO, .direct_IO = ext4_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations ext4_writeback_aops = { static const struct address_space_operations ext4_writeback_aops = {
...@@ -3388,6 +3389,7 @@ static const struct address_space_operations ext4_writeback_aops = { ...@@ -3388,6 +3389,7 @@ static const struct address_space_operations ext4_writeback_aops = {
.direct_IO = ext4_direct_IO, .direct_IO = ext4_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations ext4_journalled_aops = { static const struct address_space_operations ext4_journalled_aops = {
...@@ -3402,6 +3404,7 @@ static const struct address_space_operations ext4_journalled_aops = { ...@@ -3402,6 +3404,7 @@ static const struct address_space_operations ext4_journalled_aops = {
.invalidatepage = ext4_invalidatepage, .invalidatepage = ext4_invalidatepage,
.releasepage = ext4_releasepage, .releasepage = ext4_releasepage,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations ext4_da_aops = { static const struct address_space_operations ext4_da_aops = {
...@@ -3418,6 +3421,7 @@ static const struct address_space_operations ext4_da_aops = { ...@@ -3418,6 +3421,7 @@ static const struct address_space_operations ext4_da_aops = {
.direct_IO = ext4_direct_IO, .direct_IO = ext4_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
void ext4_set_aops(struct inode *inode) void ext4_set_aops(struct inode *inode)
......
...@@ -1135,6 +1135,7 @@ static const struct address_space_operations gfs2_writeback_aops = { ...@@ -1135,6 +1135,7 @@ static const struct address_space_operations gfs2_writeback_aops = {
.direct_IO = gfs2_direct_IO, .direct_IO = gfs2_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations gfs2_ordered_aops = { static const struct address_space_operations gfs2_ordered_aops = {
...@@ -1151,6 +1152,7 @@ static const struct address_space_operations gfs2_ordered_aops = { ...@@ -1151,6 +1152,7 @@ static const struct address_space_operations gfs2_ordered_aops = {
.direct_IO = gfs2_direct_IO, .direct_IO = gfs2_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
static const struct address_space_operations gfs2_jdata_aops = { static const struct address_space_operations gfs2_jdata_aops = {
...@@ -1166,6 +1168,7 @@ static const struct address_space_operations gfs2_jdata_aops = { ...@@ -1166,6 +1168,7 @@ static const struct address_space_operations gfs2_jdata_aops = {
.invalidatepage = gfs2_invalidatepage, .invalidatepage = gfs2_invalidatepage,
.releasepage = gfs2_releasepage, .releasepage = gfs2_releasepage,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
void gfs2_set_aops(struct inode *inode) void gfs2_set_aops(struct inode *inode)
......
...@@ -1550,6 +1550,7 @@ const struct address_space_operations ntfs_aops = { ...@@ -1550,6 +1550,7 @@ const struct address_space_operations ntfs_aops = {
.migratepage = buffer_migrate_page, /* Move a page cache page from .migratepage = buffer_migrate_page, /* Move a page cache page from
one physical page to an one physical page to an
other. */ other. */
.error_remove_page = generic_error_remove_page,
}; };
/** /**
...@@ -1569,6 +1570,7 @@ const struct address_space_operations ntfs_mst_aops = { ...@@ -1569,6 +1570,7 @@ const struct address_space_operations ntfs_mst_aops = {
.migratepage = buffer_migrate_page, /* Move a page cache page from .migratepage = buffer_migrate_page, /* Move a page cache page from
one physical page to an one physical page to an
other. */ other. */
.error_remove_page = generic_error_remove_page,
}; };
#ifdef NTFS_RW #ifdef NTFS_RW
......
...@@ -1997,4 +1997,5 @@ const struct address_space_operations ocfs2_aops = { ...@@ -1997,4 +1997,5 @@ const struct address_space_operations ocfs2_aops = {
.releasepage = ocfs2_releasepage, .releasepage = ocfs2_releasepage,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
...@@ -1636,4 +1636,5 @@ const struct address_space_operations xfs_address_space_operations = { ...@@ -1636,4 +1636,5 @@ const struct address_space_operations xfs_address_space_operations = {
.direct_IO = xfs_vm_direct_IO, .direct_IO = xfs_vm_direct_IO,
.migratepage = buffer_migrate_page, .migratepage = buffer_migrate_page,
.is_partially_uptodate = block_is_partially_uptodate, .is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
}; };
...@@ -2421,6 +2421,7 @@ static const struct address_space_operations shmem_aops = { ...@@ -2421,6 +2421,7 @@ static const struct address_space_operations shmem_aops = {
.write_end = shmem_write_end, .write_end = shmem_write_end,
#endif #endif
.migratepage = migrate_page, .migratepage = migrate_page,
.error_remove_page = generic_error_remove_page,
}; };
static const struct file_operations shmem_file_operations = { static const struct file_operations shmem_file_operations = {
......
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