lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 472/563] ext4: make sure to reset inode lockdep class when quota enabling fails
    Date
    From: Jan Kara <jack@suse.cz>

    commit 4013d47a5307fdb5c13370b5392498b00fedd274 upstream.

    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 <jack@suse.cz>
    Cc: stable@kernel.org
    Link: https://lore.kernel.org/r/20211007155336.12493-3-jack@suse.cz
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/ext4/super.c | 13 ++++++++++++-
    1 file changed, 12 insertions(+), 1 deletion(-)

    --- a/fs/ext4/super.c
    +++ b/fs/ext4/super.c
    @@ -6427,8 +6427,19 @@ static int ext4_enable_quotas(struct sup
    "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;
    }

    \
     
     \ /
      Last update: 2022-01-25 04:39    [W:4.019 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site