@@ -1522,6 +1522,7 @@ enum ext4_fault_bits {
EXT4_FAULT_IBITMAP_EIO, /* inode bitmap block */
EXT4_FAULT_BBITMAP_EIO, /* block bitmap block */
EXT4_FAULT_INODE_EIO, /* inode */
+ EXT4_FAULT_EXTENT_EIO, /* extent block */
EXT4_FAULT_MAX
};
@@ -1624,6 +1625,7 @@ EXT4_FAULT_INODE_FN(XATTR_CSUM, xattr_csum, 1)
EXT4_FAULT_GRP_FN(IBITMAP_EIO, inode_bitmap_io, -EIO)
EXT4_FAULT_GRP_FN(BBITMAP_EIO, block_bitmap_io, -EIO)
EXT4_FAULT_INODE_FN(INODE_EIO, inode_io, -EIO)
+EXT4_FAULT_INODE_PBLOCK_FN(EXTENT_EIO, extent_io, -EIO)
/*
* fourth extended-fs super-block data in memory
@@ -566,6 +566,11 @@ __read_extent_tree_block(const char *function, unsigned int line,
if (!bh_uptodate_or_lock(bh)) {
trace_ext4_ext_load_extent(inode, pblk, _RET_IP_);
+ err = ext4_fault_extent_io(inode->i_sb, inode->i_ino, pblk);
+ if (err) {
+ unlock_buffer(bh);
+ goto errout;
+ }
err = ext4_read_bh(bh, 0, NULL);
if (err < 0)
goto errout;
@@ -581,6 +581,7 @@ char *ext4_fault_names[EXT4_FAULT_MAX] = {
"inode_bitmap_eio", /* EXT4_FAULT_IBITMAP_EIO */
"block_bitmap_eio", /* EXT4_FAULT_BBITMAP_EIO */
"inode_eio", /* EXT4_FAULT_INODE_EIO */
+ "extent_block_eio", /* EXT4_FAULT_EXTENT_EIO */
};
static int ext4_fault_available_show(struct seq_file *m, void *v)
Add inode extent block reading I/O fault injection, we can specify the inode and physical metadata block to inject, it will return -EIO immediately instead of submitting I/O. Signed-off-by: Zhang Yi <yi.zhang@huawei.com> --- fs/ext4/ext4.h | 2 ++ fs/ext4/extents.c | 5 +++++ fs/ext4/sysfs.c | 1 + 3 files changed, 8 insertions(+)