diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-10-02 09:56:39 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-11-04 15:56:30 -0500 |
commit | 8eed8a548ba6c8223852a2316ace3ab22e0dfc72 (patch) | |
tree | 7652a61c761738128a729068c4756969cddbc578 | |
parent | c6f937431e3974a09d0799f514b4e19c53b9f494 (diff) |
bcachefs: bch2_btree_iter_fix_key_modified()
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>
-rw-r--r-- | fs/bcachefs/btree_iter.c | 24 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 13 |
3 files changed, 31 insertions, 8 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 64aed1e034b4..5fab505dbea0 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -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, diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index eca1a0ebc918..4c5032222319 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -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); diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index 384180ccad6a..69057dcb6d0c 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -1092,8 +1092,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: @@ -1128,8 +1127,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; @@ -1159,8 +1157,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; @@ -1260,8 +1257,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; } |