summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-07-12 23:30:08 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-07-16 03:46:14 -0400
commit3f92ebde5a92f7ffca8195713e9286fa1f6e41af (patch)
tree376ab32f857dd95ddb72ff87a42e842e80e88a20
parent821d66df4406ab1be7de8cc79e5ae0ffae265ff0 (diff)
bcachefs: improve bch2_btree_iter_copy()
so as to generate fewer transaction restarts Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_iter.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 097b68e07399..8e7907aafd4d 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -1580,8 +1580,13 @@ void bch2_btree_iter_link(struct btree_iter *iter, struct btree_iter *new)
void bch2_btree_iter_copy(struct btree_iter *dst, struct btree_iter *src)
{
+ unsigned i;
+
__bch2_btree_iter_unlock(dst);
memcpy(dst, src, offsetof(struct btree_iter, next));
- dst->nodes_locked = dst->nodes_intent_locked = 0;
- dst->uptodate = BTREE_ITER_NEED_RELOCK;
+
+ for (i = 0; i < BTREE_MAX_DEPTH; i++)
+ if (btree_node_locked(dst, i))
+ six_lock_increment(&dst->l[i].b->lock,
+ __btree_lock_want(dst, i));
}