bcachefs: Fix __btree_iter_next() when all iters are in use_next() when all iters...
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 9 Dec 2020 18:34:42 +0000 (13:34 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:49 +0000 (17:08 -0400)
Also, print out more information on btree transaction iterator overflow.

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

index ea173544520286520dce35baadbaf3940c8b2726..239d7c5deddc542ed71507f8e7ad9a154aefa33a 100644 (file)
@@ -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");
 }
 
index ee8c4346aadbfd638e93b42bf40d8cdd07ec97c5..9a7f8d0197eca7c9e2d9fb1d3838e3c3dfbb2d72 100644 (file)
@@ -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];
 }