]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: Trace where btree iterators are allocated
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 1 Apr 2020 21:14:14 +0000 (17:14 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:38 +0000 (17:08 -0400)
This will help with iterator overflow bugs.

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

index 4ce6a66edcd51da4cfe0779c009ddbf2509dcb47..7b12bd163df79c774c855b8910b8caf7f01996f1 100644 (file)
@@ -1912,13 +1912,14 @@ static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans)
                        struct btree_iter *iter;
 
                        trans_for_each_iter(trans, iter) {
-                               pr_err("iter: btree %s pos %llu:%llu%s%s%s",
+                               pr_err("iter: btree %s pos %llu:%llu%s%s%s %pf",
                                       bch2_btree_ids[iter->btree_id],
                                       iter->pos.inode,
                                       iter->pos.offset,
                                       (trans->iters_live & (1ULL << iter->idx)) ? " live" : "",
                                       (trans->iters_touched & (1ULL << iter->idx)) ? " touched" : "",
-                                      iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT ? " keep" : "");
+                                      iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT ? " keep" : "",
+                                      (void *) iter->ip_allocated);
                        }
 
                        panic("trans iter oveflow\n");
@@ -2025,9 +2026,9 @@ static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
        return iter;
 }
 
-struct btree_iter *bch2_trans_get_iter(struct btree_trans *trans,
-                                      enum btree_id btree_id,
-                                      struct bpos pos, unsigned flags)
+struct btree_iter *__bch2_trans_get_iter(struct btree_trans *trans,
+                                        enum btree_id btree_id,
+                                        struct bpos pos, unsigned flags)
 {
        struct btree_iter *iter =
                __btree_trans_get_iter(trans, btree_id, pos, flags);
@@ -2064,7 +2065,7 @@ struct btree_iter *bch2_trans_get_node_iter(struct btree_trans *trans,
        return iter;
 }
 
-struct btree_iter *bch2_trans_copy_iter(struct btree_trans *trans,
+struct btree_iter *__bch2_trans_copy_iter(struct btree_trans *trans,
                                        struct btree_iter *src)
 {
        struct btree_iter *iter;
index 60baca62a596c350c2c47bd91049dbfabd863dd5..928170afe3b515c4b7b0858bbb17f87bf249b434 100644 (file)
@@ -257,10 +257,35 @@ int bch2_trans_iter_free(struct btree_trans *, struct btree_iter *);
 
 void bch2_trans_unlink_iters(struct btree_trans *);
 
-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 *__bch2_trans_get_iter(struct btree_trans *, enum btree_id,
+                                        struct bpos, unsigned);
+
+static inline struct btree_iter *
+bch2_trans_get_iter(struct btree_trans *trans, enum btree_id btree_id,
+                   struct bpos pos, unsigned flags)
+{
+       struct btree_iter *iter =
+               __bch2_trans_get_iter(trans, btree_id, pos, flags);
+
+       if (!IS_ERR(iter))
+               iter->ip_allocated = _THIS_IP_;
+       return iter;
+}
+
+struct btree_iter *__bch2_trans_copy_iter(struct btree_trans *,
                                        struct btree_iter *);
+static inline struct btree_iter *
+bch2_trans_copy_iter(struct btree_trans *trans, struct btree_iter *src)
+{
+       struct btree_iter *iter =
+               __bch2_trans_copy_iter(trans, src);
+
+       if (!IS_ERR(iter))
+               iter->ip_allocated = _THIS_IP_;
+       return iter;
+
+}
+
 struct btree_iter *bch2_trans_get_node_iter(struct btree_trans *,
                                enum btree_id, struct bpos,
                                unsigned, unsigned, unsigned);
index 71b6b36e513d04e6f171b3fc14cf3de351eebd6b..57796340fb36693aafc6ded6e0ada4948b8325e5 100644 (file)
@@ -256,6 +256,7 @@ struct btree_iter {
         * bch2_btree_iter_next_slot() can correctly advance pos.
         */
        struct bkey             k;
+       unsigned long           ip_allocated;
 };
 
 static inline enum btree_iter_type btree_iter_type(struct btree_iter *iter)