Commit 887c2a4e authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

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: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent b7ba66c8
...@@ -501,6 +501,30 @@ static void btree_node_iter_set_set_pos(struct btree_node_iter *iter, ...@@ -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)); 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, static void __bch2_btree_node_iter_fix(struct btree_iter *iter,
struct btree *b, struct btree *b,
struct btree_node_iter *node_iter, struct btree_node_iter *node_iter,
......
...@@ -104,6 +104,8 @@ static inline void bch2_btree_iter_verify(struct btree_iter *iter, ...@@ -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) {} static inline void bch2_btree_trans_verify_locks(struct btree_trans *iter) {}
#endif #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 *, void bch2_btree_node_iter_fix(struct btree_iter *, struct btree *,
struct btree_node_iter *, struct bkey_packed *, struct btree_node_iter *, struct bkey_packed *,
unsigned, unsigned); unsigned, unsigned);
......
...@@ -1091,8 +1091,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter, ...@@ -1091,8 +1091,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
__bch2_cut_front(insert->k.p, k); __bch2_cut_front(insert->k.p, k);
EBUG_ON(bkey_deleted(k.k)); EBUG_ON(bkey_deleted(k.k));
extent_save(l->b, _k, k.k); extent_save(l->b, _k, k.k);
bch2_btree_node_iter_fix(iter, l->b, &l->iter, bch2_btree_iter_fix_key_modified(iter, l->b, _k);
_k, _k->u64s, _k->u64s);
break; break;
case BCH_EXTENT_OVERLAP_BACK: case BCH_EXTENT_OVERLAP_BACK:
...@@ -1127,8 +1126,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter, ...@@ -1127,8 +1126,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
_k, u64s, 0); _k, u64s, 0);
} else { } else {
extent_save(l->b, _k, k.k); extent_save(l->b, _k, k.k);
bch2_btree_node_iter_fix(iter, l->b, &l->iter, bch2_btree_iter_fix_key_modified(iter, l->b, _k);
_k, _k->u64s, _k->u64s);
} }
break; break;
...@@ -1158,8 +1156,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter, ...@@ -1158,8 +1156,7 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
__bch2_cut_front(insert->k.p, k); __bch2_cut_front(insert->k.p, k);
BUG_ON(bkey_deleted(k.k)); BUG_ON(bkey_deleted(k.k));
extent_save(l->b, _k, k.k); extent_save(l->b, _k, k.k);
bch2_btree_node_iter_fix(iter, l->b, &l->iter, bch2_btree_iter_fix_key_modified(iter, l->b, _k);
_k, _k->u64s, _k->u64s);
extent_bset_insert(c, iter, &split.k); extent_bset_insert(c, iter, &split.k);
break; break;
...@@ -1259,8 +1256,8 @@ void bch2_insert_fixup_extent(struct btree_trans *trans, ...@@ -1259,8 +1256,8 @@ void bch2_insert_fixup_extent(struct btree_trans *trans,
btree_account_key_drop(l->b, _k); btree_account_key_drop(l->b, _k);
_k->type = KEY_TYPE_discard; _k->type = KEY_TYPE_discard;
reserve_whiteout(l->b, _k); reserve_whiteout(l->b, _k);
bch2_btree_node_iter_fix(iter, l->b, &l->iter, bch2_btree_iter_fix_key_modified(iter,
_k, _k->u64s, _k->u64s); l->b, _k);
} }
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment