From: Jan Kara Date: Thu, 7 Oct 2021 15:53:36 +0000 (+0200) Subject: ext4: make sure to reset inode lockdep class when quota enabling fails X-Git-Tag: block-5.17-2022-01-21~52^2~21 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=4013d47a5307fdb5c13370b5392498b00fedd274;p=linux-block.git ext4: make sure to reset inode lockdep class when quota enabling fails When we succeed in enabling some quota type but fail to enable another one with quota feature, we correctly disable all enabled quota types. However we forget to reset i_data_sem lockdep class. When the inode gets freed and reused, it will inherit this lockdep class (i_data_sem is initialized only when a slab is created) and thus eventually lockdep barfs about possible deadlocks. Reported-and-tested-by: syzbot+3b6f9218b1301ddda3e2@syzkaller.appspotmail.com Signed-off-by: Jan Kara Cc: stable@kernel.org Link: https://lore.kernel.org/r/20211007155336.12493-3-jack@suse.cz Signed-off-by: Theodore Ts'o --- diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 863a3eae505a..1b55f234e006 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -6837,8 +6837,19 @@ int ext4_enable_quotas(struct super_block *sb) "Failed to enable quota tracking " "(type=%d, err=%d). Please run " "e2fsck to fix.", type, err); - for (type--; type >= 0; type--) + for (type--; type >= 0; type--) { + struct inode *inode; + + inode = sb_dqopt(sb)->files[type]; + if (inode) + inode = igrab(inode); dquot_quota_off(sb, type); + if (inode) { + lockdep_set_quota_inode(inode, + I_DATA_SEM_NORMAL); + iput(inode); + } + } return err; }