]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_update.h
Update upstream source from tag 'v1.6.3'
[bcachefs-tools-debian] / libbcachefs / btree_update.h
index 14a2315aa88e4267775c910f3119728f3f5579dc..cc7c53e83f89dd5cdc8ccccab214ae3cbfd3fb72 100644 (file)
@@ -47,7 +47,6 @@ enum bch_trans_commit_flags {
 int bch2_btree_delete_extent_at(struct btree_trans *, struct btree_iter *,
                                unsigned, unsigned);
 int bch2_btree_delete_at(struct btree_trans *, struct btree_iter *, unsigned);
-int bch2_btree_delete_at_buffered(struct btree_trans *, enum btree_id, struct bpos);
 int bch2_btree_delete(struct btree_trans *, enum btree_id, struct bpos, unsigned);
 
 int bch2_btree_insert_nonextent(struct btree_trans *, enum btree_id,
@@ -64,6 +63,13 @@ int bch2_btree_delete_range(struct bch_fs *, enum btree_id,
                            struct bpos, struct bpos, unsigned, u64 *);
 
 int bch2_btree_bit_mod(struct btree_trans *, enum btree_id, struct bpos, bool);
+int bch2_btree_bit_mod_buffered(struct btree_trans *, enum btree_id, struct bpos, bool);
+
+static inline int bch2_btree_delete_at_buffered(struct btree_trans *trans,
+                                               enum btree_id btree, struct bpos pos)
+{
+       return bch2_btree_bit_mod_buffered(trans, btree, pos, false);
+}
 
 int __bch2_insert_snapshot_whiteouts(struct btree_trans *, enum btree_id,
                                     struct bpos, struct bpos);
@@ -96,10 +102,44 @@ int bch2_bkey_get_empty_slot(struct btree_trans *, struct btree_iter *,
 
 int __must_check bch2_trans_update(struct btree_trans *, struct btree_iter *,
                                   struct bkey_i *, enum btree_update_flags);
-int __must_check bch2_trans_update_seq(struct btree_trans *, u64, struct btree_iter *,
-                                      struct bkey_i *, enum btree_update_flags);
-int __must_check bch2_trans_update_buffered(struct btree_trans *,
-                                           enum btree_id, struct bkey_i *);
+
+struct jset_entry *__bch2_trans_jset_entry_alloc(struct btree_trans *, unsigned);
+
+static inline struct jset_entry *btree_trans_journal_entries_top(struct btree_trans *trans)
+{
+       return (void *) ((u64 *) trans->journal_entries + trans->journal_entries_u64s);
+}
+
+static inline struct jset_entry *
+bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsigned u64s)
+{
+       if (!trans->journal_entries ||
+           trans->journal_entries_u64s + u64s > trans->journal_entries_size)
+               return __bch2_trans_jset_entry_alloc(trans, u64s);
+
+       struct jset_entry *e = btree_trans_journal_entries_top(trans);
+       trans->journal_entries_u64s += u64s;
+       return e;
+}
+
+int bch2_btree_insert_clone_trans(struct btree_trans *, enum btree_id, struct bkey_i *);
+
+static inline int __must_check bch2_trans_update_buffered(struct btree_trans *trans,
+                                           enum btree_id btree,
+                                           struct bkey_i *k)
+{
+       if (unlikely(trans->journal_replay_not_finished))
+               return bch2_btree_insert_clone_trans(trans, btree, k);
+
+       struct jset_entry *e = bch2_trans_jset_entry_alloc(trans, jset_u64s(k->k.u64s));
+       int ret = PTR_ERR_OR_ZERO(e);
+       if (ret)
+               return ret;
+
+       journal_entry_init(e, BCH_JSET_ENTRY_write_buffer_keys, btree, 0, k->k.u64s);
+       bkey_copy(e->start, k);
+       return 0;
+}
 
 void bch2_trans_commit_hook(struct btree_trans *,
                            struct btree_trans_commit_hook *);
@@ -148,28 +188,19 @@ static inline int bch2_trans_commit(struct btree_trans *trans,
        bch2_trans_run(_c, commit_do(trans, _disk_res, _journal_seq, _flags, _do))
 
 #define trans_for_each_update(_trans, _i)                              \
-       for ((_i) = (_trans)->updates;                                  \
+       for (struct btree_insert_entry *_i = (_trans)->updates;         \
             (_i) < (_trans)->updates + (_trans)->nr_updates;           \
             (_i)++)
 
-#define trans_for_each_wb_update(_trans, _i)                           \
-       for ((_i) = (_trans)->wb_updates;                               \
-            (_i) < (_trans)->wb_updates + (_trans)->nr_wb_updates;     \
-            (_i)++)
-
 static inline void bch2_trans_reset_updates(struct btree_trans *trans)
 {
-       struct btree_insert_entry *i;
-
        trans_for_each_update(trans, i)
                bch2_path_put(trans, i->path, true);
 
-       trans->extra_journal_res        = 0;
        trans->nr_updates               = 0;
-       trans->nr_wb_updates            = 0;
-       trans->wb_updates               = NULL;
+       trans->journal_entries_u64s     = 0;
        trans->hooks                    = NULL;
-       trans->extra_journal_entries.nr = 0;
+       trans->extra_disk_res           = 0;
 
        if (trans->fs_usage_deltas) {
                trans->fs_usage_deltas->used = 0;