diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-04-12 01:31:33 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:31 -0400 |
commit | c609947b5eae4bee096fde660a53a719ee65e191 (patch) | |
tree | 5faa4cd4d21b0dace1809c1fa836be4dac62f283 /fs/bcachefs/recovery.c | |
parent | e492e7b6f64fe128b83e165ef82f7d4b9fcc12cd (diff) | |
download | lwn-c609947b5eae4bee096fde660a53a719ee65e191.tar.gz lwn-c609947b5eae4bee096fde660a53a719ee65e191.zip |
bcachefs: Fix for getting stuck in journal replay
In journal replay, we weren't immediately dropping journal pins when we
start doing updates that ewern't from journal replay - leading to
journal reclaim getting stuck.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/recovery.c')
-rw-r--r-- | fs/bcachefs/recovery.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index 16ba5d24a86d..dc11eae1bcaa 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -556,7 +556,8 @@ static int journal_keys_sort(struct bch_fs *c) static void replay_now_at(struct journal *j, u64 seq) { BUG_ON(seq < j->replay_journal_seq); - BUG_ON(seq > j->replay_journal_seq_end); + + seq = min(seq, j->replay_journal_seq_end); while (j->replay_journal_seq < seq) bch2_journal_pin_put(j, j->replay_journal_seq++); @@ -629,8 +630,7 @@ static int bch2_journal_replay(struct bch_fs *c) cond_resched(); - if (!k->allocated) - replay_now_at(j, keys->journal_seq_base + k->journal_seq); + replay_now_at(j, keys->journal_seq_base + k->journal_seq); ret = bch2_trans_do(c, NULL, NULL, BTREE_INSERT_LAZY_RW| |