]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_trans_commit.c
Update bcachefs sources to feaca6edbd24 mean and variance: Promote to lib/math
[bcachefs-tools-debian] / libbcachefs / btree_trans_commit.c
index 7210d5c22c986a4bc9bbc2ca442fc535d4a914d2..336350bd904828088f0fdabdc1ae7c8d638ec382 100644 (file)
@@ -287,7 +287,7 @@ 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))) {
-               EBUG_ON(test_bit(BCH_FS_CLEAN_SHUTDOWN, &c->flags));
+               EBUG_ON(test_bit(BCH_FS_clean_shutdown, &c->flags));
                set_btree_node_dirty_acct(c, b);
        }
 
@@ -659,6 +659,10 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
                i->k->k.needs_whiteout = false;
        }
 
+       if (trans->nr_wb_updates &&
+           trans->nr_wb_updates + c->btree_write_buffer.state.nr > c->btree_write_buffer.size)
+               return -BCH_ERR_btree_insert_need_flush_buffer;
+
        /*
         * Don't get journal reservation until after we know insert will
         * succeed:
@@ -693,6 +697,14 @@ 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;
 
+       if (trans->nr_wb_updates) {
+               EBUG_ON(flags & BCH_TRANS_COMMIT_no_journal_res);
+
+               ret = bch2_btree_insert_keys_write_buffer(trans);
+               if (ret)
+                       goto revert_fs_usage;
+       }
+
        h = trans->hooks;
        while (h) {
                ret = h->fn(trans, h);
@@ -754,7 +766,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
 
                trans_for_each_wb_update(trans, wb) {
                        entry = bch2_journal_add_entry(j, &trans->journal_res,
-                                              BCH_JSET_ENTRY_write_buffer_keys,
+                                              BCH_JSET_ENTRY_btree_keys,
                                               wb->btree, 0,
                                               wb->k.k.u64s);
                        bkey_copy((struct bkey_i *) entry->start, &wb->k);
@@ -938,6 +950,30 @@ int bch2_trans_commit_error(struct btree_trans *trans, unsigned flags,
 
                ret = bch2_trans_relock(trans);
                break;
+       case -BCH_ERR_btree_insert_need_flush_buffer: {
+               struct btree_write_buffer *wb = &c->btree_write_buffer;
+
+               ret = 0;
+
+               if (wb->state.nr > wb->size * 3 / 4) {
+                       bch2_trans_unlock(trans);
+                       mutex_lock(&wb->flush_lock);
+
+                       if (wb->state.nr > wb->size * 3 / 4) {
+                               bch2_trans_begin(trans);
+                               ret = bch2_btree_write_buffer_flush_locked(trans);
+                               mutex_unlock(&wb->flush_lock);
+                               if (!ret) {
+                                       trace_and_count(c, trans_restart_write_buffer_flush, trans, _THIS_IP_);
+                                       ret = btree_trans_restart(trans, BCH_ERR_transaction_restart_write_buffer_flush);
+                               }
+                       } else {
+                               mutex_unlock(&wb->flush_lock);
+                               ret = bch2_trans_relock(trans);
+                       }
+               }
+               break;
+       }
        default:
                BUG_ON(ret >= 0);
                break;
@@ -959,7 +995,7 @@ bch2_trans_commit_get_rw_cold(struct btree_trans *trans, unsigned flags)
        int ret;
 
        if (likely(!(flags & BCH_TRANS_COMMIT_lazy_rw)) ||
-           test_bit(BCH_FS_STARTED, &c->flags))
+           test_bit(BCH_FS_started, &c->flags))
                return -BCH_ERR_erofs_trans_commit;
 
        ret = drop_locks_do(trans, bch2_fs_read_write_early(c));
@@ -1024,7 +1060,7 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
                        return ret;
        }
 
-       if (unlikely(!test_bit(BCH_FS_MAY_GO_RW, &c->flags))) {
+       if (unlikely(!test_bit(BCH_FS_may_go_rw, &c->flags))) {
                ret = do_bch2_trans_commit_to_journal_replay(trans);
                goto out_reset;
        }
@@ -1036,7 +1072,21 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
                        goto out_reset;
        }
 
-       EBUG_ON(test_bit(BCH_FS_CLEAN_SHUTDOWN, &c->flags));
+       if (c->btree_write_buffer.state.nr > c->btree_write_buffer.size / 2 &&
+           mutex_trylock(&c->btree_write_buffer.flush_lock)) {
+               bch2_trans_begin(trans);
+               bch2_trans_unlock(trans);
+
+               ret = bch2_btree_write_buffer_flush_locked(trans);
+               mutex_unlock(&c->btree_write_buffer.flush_lock);
+               if (!ret) {
+                       trace_and_count(c, trans_restart_write_buffer_flush, trans, _THIS_IP_);
+                       ret = btree_trans_restart(trans, BCH_ERR_transaction_restart_write_buffer_flush);
+               }
+               goto out;
+       }
+
+       EBUG_ON(test_bit(BCH_FS_clean_shutdown, &c->flags));
 
        trans->journal_u64s             = trans->extra_journal_entries.nr;
        trans->journal_transaction_names = READ_ONCE(c->opts.journal_transaction_names);