summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-07-30 18:01:33 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:10 -0400
commite3637266024de9bafa64f315d7d03cf0291ace6a (patch)
tree6575c12eef8b4029f412058c9ee8efb784cfca7b
parent0f120eac34f31e7e6c4904d9e92e2e95e2edfbaa (diff)
downloadlwn-e3637266024de9bafa64f315d7d03cf0291ace6a.tar.gz
lwn-e3637266024de9bafa64f315d7d03cf0291ace6a.zip
bcachefs: Ensure that new inodes hit underlying btree
Inode creation is done with non-cached btree iterators, but then in the same transaction the inode may be updated again with a cached iterator - it makes cache coherency easier if new inodes always land in the underlying btree. This patch adds a check to bch2_trans_update() - if the same key is updated multiple times in the same transaction with both cached and non cache iterators, use the non cached iterator. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_update_leaf.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index 20275be97256..179091e4c561 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -1062,7 +1062,19 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter,
if (i < trans->updates + trans->nr_updates &&
!btree_insert_entry_cmp(&n, i)) {
BUG_ON(i->trans_triggers_run);
- *i = n;
+
+ /*
+ * This is a hack to ensure that inode creates update the btree,
+ * not the key cache, which helps with cache coherency issues in
+ * other areas:
+ */
+ if (btree_iter_type(n.iter) == BTREE_ITER_CACHED &&
+ btree_iter_type(i->iter) != BTREE_ITER_CACHED) {
+ i->k = n.k;
+ i->flags = n.flags;
+ } else {
+ *i = n;
+ }
} else
array_insert_item(trans->updates, trans->nr_updates,
i - trans->updates, n);