diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-08-24 21:26:43 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-08-25 15:31:30 -0400 |
commit | 75cd9ece47231fc80c74a6a619a6b61add19cebd (patch) | |
tree | b03646f97df11a2a3b3948c8d992f08518075816 | |
parent | 160be5b9a9af37ed1e800bcacee9e15653185455 (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.c | 29 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 3 |
4 files changed, 19 insertions, 16 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 105d2961a18f..3906b83916f1 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -2248,32 +2248,29 @@ 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; - char buf[100]; + char buf1[300], buf2[100]; btree_trans_sort_iters(trans); trans_for_each_iter_inorder(trans, iter) - 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, @@ -2283,8 +2280,10 @@ static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans, unsigned idx; 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 39124e68e488..fc7172a8f3f9 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -289,6 +289,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 a1e5debf19f3..0a59e4b6e7a7 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 bfb568025a2a..91524da9404c 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -991,7 +991,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; |