bcachefs: bch2_dump_trans_iters_updates()
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 25 Aug 2021 01:26:43 +0000 (21:26 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:10 +0000 (17:09 -0400)
This factors out bch2_dump_trans_iters_updates() from the iter alloc
overflow path, and makes some small improvements to what it prints.

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

index ee3b4098fa76992e7c0af828c105504293b70a87..5bb714d1525b36eb8a29d9b7b542a98f37f41bd9 100644 (file)
@@ -2256,33 +2256,30 @@ int bch2_trans_iter_free(struct btree_trans *trans,
 }
 
 noinline __cold
-static void btree_trans_iter_alloc_fail(struct btree_trans *trans)
+void bch2_dump_trans_iters_updates(struct btree_trans *trans)
 {
-
        struct btree_iter *iter;
        struct btree_insert_entry *i;
        unsigned idx;
-       char buf[100];
+       char buf1[300], buf2[100];
 
        btree_trans_sort_iters(trans);
 
        trans_for_each_iter_inorder(trans, iter, idx)
-               printk(KERN_ERR "iter: btree %s pos %s%s%s%s %pS\n",
+               printk(KERN_ERR "iter: btree %s pos %s real_pos %s%s%s%s %pS\n",
                       bch2_btree_ids[iter->btree_id],
-                      (bch2_bpos_to_text(&PBUF(buf), iter->real_pos), buf),
+                      (bch2_bpos_to_text(&PBUF(buf1), iter->pos), buf1),
+                      (bch2_bpos_to_text(&PBUF(buf2), iter->real_pos), buf2),
                       btree_iter_live(trans, iter) ? " live" : "",
                       (trans->iters_touched & (1ULL << iter->idx)) ? " touched" : "",
                       iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT ? " keep" : "",
                       (void *) iter->ip_allocated);
 
-       trans_for_each_update(trans, i) {
-               char buf[300];
-
-               bch2_bkey_val_to_text(&PBUF(buf), trans->c, bkey_i_to_s_c(i->k));
-               printk(KERN_ERR "update: btree %s %s\n",
-                      bch2_btree_ids[i->iter->btree_id], buf);
-       }
-       panic("trans iter oveflow\n");
+       trans_for_each_update(trans, i)
+               printk(KERN_ERR "update: btree %s %s %pS\n",
+                      bch2_btree_ids[i->btree_id],
+                      (bch2_bkey_val_to_text(&PBUF(buf1), trans->c, bkey_i_to_s_c(i->k)), buf1),
+                      (void *) i->ip_allocated);
 }
 
 static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans,
@@ -2294,8 +2291,10 @@ static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans,
        btree_trans_verify_sorted_refs(trans);
 
        if (unlikely(trans->iters_linked ==
-                    ~((~0ULL << 1) << (BTREE_ITER_MAX - 1))))
-               btree_trans_iter_alloc_fail(trans);
+                    ~((~0ULL << 1) << (BTREE_ITER_MAX - 1)))) {
+               bch2_dump_trans_iters_updates(trans);
+               panic("trans iter oveflow\n");
+       }
 
        idx = __ffs64(~trans->iters_linked);
        iter = &trans->iters[idx];
index 6fb0cb8252eb67d191c92a8d441807f057f03fc3..5c754d4665431a497fa68ebb92cc66d8a8121650 100644 (file)
@@ -295,6 +295,8 @@ static inline int bkey_err(struct bkey_s_c k)
 
 /* new multiple iterator interface: */
 
+void bch2_dump_trans_iters_updates(struct btree_trans *);
+
 int bch2_trans_iter_put(struct btree_trans *, struct btree_iter *);
 int bch2_trans_iter_free(struct btree_trans *, struct btree_iter *);
 
index 7a9aece2eb87566b142a3e2fcb46f47fe3cd699a..6ef3285541f25269c21c539629b7ae20ebc73078 100644 (file)
@@ -348,6 +348,7 @@ struct btree_insert_entry {
        unsigned                trans_triggers_run:1;
        struct bkey_i           *k;
        struct btree_iter       *iter;
+       unsigned long           ip_allocated;
 };
 
 #ifndef CONFIG_LOCKDEP
index cfb691fa65cf41df12a56b4ff0d50beb2e806d93..791c121adeb2c5e0b9c13e2babbd40449f3b4baa 100644 (file)
@@ -1012,7 +1012,8 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter,
                .btree_id       = iter->btree_id,
                .level          = iter->level,
                .iter           = iter,
-               .k              = k
+               .k              = k,
+               .ip_allocated   = _RET_IP_,
        };
        bool is_extent = (iter->flags & BTREE_ITER_IS_EXTENTS) != 0;
        int ret = 0;