]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_trans_commit.c
Disable pristine-tar option in gbp.conf, since there is no pristine-tar branch.
[bcachefs-tools-debian] / libbcachefs / btree_trans_commit.c
index 3472882bf9db794f3fc2f8566f02c71f7ecf8297..30d69a6d133eec77c76c7e64a5de0d896ad6b732 100644 (file)
@@ -139,8 +139,7 @@ bool bch2_btree_bset_insert_key(struct btree_trans *trans,
        EBUG_ON(bkey_deleted(&insert->k) && bkey_val_u64s(&insert->k));
        EBUG_ON(bpos_lt(insert->k.p, b->data->min_key));
        EBUG_ON(bpos_gt(insert->k.p, b->data->max_key));
-       EBUG_ON(insert->k.u64s >
-               bch_btree_keys_u64s_remaining(trans->c, b));
+       EBUG_ON(insert->k.u64s > bch2_btree_keys_u64s_remaining(b));
        EBUG_ON(!b->c.level && !bpos_eq(insert->k.p, path->pos));
 
        k = bch2_btree_node_iter_peek_all(node_iter, b);
@@ -160,7 +159,7 @@ bool bch2_btree_bset_insert_key(struct btree_trans *trans,
                k->type = KEY_TYPE_deleted;
 
                if (k->needs_whiteout)
-                       push_whiteout(trans->c, b, insert->k.p);
+                       push_whiteout(b, insert->k.p);
                k->needs_whiteout = false;
 
                if (k >= btree_bset_last(b)->start) {
@@ -348,9 +347,7 @@ static noinline void journal_transaction_name(struct btree_trans *trans)
 static inline int btree_key_can_insert(struct btree_trans *trans,
                                       struct btree *b, unsigned u64s)
 {
-       struct bch_fs *c = trans->c;
-
-       if (!bch2_btree_node_insert_fits(c, b, u64s))
+       if (!bch2_btree_node_insert_fits(b, u64s))
                return -BCH_ERR_btree_insert_btree_node_full;
 
        return 0;
@@ -418,7 +415,7 @@ static int btree_key_can_insert_cached(struct btree_trans *trans, unsigned flags
                return 0;
 
        new_u64s        = roundup_pow_of_two(u64s);
-       new_k           = krealloc(ck->k, new_u64s * sizeof(u64), GFP_NOWAIT);
+       new_k           = krealloc(ck->k, new_u64s * sizeof(u64), GFP_NOWAIT|__GFP_NOWARN);
        if (unlikely(!new_k))
                return btree_key_can_insert_cached_slowpath(trans, flags, path, new_u64s);
 
@@ -448,23 +445,15 @@ static int run_one_mem_trigger(struct btree_trans *trans,
        if (unlikely(flags & BTREE_TRIGGER_NORUN))
                return 0;
 
-       if (!btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id)))
-               return 0;
-
-       if (old_ops->atomic_trigger == new_ops->atomic_trigger) {
-               ret   = bch2_mark_key(trans, i->btree_id, i->level,
-                               old, bkey_i_to_s_c(new),
+       if (old_ops->trigger == new_ops->trigger) {
+               ret   = bch2_key_trigger(trans, i->btree_id, i->level,
+                               old, bkey_i_to_s(new),
                                BTREE_TRIGGER_INSERT|BTREE_TRIGGER_OVERWRITE|flags);
        } else {
-               struct bkey             _deleted = POS_KEY((trans->paths + i->path)->pos);
-               struct bkey_s_c         deleted = (struct bkey_s_c) { &_deleted, NULL };
-
-               ret   = bch2_mark_key(trans, i->btree_id, i->level,
-                               deleted, bkey_i_to_s_c(new),
-                               BTREE_TRIGGER_INSERT|flags) ?:
-                       bch2_mark_key(trans, i->btree_id, i->level,
-                               old, deleted,
-                               BTREE_TRIGGER_OVERWRITE|flags);
+               ret   = bch2_key_trigger_new(trans, i->btree_id, i->level,
+                               bkey_i_to_s(new), flags) ?:
+                       bch2_key_trigger_old(trans, i->btree_id, i->level,
+                               old, flags);
        }
 
        return ret;
@@ -482,6 +471,7 @@ static int run_one_trans_trigger(struct btree_trans *trans, struct btree_insert_
        struct bkey_s_c old = { &old_k, i->old_v };
        const struct bkey_ops *old_ops = bch2_bkey_type_ops(old.k->type);
        const struct bkey_ops *new_ops = bch2_bkey_type_ops(i->k->k.type);
+       unsigned flags = i->flags|BTREE_TRIGGER_TRANSACTIONAL;
 
        verify_update_old_key(trans, i);
 
@@ -491,19 +481,18 @@ 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->trigger == new_ops->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,
-                                          BTREE_TRIGGER_INSERT|
-                                          BTREE_TRIGGER_OVERWRITE|
-                                          i->flags) ?: 1;
+               return bch2_key_trigger(trans, i->btree_id, i->level, old, bkey_i_to_s(i->k),
+                                       BTREE_TRIGGER_INSERT|
+                                       BTREE_TRIGGER_OVERWRITE|flags) ?: 1;
        } else if (overwrite && !i->overwrite_trigger_run) {
                i->overwrite_trigger_run = true;
-               return bch2_trans_mark_old(trans, i->btree_id, i->level, old, i->flags) ?: 1;
+               return bch2_key_trigger_old(trans, i->btree_id, i->level, old, flags) ?: 1;
        } else if (!overwrite && !i->insert_trigger_run) {
                i->insert_trigger_run = true;
-               return bch2_trans_mark_new(trans, i->btree_id, i->level, i->k, i->flags) ?: 1;
+               return bch2_key_trigger_new(trans, i->btree_id, i->level, bkey_i_to_s(i->k), flags) ?: 1;
        } else {
                return 0;
        }
@@ -591,9 +580,6 @@ static int bch2_trans_commit_run_triggers(struct btree_trans *trans)
 
 static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)
 {
-       struct bch_fs *c = trans->c;
-       int ret = 0;
-
        trans_for_each_update(trans, i) {
                /*
                 * XXX: synchronization of cached update triggers with gc
@@ -601,14 +587,15 @@ static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)
                 */
                BUG_ON(i->cached || i->level);
 
-               if (gc_visited(c, gc_pos_btree_node(insert_l(trans, i)->b))) {
-                       ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_GC);
+               if (btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id)) &&
+                   gc_visited(trans->c, gc_pos_btree_node(insert_l(trans, i)->b))) {
+                       int ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_GC);
                        if (ret)
-                               break;
+                               return ret;
                }
        }
 
-       return ret;
+       return 0;
 }
 
 static inline int
@@ -685,6 +672,9 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
            bch2_trans_fs_usage_apply(trans, trans->fs_usage_deltas))
                return -BCH_ERR_btree_insert_need_mark_replicas;
 
+       /* XXX: we only want to run this if deltas are nonzero */
+       bch2_trans_account_disk_usage_change(trans);
+
        h = trans->hooks;
        while (h) {
                ret = h->fn(trans, h);
@@ -694,8 +684,8 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
        }
 
        trans_for_each_update(trans, i)
-               if (BTREE_NODE_TYPE_HAS_MEM_TRIGGERS & (1U << i->bkey_type)) {
-                       ret = run_one_mem_trigger(trans, i, i->flags);
+               if (BTREE_NODE_TYPE_HAS_ATOMIC_TRIGGERS & (1U << i->bkey_type)) {
+                       ret = run_one_mem_trigger(trans, i, BTREE_TRIGGER_ATOMIC|i->flags);
                        if (ret)
                                goto fatal_err;
                }
@@ -999,6 +989,8 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
            !trans->journal_entries_u64s)
                goto out_reset;
 
+       memset(&trans->fs_usage_delta, 0, sizeof(trans->fs_usage_delta));
+
        ret = bch2_trans_commit_run_triggers(trans);
        if (ret)
                goto out_reset;
@@ -1023,9 +1015,6 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
        for (struct jset_entry *i = trans->journal_entries;
             i != (void *) ((u64 *) trans->journal_entries + trans->journal_entries_u64s);
             i = vstruct_next(i)) {
-               if (!jset_entry_is_key(i))
-                       continue;
-
                enum bkey_invalid_flags invalid_flags = 0;
 
                if (!(flags & BCH_TRANS_COMMIT_no_journal_res))