bcachefs: for_each_btree_key_continue()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 7 Apr 2024 04:52:47 +0000 (00:52 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:18 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/backpointers.c
fs/bcachefs/btree_iter.h

index fc9506c71eae15ed6a29c0312ac8d0439e4fd154..0ca53392f78763f772532a9e9d7e4453b9361a23 100644 (file)
@@ -793,31 +793,13 @@ static int bch2_check_extents_to_backpointers_pass(struct btree_trans *trans,
 
                while (level >= depth) {
                        struct btree_iter iter;
-                       bch2_trans_node_iter_init(trans, &iter, btree_id, POS_MIN, 0,
-                                                 level,
+                       bch2_trans_node_iter_init(trans, &iter, btree_id, POS_MIN, 0, level,
                                                  BTREE_ITER_PREFETCH);
-                       while (1) {
-                               bch2_trans_begin(trans);
-
-                               struct bkey_s_c k = bch2_btree_iter_peek(&iter);
-                               if (!k.k)
-                                       break;
-                               ret = bkey_err(k) ?:
-                                       check_extent_to_backpointers(trans, s, btree_id, level, k) ?:
-                                       bch2_trans_commit(trans, NULL, NULL,
-                                                         BCH_TRANS_COMMIT_no_enospc);
-                               if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) {
-                                       ret = 0;
-                                       continue;
-                               }
-                               if (ret)
-                                       break;
-                               if (bpos_eq(iter.pos, SPOS_MAX))
-                                       break;
-                               bch2_btree_iter_advance(&iter);
-                       }
-                       bch2_trans_iter_exit(trans, &iter);
 
+                       ret = for_each_btree_key_continue(trans, iter, 0, k, ({
+                               check_extent_to_backpointers(trans, s, btree_id, level, k) ?:
+                               bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc);
+                       }));
                        if (ret)
                                return ret;
 
index 0427097bb96665dc50c035de0dc1a25eb797bf27..52030929da0add45da966b1f30a7468933af4b88 100644 (file)
@@ -699,16 +699,12 @@ transaction_restart:                                                      \
        _ret2 ?: trans_was_restarted(_trans, _restart_count);           \
 })
 
-#define for_each_btree_key_upto(_trans, _iter, _btree_id,              \
-                               _start, _end, _flags, _k, _do)          \
+#define for_each_btree_key_upto_continue(_trans, _iter,                        \
+                                        _end, _flags, _k, _do)         \
 ({                                                                     \
-       struct btree_iter _iter;                                        \
        struct bkey_s_c _k;                                             \
        int _ret3 = 0;                                                  \
                                                                        \
-       bch2_trans_iter_init((_trans), &(_iter), (_btree_id),           \
-                            (_start), (_flags));                       \
-                                                                       \
        do {                                                            \
                _ret3 = lockrestart_do(_trans, ({                       \
                        (_k) = bch2_btree_iter_peek_upto_type(&(_iter), \
@@ -724,6 +720,19 @@ transaction_restart:                                                       \
        _ret3;                                                          \
 })
 
+#define for_each_btree_key_continue(_trans, _iter, _flags, _k, _do)    \
+       for_each_btree_key_upto_continue(_trans, _iter, SPOS_MAX, _flags, _k, _do)
+
+#define for_each_btree_key_upto(_trans, _iter, _btree_id,              \
+                               _start, _end, _flags, _k, _do)          \
+({                                                                     \
+       struct btree_iter _iter;                                        \
+       bch2_trans_iter_init((_trans), &(_iter), (_btree_id),           \
+                            (_start), (_flags));                       \
+                                                                       \
+       for_each_btree_key_upto_continue(_trans, _iter, _end, _flags, _k, _do);\
+})
+
 #define for_each_btree_key(_trans, _iter, _btree_id,                   \
                           _start, _flags, _k, _do)                     \
        for_each_btree_key_upto(_trans, _iter, _btree_id, _start,       \