diff options
Diffstat (limited to 'libbcachefs/btree_update_leaf.c')
-rw-r--r-- | libbcachefs/btree_update_leaf.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c index b42b83c5..8976a21f 100644 --- a/libbcachefs/btree_update_leaf.c +++ b/libbcachefs/btree_update_leaf.c @@ -418,8 +418,7 @@ static int run_one_mem_trigger(struct btree_trans *trans, return 0; if (bch2_bkey_ops[old.k->type].atomic_trigger == - bch2_bkey_ops[i->k->k.type].atomic_trigger && - ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) { + bch2_bkey_ops[i->k->k.type].atomic_trigger) { ret = bch2_mark_key(trans, i->btree_id, i->level, old, bkey_i_to_s_c(new), BTREE_TRIGGER_INSERT|BTREE_TRIGGER_OVERWRITE|flags); @@ -460,8 +459,7 @@ static int run_one_trans_trigger(struct btree_trans *trans, struct btree_insert_ if (!i->insert_trigger_run && !i->overwrite_trigger_run && bch2_bkey_ops[old.k->type].trans_trigger == - bch2_bkey_ops[i->k->k.type].trans_trigger && - ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) { + bch2_bkey_ops[i->k->k.type].trans_trigger) { i->overwrite_trigger_run = true; i->insert_trigger_run = true; return bch2_trans_mark_key(trans, i->btree_id, i->level, old, i->k, @@ -1218,7 +1216,6 @@ static inline int check_pos_snapshot_overwritten(struct btree_trans *trans, struct bpos pos) { if (!btree_type_has_snapshots(id) || - pos.snapshot == U32_MAX || !snapshot_t(trans->c, pos.snapshot)->children[0]) return 0; @@ -1718,21 +1715,14 @@ 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) + struct bkey_i *k, + bool head) { - struct btree_write_buffered_key *i; - int ret; + int ret, pos; 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; @@ -1759,13 +1749,18 @@ int __must_check bch2_trans_update_buffered(struct btree_trans *trans, trans->wb_updates = u; } - trans->wb_updates[trans->nr_wb_updates] = (struct btree_write_buffered_key) { - .btree = btree, - }; + 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; + } - bkey_copy(&trans->wb_updates[trans->nr_wb_updates].k, k); + trans->wb_updates[pos] = (struct btree_write_buffered_key) { .btree = btree, }; + bkey_copy(&trans->wb_updates[pos].k, k); trans->nr_wb_updates++; - return 0; } @@ -1886,7 +1881,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); + return bch2_trans_update_buffered(trans, btree, k, false); } int bch2_btree_delete_range_trans(struct btree_trans *trans, enum btree_id id, |