On Fri 07-05-21 15:19:04, Zhang Yi wrote: > In ext4_orphan_cleanup(), if ext4_truncate() failed to get a transaction > handle, it didn't remove the inode from the in-core orphan list, which > may probably trigger below error dump in ext4_destroy_inode() during the > final iput() and could lead to memory corruption on the later orphan > list changes. > > EXT4-fs (sda): Inode 6291467 (00000000b8247c67): orphan list check failed! > 00000000b8247c67: 0001f30a 00000004 00000000 00000023 ............#... > 00000000e24cde71: 00000006 014082a3 00000000 00000000 ......@......... > 0000000072c6a5ee: 00000000 00000000 00000000 00000000 ................ > ... > > This patch fix this by cleanup in-core orphan list manually if > ext4_truncate() return error. > > Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> Thanks! The patch looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/ext4/super.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index 7dc94f3e18e6..12850d72e9a4 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -3101,8 +3101,15 @@ static void ext4_orphan_cleanup(struct super_block *sb, > inode_lock(inode); > truncate_inode_pages(inode->i_mapping, inode->i_size); > ret = ext4_truncate(inode); > - if (ret) > + if (ret) { > + /* > + * We need to clean up the in-core orphan list > + * manually if ext4_truncate() failed to get a > + * transaction handle. > + */ > + ext4_orphan_del(NULL, inode); > ext4_std_error(inode->i_sb, ret); > + } > inode_unlock(inode); > nr_truncates++; > } else { > -- > 2.25.4 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR