Re: [powerpc][5.13.0-next-20210701] Kernel crash while running ltp(chdir01) tests
From: Zhang Yi <yi.zhang@huawei.com>
Date: 2021-07-05 02:17:34
Also in:
linux-fsdevel, linuxppc-dev
On 2021/7/4 22:04, Theodore Ts'o wrote:
On Sat, Jul 03, 2021 at 12:55:09PM +0800, Zhang Yi wrote:quoted
Yeah, it sounds good to me. Do you want me to send the fix patch, or you modify your commit 8f9e16badb8fd in another email directly?I've gone ahead and made the changes; what do you think? I like how it also removes 40 lines of code. :-)
Thanks for the fix, this patch looks good to me besides one error handling below.
quoted
From ef3130d1b0b8ca769252d6a722a2e59a00141383 Mon Sep 17 00:00:00 2001From: Theodore Ts'o <tytso@mit.edu> Date: Fri, 2 Jul 2021 18:05:03 -0400 Subject: [PATCH] ext4: inline jbd2_journal_[un]register_shrinker() The function jbd2_journal_unregister_shrinker() was getting called twice when the file system was getting unmounted. On Power and ARM platforms this was causing kernel crash when unmounting the file system, when a percpu_counter was destroyed twice. Fix this by removing jbd2_journal_[un]register_shrinker() functions, and inlining the shrinker setup and teardown into journal_init_common() and jbd2_journal_destroy(). This means that ext4 and ocfs2 now no longer need to know about registering and unregistering jbd2's shrinker. Also, while we're at it, rename the percpu counter from j_jh_shrink_count to j_checkpoint_jh_count, since this makes it clearer what this counter is intended to track. Fixes: 4ba3fcdde7e3 ("jbd2,ext4: add a shrinker to release checkpointed buffers") Reported-by: Sachin Sant <redacted> Reported-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> --- fs/ext4/super.c | 8 --- fs/jbd2/checkpoint.c | 4 +- fs/jbd2/journal.c | 148 +++++++++++++++++-------------------------- include/linux/jbd2.h | 6 +- 4 files changed, 63 insertions(+), 103 deletions(-)
[..]
quoted hunk ↗ jump to hunk
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 152880c298ca..8a9c94dd3599 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c
[..]
quoted hunk ↗ jump to hunk
/* * Management for journal control blocks: functions to create and * destroy journal_t structures, and to initialise and read existing@@ -1361,6 +1403,19 @@ static journal_t *journal_init_common(struct block_device *bdev, journal->j_sb_buffer = bh; journal->j_superblock = (journal_superblock_t *)bh->b_data; + journal->j_shrink_transaction = NULL; + journal->j_shrinker.scan_objects = jbd2_journal_shrink_scan; + journal->j_shrinker.count_objects = jbd2_journal_shrink_count; + journal->j_shrinker.seeks = DEFAULT_SEEKS; + journal->j_shrinker.batch = journal->j_max_transaction_buffers; + + if (percpu_counter_init(&journal->j_checkpoint_jh_count, 0, GFP_KERNEL)) + goto err_cleanup; + + if (register_shrinker(&journal->j_shrinker)) { + percpu_counter_destroy(&journal->j_checkpoint_jh_count); + goto err_cleanup; + }
Need to release j_sb_buffer in above two error path. Thanks, Yi.