From: Kent Overstreet Date: Thu, 11 Nov 2021 20:50:22 +0000 (-0500) Subject: bcachefs: Fix infinite loop in bch2_btree_cache_scan() X-Git-Tag: io_uring-6.7-2023-11-10~119^2~1297 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=54b2db3d58eadb4496a671d43b1e7c0506dd0220;p=linux-block.git bcachefs: Fix infinite loop in bch2_btree_cache_scan() When attempting to free btree nodes, we might not be able to free all the nodes that were requested. But the code was looping until it had freed _all_ the nodes requested, when it should have only been attempting to free nr nodes. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c index 7f5620a4d7c5..4e855ae51731 100644 --- a/fs/bcachefs/btree_cache.c +++ b/fs/bcachefs/btree_cache.c @@ -309,7 +309,7 @@ static unsigned long bch2_btree_cache_scan(struct shrinker *shrink, touched++; - if (freed >= nr) + if (touched >= nr) break; if (!btree_node_reclaim(c, b)) { @@ -323,7 +323,7 @@ restart: list_for_each_entry_safe(b, t, &bc->live, list) { touched++; - if (freed >= nr) { + if (touched >= nr) { /* Save position */ if (&t->list != &bc->live) list_move_tail(&bc->live, &t->list);