]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_update_leaf.c
Update bcachefs sources to da7d42a9a2 bcachefs: Add new assertions for shutdown path
[bcachefs-tools-debian] / libbcachefs / btree_update_leaf.c
index f7ffd68f5617252dd8072023947479277b3c683c..6e12e8e7c301b045f1d47877a2123e70f690b21b 100644 (file)
@@ -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,