]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_trans_commit.c
Update bcachefs sources to 481b5f343248 bcachefs: Better error messages for missing...
[bcachefs-tools-debian] / libbcachefs / btree_trans_commit.c
index 80505554498cf96697cd8c8108207a92e854a8aa..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,9 +445,6 @@ 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->trigger == new_ops->trigger) {
                ret   = bch2_key_trigger(trans, i->btree_id, i->level,
                                old, bkey_i_to_s(new),
@@ -586,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
@@ -596,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
@@ -680,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);
@@ -689,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;
                }
@@ -994,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;
@@ -1018,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))