summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-28 07:34:25 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:19 +0300
commit76a0537bf1286f56266fb899014505cba1e332f4 (patch)
treed7150c35f9385f19a72c9caf4c394f6abbaf85ea
parent4afe700060799d0ccf42c9881f3ebfab96953fd8 (diff)
downloadlinux-76a0537bf1286f56266fb899014505cba1e332f4.tar.xz
bcachefs: Sort updates in bch2_trans_update()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_update.h12
-rw-r--r--fs/bcachefs/btree_update_leaf.c22
2 files changed, 23 insertions, 11 deletions
diff --git a/fs/bcachefs/btree_update.h b/fs/bcachefs/btree_update.h
index 879e7ae39586..75ed02874767 100644
--- a/fs/bcachefs/btree_update.h
+++ b/fs/bcachefs/btree_update.h
@@ -99,19 +99,13 @@ int bch2_btree_node_rewrite(struct bch_fs *c, struct btree_iter *,
int bch2_btree_node_update_key(struct bch_fs *, struct btree_iter *,
struct btree *, struct bkey_i_btree_ptr *);
-static inline void
-bch2_trans_update(struct btree_trans *trans,
- struct btree_insert_entry entry)
-{
- BUG_ON(trans->nr_updates >= trans->nr_iters + 4);
-
- trans->updates[trans->nr_updates++] = entry;
-}
-
int bch2_trans_commit(struct btree_trans *,
struct disk_reservation *,
u64 *, unsigned);
+struct btree_insert_entry *bch2_trans_update(struct btree_trans *,
+ struct btree_insert_entry);
+
#define bch2_trans_do(_c, _journal_seq, _flags, _do) \
({ \
struct btree_trans trans; \
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index d345f5a14fde..d4d4329767da 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -809,8 +809,6 @@ int bch2_trans_commit(struct btree_trans *trans,
trans->journal_seq = journal_seq;
trans->flags = flags;
- bubble_sort(trans->updates, trans->nr_updates, btree_trans_cmp);
-
trans_for_each_update(trans, i)
btree_insert_entry_checks(trans, i);
bch2_btree_trans_verify_locks(trans);
@@ -871,6 +869,26 @@ err:
goto out;
}
+struct btree_insert_entry *bch2_trans_update(struct btree_trans *trans,
+ struct btree_insert_entry entry)
+{
+ struct btree_insert_entry *i;
+
+ BUG_ON(trans->nr_updates >= trans->nr_iters + 4);
+
+ for (i = trans->updates;
+ i < trans->updates + trans->nr_updates;
+ i++)
+ if (btree_trans_cmp(entry, *i) < 0)
+ break;
+
+ memmove(&i[1], &i[0],
+ (void *) &trans->updates[trans->nr_updates] - (void *) i);
+ trans->nr_updates++;
+ *i = entry;
+ return i;
+}
+
int bch2_btree_delete_at(struct btree_trans *trans,
struct btree_iter *iter, unsigned flags)
{