bcachefs: bch2_btree_iter_fix_key_modified()
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 2 Oct 2019 13:56:39 +0000 (09:56 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:30 +0000 (17:08 -0400)
This is considerably cheaper than bch2_btree_node_iter_fix(), for cases
where the key was only modified and key ordering isn't changing.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h
fs/bcachefs/extents.c

index c264b927f992bbcc46c4af31ba4d2e947b9f7afe..f849120fcbcefa0390ea32579082cc27903a3ef4 100644 (file)
@@ -501,6 +501,30 @@ static void btree_node_iter_set_set_pos(struct btree_node_iter *iter,
        bch2_btree_node_iter_push(iter, b, k, btree_bkey_last(b, t));
 }
 
+static void __bch2_btree_iter_fix_key_modified(struct btree_iter *iter,
+                                                   struct btree *b,
+                                                   struct bkey_packed *where)
+{
+       struct btree_node_iter *node_iter = &iter->l[0].iter;
+
+       if (where == bch2_btree_node_iter_peek_all(node_iter, b)) {
+               bkey_disassemble(b, where, &iter->k);
+               btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
+       }
+}
+
+void bch2_btree_iter_fix_key_modified(struct btree_iter *iter,
+                                     struct btree *b,
+                                     struct bkey_packed *where)
+{
+       struct btree_iter *linked;
+
+       trans_for_each_iter_with_node(iter->trans, b, linked) {
+               __bch2_btree_iter_fix_key_modified(linked, b, where);
+               __bch2_btree_iter_verify(linked, b);
+       }
+}
+
 static void __bch2_btree_node_iter_fix(struct btree_iter *iter,
                                      struct btree *b,
                                      struct btree_node_iter *node_iter,
index 1b7262d7e284ea1fb5faa09ab16c8d9a72341504..a05e542b37927a086455b2bcc534588c55a63ce4 100644 (file)
@@ -104,6 +104,8 @@ static inline void bch2_btree_iter_verify(struct btree_iter *iter,
 static inline void bch2_btree_trans_verify_locks(struct btree_trans *iter) {}
 #endif
 
+void bch2_btree_iter_fix_key_modified(struct btree_iter *, struct btree *,
+                                          struct bkey_packed *);
 void bch2_btree_node_iter_fix(struct btree_iter *, struct btree *,
                              struct btree_node_iter *, struct bkey_packed *,
                              unsigned, unsigned);
index b427bc1f0f9ca65f928859bddb6cf1d857d199fa..201f4953acac15ae9d5e9892d008ac3053c33573 100644 (file)
@@ -1091,8 +1091,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
                __bch2_cut_front(insert->k.p, k);
                EBUG_ON(bkey_deleted(k.k));
                extent_save(l->b, _k, k.k);
-               bch2_btree_node_iter_fix(iter, l->b, &l->iter,
-                                        _k, _k->u64s, _k->u64s);
+               bch2_btree_iter_fix_key_modified(iter, l->b, _k);
                break;
 
        case BCH_EXTENT_OVERLAP_BACK:
@@ -1127,8 +1126,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
                                                 _k, u64s, 0);
                } else {
                        extent_save(l->b, _k, k.k);
-                       bch2_btree_node_iter_fix(iter, l->b, &l->iter,
-                                                _k, _k->u64s, _k->u64s);
+                       bch2_btree_iter_fix_key_modified(iter, l->b, _k);
                }
 
                break;
@@ -1158,8 +1156,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
                __bch2_cut_front(insert->k.p, k);
                BUG_ON(bkey_deleted(k.k));
                extent_save(l->b, _k, k.k);
-               bch2_btree_node_iter_fix(iter, l->b, &l->iter,
-                                        _k, _k->u64s, _k->u64s);
+               bch2_btree_iter_fix_key_modified(iter, l->b, _k);
 
                extent_bset_insert(c, iter, &split.k);
                break;
@@ -1259,8 +1256,8 @@ void bch2_insert_fixup_extent(struct btree_trans *trans,
                                btree_account_key_drop(l->b, _k);
                                _k->type = KEY_TYPE_discard;
                                reserve_whiteout(l->b, _k);
-                               bch2_btree_node_iter_fix(iter, l->b, &l->iter,
-                                                       _k, _k->u64s, _k->u64s);
+                               bch2_btree_iter_fix_key_modified(iter,
+                                                                l->b, _k);
                        }
                        break;
                }