diff options
Diffstat (limited to 'libbcachefs/btree_update_leaf.c')
-rw-r--r-- | libbcachefs/btree_update_leaf.c | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c index f7ffd68f..6e12e8e7 100644 --- a/libbcachefs/btree_update_leaf.c +++ b/libbcachefs/btree_update_leaf.c @@ -272,8 +272,10 @@ inline void bch2_btree_insert_key_leaf(struct btree_trans *trans, bch2_btree_add_journal_pin(c, b, journal_seq); - if (unlikely(!btree_node_dirty(b))) + if (unlikely(!btree_node_dirty(b))) { + EBUG_ON(test_bit(BCH_FS_CLEAN_SHUTDOWN, &c->flags)); set_btree_node_dirty_acct(c, b); + } live_u64s_added = (int) b->nr.live_u64s - old_live_u64s; u64s_added = (int) bset_u64s(t) - old_u64s; @@ -419,7 +421,8 @@ static int run_one_mem_trigger(struct btree_trans *trans, if (!btree_node_type_needs_gc(i->btree_id)) return 0; - if (old_ops->atomic_trigger == new_ops->atomic_trigger) { + if (old_ops->atomic_trigger == new_ops->atomic_trigger && + ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) { ret = bch2_mark_key(trans, i->btree_id, i->level, old, bkey_i_to_s_c(new), BTREE_TRIGGER_INSERT|BTREE_TRIGGER_OVERWRITE|flags); @@ -461,7 +464,8 @@ static int run_one_trans_trigger(struct btree_trans *trans, struct btree_insert_ if (!i->insert_trigger_run && !i->overwrite_trigger_run && - old_ops->trans_trigger == new_ops->trans_trigger) { + old_ops->trans_trigger == new_ops->trans_trigger && + ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) { i->overwrite_trigger_run = true; i->insert_trigger_run = true; return bch2_trans_mark_key(trans, i->btree_id, i->level, old, i->k, @@ -1720,14 +1724,21 @@ int __must_check bch2_trans_update(struct btree_trans *trans, struct btree_iter int __must_check bch2_trans_update_buffered(struct btree_trans *trans, enum btree_id btree, - struct bkey_i *k, - bool head) + struct bkey_i *k) { - int ret, pos; + struct btree_write_buffered_key *i; + int ret; EBUG_ON(trans->nr_wb_updates > trans->wb_updates_size); EBUG_ON(k->k.u64s > BTREE_WRITE_BUFERED_U64s_MAX); + trans_for_each_wb_update(trans, i) { + if (i->btree == btree && bpos_eq(i->k.k.p, k->k.p)) { + bkey_copy(&i->k, k); + return 0; + } + } + if (!trans->wb_updates || trans->nr_wb_updates == trans->wb_updates_size) { struct btree_write_buffered_key *u; @@ -1754,18 +1765,13 @@ int __must_check bch2_trans_update_buffered(struct btree_trans *trans, trans->wb_updates = u; } - if (head) { - memmove(&trans->wb_updates[1], - &trans->wb_updates[0], - sizeof(trans->wb_updates[0]) * trans->nr_wb_updates); - pos = 0; - } else { - pos = trans->nr_wb_updates; - } + trans->wb_updates[trans->nr_wb_updates] = (struct btree_write_buffered_key) { + .btree = btree, + }; - trans->wb_updates[pos] = (struct btree_write_buffered_key) { .btree = btree, }; - bkey_copy(&trans->wb_updates[pos].k, k); + bkey_copy(&trans->wb_updates[trans->nr_wb_updates].k, k); trans->nr_wb_updates++; + return 0; } @@ -1886,7 +1892,7 @@ int bch2_btree_delete_at_buffered(struct btree_trans *trans, bkey_init(&k->k); k->k.p = pos; - return bch2_trans_update_buffered(trans, btree, k, false); + return bch2_trans_update_buffered(trans, btree, k); } int bch2_btree_delete_range_trans(struct btree_trans *trans, enum btree_id id, |