Add I/O fault injection when reading xattr block, we can specify the inode to inject. ext4_xattr_get_block() will return -EIO immediately instead of submitting I/O. Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> --- fs/ext4/ext4.h | 2 ++ fs/ext4/sysfs.c | 1 + fs/ext4/xattr.c | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index aaa3a29cd0e7..94894daef595 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1524,6 +1524,7 @@ enum ext4_fault_bits { EXT4_FAULT_INODE_EIO, /* inode */ EXT4_FAULT_EXTENT_EIO, /* extent block */ EXT4_FAULT_DIRBLOCK_EIO, /* directory block */ + EXT4_FAULT_XATTR_EIO, /* xattr block */ EXT4_FAULT_MAX }; @@ -1628,6 +1629,7 @@ 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) EXT4_FAULT_INODE_LBLOCK_FN(DIRBLOCK_EIO, dirblock_io, -EIO) +EXT4_FAULT_INODE_FN(XATTR_EIO, xattr_io, -EIO) /* * fourth extended-fs super-block data in memory diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c index 0329205a9958..f7f8882037a5 100644 --- a/fs/ext4/sysfs.c +++ b/fs/ext4/sysfs.c @@ -583,6 +583,7 @@ char *ext4_fault_names[EXT4_FAULT_MAX] = { "inode_eio", /* EXT4_FAULT_INODE_EIO */ "extent_block_eio", /* EXT4_FAULT_EXTENT_EIO */ "dir_block_eio", /* EXT4_FAULT_DIRBLOCK_EIO */ + "xattr_block_eio", /* EXT4_FAULT_XATTR_EIO */ }; static int ext4_fault_available_show(struct seq_file *m, void *v) diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 39c80565c65d..3a066c1ddd5c 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -2231,6 +2231,10 @@ static struct buffer_head *ext4_xattr_get_block(struct inode *inode) if (!EXT4_I(inode)->i_file_acl) return NULL; + error = ext4_fault_xattr_io(inode->i_sb, inode->i_ino); + if (error) + return ERR_PTR(error); + ea_idebug(inode, "reading block %llu", (unsigned long long)EXT4_I(inode)->i_file_acl); bh = ext4_sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl, REQ_PRIO); -- 2.31.1