]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Ensure that new inodes hit underlying btree
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 30 Jul 2021 22:01:33 +0000 (18:01 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:10 +0000 (17:09 -0400)
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>
fs/bcachefs/btree_update_leaf.c

index 20275be972569ed21e799eb6906671ca34015244..179091e4c5617514d978ae4ceca36d8e8c3e50ce 100644 (file)
@@ -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);