]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_iter.h
Update bcachefs sources to 380885b0b8 bcachefs: Fix counting iterators for reflink...
[bcachefs-tools-debian] / libbcachefs / btree_iter.h
index e4967215e1d914e669b021ee0872730bb56f736c..321baab5242440e9d10307a7e3f5974149d9138c 100644 (file)
@@ -246,6 +246,11 @@ static inline struct bkey_s_c __bch2_btree_iter_next(struct btree_iter *iter,
                : bch2_btree_iter_next(iter);
 }
 
+static inline int bkey_err(struct bkey_s_c k)
+{
+       return PTR_ERR_OR_ZERO(k.k);
+}
+
 #define for_each_btree_key(_trans, _iter, _btree_id,                   \
                           _start, _flags, _k, _ret)                    \
        for ((_ret) = PTR_ERR_OR_ZERO((_iter) =                         \
@@ -257,57 +262,39 @@ static inline struct bkey_s_c __bch2_btree_iter_next(struct btree_iter *iter,
             (_ret) = PTR_ERR_OR_ZERO(((_k) =                           \
                        __bch2_btree_iter_next(_iter, _flags)).k))
 
-#define for_each_btree_key_continue(_iter, _flags, _k)                 \
+#define for_each_btree_key_continue(_iter, _flags, _k, _ret)           \
        for ((_k) = __bch2_btree_iter_peek(_iter, _flags);              \
-            !IS_ERR_OR_NULL((_k).k);                                   \
+            !((_ret) = bkey_err(_k)) && (_k).k;                        \
             (_k) = __bch2_btree_iter_next(_iter, _flags))
 
-static inline int bkey_err(struct bkey_s_c k)
-{
-       return PTR_ERR_OR_ZERO(k.k);
-}
-
 /* new multiple iterator interface: */
 
 int bch2_trans_iter_put(struct btree_trans *, struct btree_iter *);
 int bch2_trans_iter_free(struct btree_trans *, struct btree_iter *);
-int bch2_trans_iter_free_on_commit(struct btree_trans *, struct btree_iter *);
 
-void bch2_trans_unlink_iters(struct btree_trans *, u64);
+void bch2_trans_unlink_iters(struct btree_trans *);
 
-struct btree_iter *__bch2_trans_get_iter(struct btree_trans *, enum btree_id,
-                                        struct bpos, unsigned, u64);
+struct btree_iter *bch2_trans_get_iter(struct btree_trans *, enum btree_id,
+                                      struct bpos, unsigned);
 struct btree_iter *bch2_trans_copy_iter(struct btree_trans *,
                                        struct btree_iter *);
+struct btree_iter *bch2_trans_get_node_iter(struct btree_trans *,
+                               enum btree_id, struct bpos,
+                               unsigned, unsigned, unsigned);
 
-static __always_inline u64 __btree_iter_id(void)
-{
-       u64 ret = 0;
+#define TRANS_RESET_ITERS              (1 << 0)
+#define TRANS_RESET_MEM                        (1 << 1)
 
-       ret <<= 32;
-       ret |= _RET_IP_ & U32_MAX;
-       ret <<= 32;
-       ret |= _THIS_IP_ & U32_MAX;
-       return ret;
-}
+void bch2_trans_reset(struct btree_trans *, unsigned);
 
-static __always_inline struct btree_iter *
-bch2_trans_get_iter(struct btree_trans *trans, enum btree_id btree_id,
-                   struct bpos pos, unsigned flags)
+static inline void bch2_trans_begin(struct btree_trans *trans)
 {
-       return __bch2_trans_get_iter(trans, btree_id, pos, flags,
-                                    __btree_iter_id());
+       return bch2_trans_reset(trans, TRANS_RESET_ITERS|TRANS_RESET_MEM);
 }
 
-struct btree_iter *bch2_trans_get_node_iter(struct btree_trans *,
-                               enum btree_id, struct bpos,
-                               unsigned, unsigned, unsigned);
-
-void bch2_trans_begin(struct btree_trans *);
-
 static inline void bch2_trans_begin_updates(struct btree_trans *trans)
 {
-       trans->nr_updates = 0;
+       return bch2_trans_reset(trans, TRANS_RESET_MEM);
 }
 
 void *bch2_trans_kmalloc(struct btree_trans *, size_t);