summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-08-24 21:26:43 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:10 -0400
commit84841b0d1320c2084facb2f040d6ac0dfced943e (patch)
tree3117ca1e857c5f7d99ab0b1fbaa240116ee61dc7
parente6e024e9bf250e24cc8f8546a4645d7271d7f090 (diff)
bcachefs: bch2_dump_trans_iters_updates()
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>
-rw-r--r--fs/bcachefs/btree_iter.c29
-rw-r--r--fs/bcachefs/btree_iter.h2
-rw-r--r--fs/bcachefs/btree_types.h1
-rw-r--r--fs/bcachefs/btree_update_leaf.c3
4 files changed, 19 insertions, 16 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index ee3b4098fa76..5bb714d1525b 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -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];
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
index 6fb0cb8252eb..5c754d466543 100644
--- a/fs/bcachefs/btree_iter.h
+++ b/fs/bcachefs/btree_iter.h
@@ -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 *);
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index 7a9aece2eb87..6ef3285541f2 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -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
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index cfb691fa65cf..791c121adeb2 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -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;