]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix __btree_path_traverse_all
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 16 Feb 2022 08:13:36 +0000 (03:13 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:24 +0000 (17:09 -0400)
The loop that traverses paths in traverse_all() needs to be a little bit
tricky, because traversing a path can cause other paths to be added (or
perhaps removed) at about the same position.

The old logic was buggy, replace it with simpler logic.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/btree_iter.c

index 7b54d662f4cbdceee47c70db9135520cf8a7c74a..c6c1c9da45f1570b95e79bcef56c7be632ab0fde 100644 (file)
@@ -1462,17 +1462,17 @@ retry_all:
        while (i < trans->nr_sorted) {
                path = trans->paths + trans->sorted[i];
 
-               EBUG_ON(!(trans->paths_allocated & (1ULL << path->idx)));
-
-               ret = btree_path_traverse_one(trans, path, 0, _THIS_IP_);
-               if (ret)
-                       goto retry_all;
-
-               EBUG_ON(!(trans->paths_allocated & (1ULL << path->idx)));
-
-               if (path->nodes_locked ||
-                   !btree_path_node(path, path->level))
+               /*
+                * Traversing a path can cause another path to be added at about
+                * the same position:
+                */
+               if (path->uptodate) {
+                       ret = btree_path_traverse_one(trans, path, 0, _THIS_IP_);
+                       if (ret)
+                               goto retry_all;
+               } else {
                        i++;
+               }
        }
 
        /*