]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix error handling in traverse_all()
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 8 Mar 2022 03:05:49 +0000 (22:05 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:27 +0000 (17:09 -0400)
In btree_path_traverse_all() we were failing to check for -EIO in the
retry loop, and after btree node read error we'd go into an infinite
loop.

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

index 109efa73cd4ce8f42eb8f0c2e2f85b66849bb8e2..90f5d306566b0e38245b67481f3131375254cc26 100644 (file)
@@ -1468,8 +1468,10 @@ retry_all:
                 */
                if (path->uptodate) {
                        ret = btree_path_traverse_one(trans, path, 0, _THIS_IP_);
-                       if (ret)
+                       if (ret == -EINTR || ret == -ENOMEM)
                                goto retry_all;
+                       if (ret)
+                               goto err;
                } else {
                        i++;
                }
@@ -1482,7 +1484,7 @@ retry_all:
         */
        trans_for_each_path(trans, path)
                BUG_ON(path->uptodate >= BTREE_ITER_NEED_TRAVERSE);
-
+err:
        bch2_btree_cache_cannibalize_unlock(c);
 
        trans->in_traverse_all = false;