summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_update_leaf.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-07-09 15:16:50 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-07-09 15:25:40 -0400
commit5d507f795b0b679a67e972a48cbd0854c4ad0f02 (patch)
treebf30f9dd1badd504025e836d696d4d2d939108c3 /libbcachefs/btree_update_leaf.c
parentc99a444c5cc242a89845be83236aacd7db628ef5 (diff)
Update bcachefs sources to da7d42a9a2 bcachefs: Add new assertions for shutdown path
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/btree_update_leaf.c')
-rw-r--r--libbcachefs/btree_update_leaf.c40
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,