diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-13 22:44:04 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-17 14:30:14 -0400 |
commit | d9a836e0234ac437c49d9f819bbc34d8eb18136d (patch) | |
tree | d287ed76af54b9e2c40cefa855a89127a6c5edf1 | |
parent | 490644bff59ebce457b94f3069e770dd4499eac8 (diff) |
bcachefs: kill struct btree_insert
-rw-r--r-- | fs/bcachefs/btree_types.h | 7 | ||||
-rw-r--r-- | fs/bcachefs/btree_update.h | 15 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 65 | ||||
-rw-r--r-- | fs/bcachefs/buckets.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/buckets.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/extents.h | 6 |
7 files changed, 47 insertions, 54 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 696a07997855..41142988b8d5 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -288,6 +288,13 @@ struct btree_trans { struct btree_iter *iters; struct btree_insert_entry *updates; + struct disk_reservation *disk_res; + + /* update path: */ + struct journal_res journal_res; + struct journal_preres journal_preres; + u64 *journal_seq; + unsigned flags; struct btree_iter iters_onstack[2]; struct btree_insert_entry updates_onstack[6]; diff --git a/fs/bcachefs/btree_update.h b/fs/bcachefs/btree_update.h index cc24889d9d2a..02dbb73c9a3b 100644 --- a/fs/bcachefs/btree_update.h +++ b/fs/bcachefs/btree_update.h @@ -6,13 +6,12 @@ struct bch_fs; struct btree; -struct btree_insert; void bch2_btree_node_lock_for_insert(struct bch_fs *, struct btree *, struct btree_iter *); bool bch2_btree_bset_insert_key(struct btree_iter *, struct btree *, struct btree_node_iter *, struct bkey_i *); -void bch2_btree_journal_key(struct btree_insert *trans, struct btree_iter *, +void bch2_btree_journal_key(struct btree_trans *, struct btree_iter *, struct bkey_i *); void bch2_deferred_update_free(struct bch_fs *, @@ -20,18 +19,6 @@ void bch2_deferred_update_free(struct bch_fs *, struct deferred_update * bch2_deferred_update_alloc(struct bch_fs *, enum btree_id, unsigned); -struct btree_insert { - struct bch_fs *c; - struct disk_reservation *disk_res; - struct journal_res journal_res; - struct journal_preres journal_preres; - u64 *journal_seq; - unsigned flags; - - unsigned short nr; - struct btree_insert_entry *entries; -}; - #define BTREE_INSERT_ENTRY(_iter, _k) \ ((struct btree_insert_entry) { \ .iter = (_iter), \ diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index 79ea14e79ac9..1fe305a673a6 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -17,8 +17,8 @@ #include <linux/sort.h> #include <trace/events/bcachefs.h> -static bool btree_trans_relock(struct btree_insert *); -static void btree_trans_unlock(struct btree_insert *); +static bool btree_trans_relock(struct btree_trans *); +static void btree_trans_unlock(struct btree_trans *); /* Inserting into a given leaf node (last stage of insert): */ @@ -129,7 +129,7 @@ static void btree_node_flush1(struct journal *j, struct journal_entry_pin *pin, return __btree_node_flush(j, pin, 1, seq); } -static inline void __btree_journal_key(struct btree_insert *trans, +static inline void __btree_journal_key(struct btree_trans *trans, enum btree_id btree_id, struct bkey_i *insert) { @@ -150,7 +150,7 @@ static inline void __btree_journal_key(struct btree_insert *trans, *trans->journal_seq = seq; } -void bch2_btree_journal_key(struct btree_insert *trans, +void bch2_btree_journal_key(struct btree_trans *trans, struct btree_iter *iter, struct bkey_i *insert) { @@ -184,7 +184,7 @@ void bch2_btree_journal_key(struct btree_insert *trans, set_btree_node_dirty(b); } -static void bch2_insert_fixup_key(struct btree_insert *trans, +static void bch2_insert_fixup_key(struct btree_trans *trans, struct btree_insert_entry *insert) { struct btree_iter *iter = insert->iter; @@ -202,7 +202,7 @@ static void bch2_insert_fixup_key(struct btree_insert *trans, /** * btree_insert_key - insert a key one key into a leaf node */ -static void btree_insert_key_leaf(struct btree_insert *trans, +static void btree_insert_key_leaf(struct btree_trans *trans, struct btree_insert_entry *insert) { struct bch_fs *c = trans->c; @@ -285,7 +285,7 @@ static void deferred_update_flush(struct journal *j, kfree(k); } -static void btree_insert_key_deferred(struct btree_insert *trans, +static void btree_insert_key_deferred(struct btree_trans *trans, struct btree_insert_entry *insert) { struct bch_fs *c = trans->c; @@ -355,24 +355,24 @@ bch2_deferred_update_alloc(struct bch_fs *c, * We sort transaction entries so that if multiple iterators point to the same * leaf node they'll be adjacent: */ -static bool same_leaf_as_prev(struct btree_insert *trans, +static bool same_leaf_as_prev(struct btree_trans *trans, struct btree_insert_entry *i) { - return i != trans->entries && + return i != trans->updates && !i->deferred && i[0].iter->l[0].b == i[-1].iter->l[0].b; } #define __trans_next_entry(_trans, _i, _filter) \ ({ \ - while ((_i) < (_trans)->entries + (_trans->nr) && !(_filter)) \ + while ((_i) < (_trans)->updates + (_trans->nr_updates) && !(_filter))\ (_i)++; \ \ - (_i) < (_trans)->entries + (_trans->nr); \ + (_i) < (_trans)->updates + (_trans->nr_updates); \ }) #define __trans_for_each_entry(_trans, _i, _filter) \ - for ((_i) = (_trans)->entries; \ + for ((_i) = (_trans)->updates; \ __trans_next_entry(_trans, _i, _filter); \ (_i)++) @@ -403,7 +403,7 @@ inline void bch2_btree_node_lock_for_insert(struct bch_fs *c, struct btree *b, bch2_btree_init_next(c, b, iter); } -static void multi_lock_write(struct bch_fs *c, struct btree_insert *trans) +static void multi_lock_write(struct bch_fs *c, struct btree_trans *trans) { struct btree_insert_entry *i; @@ -411,7 +411,7 @@ static void multi_lock_write(struct bch_fs *c, struct btree_insert *trans) bch2_btree_node_lock_for_insert(c, i->iter->l[0].b, i->iter); } -static void multi_unlock_write(struct btree_insert *trans) +static void multi_unlock_write(struct btree_trans *trans) { struct btree_insert_entry *i; @@ -426,7 +426,7 @@ static inline int btree_trans_cmp(struct btree_insert_entry l, btree_iter_cmp(l.iter, r.iter); } -static bool btree_trans_relock(struct btree_insert *trans) +static bool btree_trans_relock(struct btree_trans *trans) { struct btree_insert_entry *i; @@ -435,7 +435,7 @@ static bool btree_trans_relock(struct btree_insert *trans) return true; } -static void btree_trans_unlock(struct btree_insert *trans) +static void btree_trans_unlock(struct btree_trans *trans) { struct btree_insert_entry *i; @@ -448,7 +448,7 @@ static void btree_trans_unlock(struct btree_insert *trans) /* Normal update interface: */ static enum btree_insert_ret -btree_key_can_insert(struct btree_insert *trans, +btree_key_can_insert(struct btree_trans *trans, struct btree_insert_entry *insert, unsigned *u64s) { @@ -476,7 +476,7 @@ btree_key_can_insert(struct btree_insert *trans, return BTREE_INSERT_OK; } -static inline void do_btree_insert_one(struct btree_insert *trans, +static inline void do_btree_insert_one(struct btree_trans *trans, struct btree_insert_entry *insert) { if (likely(!insert->deferred)) @@ -488,7 +488,7 @@ static inline void do_btree_insert_one(struct btree_insert *trans, /* * Get journal reservation, take write locks, and attempt to do btree update(s): */ -static inline int do_btree_insert_at(struct btree_insert *trans, +static inline int do_btree_insert_at(struct btree_trans *trans, struct btree_insert_entry **stopped_at) { struct bch_fs *c = trans->c; @@ -630,7 +630,7 @@ static inline void btree_insert_entry_checks(struct bch_fs *c, * -EROFS: filesystem read only * -EIO: journal or btree node IO error */ -static int __bch2_btree_insert_at(struct btree_insert *trans) +static int __bch2_btree_insert_at(struct btree_trans *trans) { struct bch_fs *c = trans->c; struct btree_insert_entry *i; @@ -638,17 +638,17 @@ static int __bch2_btree_insert_at(struct btree_insert *trans) unsigned flags, u64s = 0; int ret; - BUG_ON(!trans->nr); + BUG_ON(!trans->nr_updates); /* for the sake of sanity: */ - BUG_ON(trans->nr > 1 && !(trans->flags & BTREE_INSERT_ATOMIC)); + BUG_ON(trans->nr_updates > 1 && !(trans->flags & BTREE_INSERT_ATOMIC)); if (trans->flags & BTREE_INSERT_GC_LOCK_HELD) lockdep_assert_held(&c->gc_lock); memset(&trans->journal_preres, 0, sizeof(trans->journal_preres)); - bubble_sort(trans->entries, trans->nr, btree_trans_cmp); + bubble_sort(trans->updates, trans->nr_updates, btree_trans_cmp); trans_for_each_entry(trans, i) btree_insert_entry_checks(c, i); @@ -780,7 +780,7 @@ err: goto out; } - bch2_btree_iter_unlock(trans->entries[0].iter); + bch2_trans_unlock(trans); ret = -EINTR; trans_for_each_iter(trans, i) { @@ -829,21 +829,20 @@ int bch2_trans_commit(struct btree_trans *trans, u64 *journal_seq, unsigned flags) { - struct btree_insert insert = { - .c = trans->c, - .disk_res = disk_res, - .journal_seq = journal_seq, - .flags = flags, - .nr = trans->nr_updates, - .entries = trans->updates, - }; + int ret; if (!trans->nr_updates) return 0; + trans->disk_res = disk_res; + trans->journal_seq = journal_seq; + trans->flags = flags; + + ret = __bch2_btree_insert_at(trans); + trans->nr_updates = 0; - return __bch2_btree_insert_at(&insert); + return ret; } int bch2_btree_delete_at(struct btree_trans *trans, diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c index ae336cab2719..f827ff121d02 100644 --- a/fs/bcachefs/buckets.c +++ b/fs/bcachefs/buckets.c @@ -966,7 +966,7 @@ int bch2_mark_key(struct bch_fs *c, struct bkey_s_c k, return ret; } -void bch2_mark_update(struct btree_insert *trans, +void bch2_mark_update(struct btree_trans *trans, struct btree_insert_entry *insert) { struct bch_fs *c = trans->c; diff --git a/fs/bcachefs/buckets.h b/fs/bcachefs/buckets.h index 0725aa94428b..e57bf2b33000 100644 --- a/fs/bcachefs/buckets.h +++ b/fs/bcachefs/buckets.h @@ -255,7 +255,7 @@ int bch2_mark_key_locked(struct bch_fs *, struct bkey_s_c, int bch2_mark_key(struct bch_fs *, struct bkey_s_c, bool, s64, struct gc_pos, struct bch_fs_usage *, u64, unsigned); -void bch2_mark_update(struct btree_insert *, struct btree_insert_entry *); +void bch2_mark_update(struct btree_trans *, struct btree_insert_entry *); int bch2_fs_usage_apply(struct bch_fs *, struct bch_fs_usage *, struct disk_reservation *); diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index b6d049b64905..8a7906aa055b 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -890,7 +890,7 @@ bool bch2_extent_is_atomic(struct bkey_i *k, struct btree_iter *iter) } enum btree_insert_ret -bch2_extent_can_insert(struct btree_insert *trans, +bch2_extent_can_insert(struct btree_trans *trans, struct btree_insert_entry *insert, unsigned *u64s) { @@ -1164,7 +1164,7 @@ next: * If the end of iter->pos is not the same as the end of insert, then * key insertion needs to continue/be retried. */ -void bch2_insert_fixup_extent(struct btree_insert *trans, +void bch2_insert_fixup_extent(struct btree_trans *trans, struct btree_insert_entry *insert) { struct bch_fs *c = trans->c; diff --git a/fs/bcachefs/extents.h b/fs/bcachefs/extents.h index 026960c82d04..77d698418fb5 100644 --- a/fs/bcachefs/extents.h +++ b/fs/bcachefs/extents.h @@ -6,7 +6,7 @@ #include "extents_types.h" struct bch_fs; -struct btree_insert; +struct btree_trans; struct btree_insert_entry; /* extent entries: */ @@ -409,9 +409,9 @@ void bch2_extent_trim_atomic(struct bkey_i *, struct btree_iter *); bool bch2_extent_is_atomic(struct bkey_i *, struct btree_iter *); enum btree_insert_ret -bch2_extent_can_insert(struct btree_insert *, struct btree_insert_entry *, +bch2_extent_can_insert(struct btree_trans *, struct btree_insert_entry *, unsigned *); -void bch2_insert_fixup_extent(struct btree_insert *, +void bch2_insert_fixup_extent(struct btree_trans *, struct btree_insert_entry *); void bch2_extent_mark_replicas_cached(struct bch_fs *, struct bkey_s_extent, |