OSDN Git Service

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)
commit4ba3fcdde7e36af93610ceb3cc38365b14539865
treecfe6b1077ca18cc5614a43446bd015e4f0c93afa
parent214eb5a4d8a2032fb9f0711d1b202eb88ee02920
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