]> git.baikalelectronics.ru Git - kernel.git/commit
jbd2,ext4: add a shrinker to release checkpointed buffers
authorZhang Yi <yi.zhang@huawei.com>
Thu, 10 Jun 2021 11:24:37 +0000 (19:24 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 24 Jun 2021 14:54:49 +0000 (10:54 -0400)
commitc4c3589c3b31cd289cc6ce9cfa5a9750670d4b6b
treecfe6b1077ca18cc5614a43446bd015e4f0c93afa
parentf95bffc036746d25a21d1ea86fed7fba9275ea4c
jbd2,ext4: add a shrinker to release checkpointed buffers

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: Zhang Yi <yi.zhang@huawei.com>
Suggested-by: Jan Kara <jack@suse.cz>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20210610112440.3438139-6-yi.zhang@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/super.c
fs/jbd2/checkpoint.c
fs/jbd2/journal.c
include/linux/jbd2.h
include/trace/events/jbd2.h