@@ -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
@@ -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)
@@ -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);
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@huawei.com> --- fs/ext4/ext4.h | 2 ++ fs/ext4/sysfs.c | 1 + fs/ext4/xattr.c | 4 ++++ 3 files changed, 7 insertions(+)