bcachefs: bch2_btree_iter_peek_and_restart_outlined()
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 28 Feb 2023 02:26:07 +0000 (21:26 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:55 +0000 (17:09 -0400)
Needed for interfacing with Rust - bindgen can't handle inline
functions, alas.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h

index 63213205a043291565cbe5b553381e4750d43f7b..eebab7534f62660a36b73b95cec92f9a76add937 100644 (file)
@@ -2568,6 +2568,18 @@ struct bkey_s_c bch2_btree_iter_prev_slot(struct btree_iter *iter)
        return bch2_btree_iter_peek_slot(iter);
 }
 
+struct bkey_s_c bch2_btree_iter_peek_and_restart_outlined(struct btree_iter *iter)
+{
+       struct bkey_s_c k;
+
+       while (btree_trans_too_many_iters(iter->trans) ||
+              (k = bch2_btree_iter_peek_type(iter, iter->flags),
+               bch2_err_matches(bkey_err(k), BCH_ERR_transaction_restart)))
+               bch2_trans_begin(iter->trans);
+
+       return k;
+}
+
 /* new transactional stuff: */
 
 #ifdef CONFIG_BCACHEFS_DEBUG
index 50b39704c56fbe5a07c74092be5c88b4573fba1a..8e1f754e641b94f211c88e76e14a1eaadde1c0be 100644 (file)
@@ -595,6 +595,8 @@ static inline int btree_trans_too_many_iters(struct btree_trans *trans)
        return 0;
 }
 
+struct bkey_s_c bch2_btree_iter_peek_and_restart_outlined(struct btree_iter *);
+
 static inline struct bkey_s_c
 __bch2_btree_iter_peek_and_restart(struct btree_trans *trans,
                                   struct btree_iter *iter, unsigned flags)