summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-12-09 13:34:42 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2020-12-16 15:29:50 -0500
commitc9a13bfdad3b11875678275fcd63debb5b331e16 (patch)
tree3d1fb13502a5b4a6ed6af2513d2ded44a7d59c44
parent4fcee56dc5aa4217a544e30884ef9da1798270e4 (diff)
bcachefs: Fix __btree_iter_next() when all iters are in use_next() when all iters are in use
Also, print out more information on btree transaction iterator overflow. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_iter.c11
-rw-r--r--fs/bcachefs/btree_iter.h8
2 files changed, 17 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index bf9ba9d2daed..21253be5aab6 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -2017,9 +2017,10 @@ static void btree_trans_iter_alloc_fail(struct btree_trans *trans)
{
struct btree_iter *iter;
+ struct btree_insert_entry *i;
trans_for_each_iter(trans, iter)
- pr_err("iter: btree %s pos %llu:%llu%s%s%s %ps",
+ printk(KERN_ERR "iter: btree %s pos %llu:%llu%s%s%s %ps\n",
bch2_btree_ids[iter->btree_id],
iter->pos.inode,
iter->pos.offset,
@@ -2027,6 +2028,14 @@ static void btree_trans_iter_alloc_fail(struct btree_trans *trans)
(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");
}
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
index ee8c4346aadb..9a7f8d0197ec 100644
--- a/fs/bcachefs/btree_iter.h
+++ b/fs/bcachefs/btree_iter.h
@@ -51,11 +51,17 @@ static inline int btree_iter_err(const struct btree_iter *iter)
static inline struct btree_iter *
__trans_next_iter(struct btree_trans *trans, unsigned idx)
{
- u64 l = trans->iters_linked >> idx;
+ u64 l;
+
+ if (idx == BTREE_ITER_MAX)
+ return NULL;
+
+ l = trans->iters_linked >> idx;
if (!l)
return NULL;
idx += __ffs64(l);
+ EBUG_ON(idx >= BTREE_ITER_MAX);
EBUG_ON(trans->iters[idx].idx != idx);
return &trans->iters[idx];
}