]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Apply workaround for too many btree iters to read path
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 24 Nov 2021 00:00:23 +0000 (19:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:17 +0000 (17:09 -0400)
Reading from cached data, which calls bch2_bucket_io_time_reset(), is
leading to transaction iterator overflows - this standardizes the
workaround.

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

index 72b9605cf3e7d7cc4ad4b9c6782d29415971e00e..af1922c448edd5786f1232ebaa2a6edbccd63ab2 100644 (file)
@@ -328,13 +328,19 @@ static inline struct bkey_s_c __bch2_btree_iter_peek(struct btree_iter *iter,
                : bch2_btree_iter_peek(iter);
 }
 
+static inline int btree_trans_too_many_iters(struct btree_trans *trans)
+{
+       return hweight64(trans->paths_allocated) > BTREE_ITER_MAX / 2
+               ? -EINTR : 0;
+}
+
 static inline struct bkey_s_c
 __bch2_btree_iter_peek_and_restart(struct btree_trans *trans,
                                   struct btree_iter *iter, unsigned flags)
 {
        struct bkey_s_c k;
 
-       while ((hweight64(trans->paths_allocated) > BTREE_ITER_MAX / 2) ||
+       while (btree_trans_too_many_iters(trans) ||
               (k = __bch2_btree_iter_peek(iter, flags),
                bkey_err(k) == -EINTR))
                bch2_trans_begin(trans);
index 4dfcc955675ba1adbdebabeabbb0b983348eebae..fe4a85a6a8cb38560b8079cedfa8c18070315fc4 100644 (file)
@@ -531,10 +531,9 @@ retry:
                 * read_target looks up subvolumes, we can overflow paths if the
                 * directory has many subvolumes in it
                 */
-               if (hweight64(trans.paths_allocated) > BTREE_ITER_MAX / 2) {
-                       ret = -EINTR;
+               ret = btree_trans_too_many_iters(&trans);
+               if (ret)
                        break;
-               }
        }
        bch2_trans_iter_exit(&trans, &iter);
 err:
index c014f10885dcfcaae01410139de1853a5d280804..b36685ebba69e24b80a79d15d66b5ad690bf0c87 100644 (file)
@@ -881,6 +881,10 @@ retry:
 
                swap(rbio->bio.bi_iter.bi_size, bytes);
                bio_advance(&rbio->bio, bytes);
+
+               ret = btree_trans_too_many_iters(trans);
+               if (ret)
+                       break;
        }
 err:
        bch2_trans_iter_exit(trans, &iter);
index c5bd17f913f24a438074f465f6aba94aeefe0819..03bea2ddfb39dd23040dd21ed0f57f6a3c44b0ce 100644 (file)
@@ -2395,6 +2395,10 @@ retry:
 
                swap(bvec_iter.bi_size, bytes);
                bio_advance_iter(&rbio->bio, &bvec_iter, bytes);
+
+               ret = btree_trans_too_many_iters(&trans);
+               if (ret)
+                       break;
        }
 err:
        bch2_trans_iter_exit(&trans, &iter);