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@xxxxxxxxxx> --- fs/ext4/ext4.h | 2 ++ fs/ext4/extents.c | 5 +++++ fs/ext4/sysfs.c | 1 + 3 files changed, 8 insertions(+) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 29a819a186f7..9c1dcbed59e6 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -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 diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 0d07e5cf4dab..504ed35ffeaf 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -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; diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c index 9c6d9a212d47..bad4885399dd 100644 --- a/fs/ext4/sysfs.c +++ b/fs/ext4/sysfs.c @@ -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) -- 2.31.1