• Zhang Yi's avatar
    jbd2,ext4: add a shrinker to release checkpointed buffers · 4ba3fcdd
    Zhang Yi authored
    Current metadata buffer release logic in bdev_try_to_free_page() have
    a lot of use-after-free issues when umount filesystem concurrently, and
    it is difficult to fix directly because ext4 is the only user of
    s_op->bdev_try_to_free_page callback and we may have to add more special
    refcount or lock that is only used by ext4 into the common vfs layer,
    which is unacceptable.
    
    One better solution is remove the bdev_try_to_free_page callback, but
    the real problem is we cannot easily release journal_head on the
    checkpointed buffer, so try_to_free_buffers() cannot release buffers and
    page under memory pressure, which is more likely to trigger
    out-of-memory. So we cannot remove the callback directly before we find
    another way to release journal_head.
    
    This patch introduce a shrinker to free journal_head on the checkpointed
    transaction. After the journal_head got freed, try_to_free_buffers()
    could free buffer properly.
    Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
    Suggested-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210610112440.3438139-6-yi.zhang@huawei.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    4ba3fcdd
super.c 193 KB