After a failure in the route ext4_restore_inline_data -> ext4_create_inline_data -> ext4_mark_iloc_dirty, the inode will still be considered as having inline data. However, in ext4_restore_inline_data, the inline data is not actually written to the inode. When ext4_readdir is subsequently called,ext4_has_inline_data will pass the check and proceed to read the incorrect inline data. Signed-off-by: pipishuo <1289151713@qq.com> --- fs/ext4/dir.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 17edd678fa87..6117a798541a 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -159,6 +160,9 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) } if (ext4_has_inline_data(inode)) { + if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) + return -EINVAL; + int has_inline_data = 1; err = ext4_read_inline_dir(file, ctx, &has_inline_data); -- 2.47.3