struct bch_fs *c = trans->c;
        struct bch_fs_usage_online *fs_usage = NULL;
        struct btree_insert_entry *i;
+       bool saw_non_marked;
        unsigned mark_flags = trans->flags & BTREE_INSERT_BUCKET_INVALIDATE
                ? BCH_BUCKET_MARK_BUCKET_INVALIDATE
                : 0;
                BUG_ON(i->iter->uptodate >= BTREE_ITER_NEED_RELOCK);
 
        trans_for_each_update_iter(trans, i)
-               if (update_has_triggers(trans, i) &&
-                   update_triggers_transactional(trans, i)) {
-                       ret = bch2_trans_mark_update(trans, i);
-                       if (ret == -EINTR)
-                               trace_trans_restart_mark(trans->ip);
-                       if (ret)
-                               goto out_clear_replicas;
+               i->marked = false;
+
+       do {
+               saw_non_marked = false;
+
+               trans_for_each_update_iter(trans, i) {
+                       if (i->marked)
+                               continue;
+
+                       saw_non_marked = true;
+                       i->marked = true;
+
+                       if (update_has_triggers(trans, i) &&
+                           update_triggers_transactional(trans, i)) {
+                               ret = bch2_trans_mark_update(trans, i->iter, i->k);
+                               if (ret == -EINTR)
+                                       trace_trans_restart_mark(trans->ip);
+                               if (ret)
+                                       goto out_clear_replicas;
+                       }
                }
+       } while (saw_non_marked);
 
        btree_trans_lock_write(c, trans);
 
 
 }
 
 int bch2_trans_mark_update(struct btree_trans *trans,
-                          struct btree_insert_entry *insert)
+                          struct btree_iter *iter,
+                          struct bkey_i *insert)
 {
-       struct btree_iter       *iter = insert->iter;
        struct btree            *b = iter->l[0].b;
        struct btree_node_iter  node_iter = iter->l[0].iter;
        struct bkey_packed      *_k;
                return 0;
 
        ret = bch2_trans_mark_key(trans,
-                       bkey_i_to_s_c(insert->k),
-                       bpos_min(insert->k->k.p, b->key.k.p).offset -
-                       bkey_start_offset(&insert->k->k),
+                       bkey_i_to_s_c(insert),
+                       bpos_min(insert->k.p, b->key.k.p).offset -
+                       bkey_start_offset(&insert->k),
                        BCH_BUCKET_MARK_INSERT);
        if (ret)
                return ret;
                k = bkey_disassemble(b, _k, &unpacked);
 
                if (btree_node_is_extents(b)
-                   ? bkey_cmp(insert->k->k.p, bkey_start_pos(k.k)) <= 0
-                   : bkey_cmp(insert->k->k.p, k.k->p))
+                   ? bkey_cmp(insert->k.p, bkey_start_pos(k.k)) <= 0
+                   : bkey_cmp(insert->k.p, k.k->p))
                        break;
 
                if (btree_node_is_extents(b)) {
-                       switch (bch2_extent_overlap(&insert->k->k, k.k)) {
+                       switch (bch2_extent_overlap(&insert->k, k.k)) {
                        case BCH_EXTENT_OVERLAP_ALL:
                                sectors = -((s64) k.k->size);
                                break;
                        case BCH_EXTENT_OVERLAP_BACK:
-                               sectors = bkey_start_offset(&insert->k->k) -
+                               sectors = bkey_start_offset(&insert->k) -
                                        k.k->p.offset;
                                break;
                        case BCH_EXTENT_OVERLAP_FRONT:
                                sectors = bkey_start_offset(k.k) -
-                                       insert->k->k.p.offset;
+                                       insert->k.p.offset;
                                break;
                        case BCH_EXTENT_OVERLAP_MIDDLE:
-                               sectors = k.k->p.offset - insert->k->k.p.offset;
+                               sectors = k.k->p.offset - insert->k.p.offset;
                                BUG_ON(sectors <= 0);
 
                                ret = bch2_trans_mark_key(trans, k, sectors,
                                if (ret)
                                        return ret;
 
-                               sectors = bkey_start_offset(&insert->k->k) -
+                               sectors = bkey_start_offset(&insert->k) -
                                        k.k->p.offset;
                                break;
                        }
 
                                    struct replicas_delta_list *);
 int bch2_trans_mark_key(struct btree_trans *, struct bkey_s_c, s64, unsigned);
 int bch2_trans_mark_update(struct btree_trans *,
-                          struct btree_insert_entry *);
+                          struct btree_iter *iter,
+                          struct bkey_i *insert);
 void bch2_trans_fs_usage_apply(struct btree_trans *, struct bch_fs_usage_online *);
 
 /* disk reservations: */