Skip to content

Commit 43b9fec

Browse files
author
Kent Overstreet
committed
bcachefs: Fix set_should_be_locked() call in peek_slot()
set_should_be_locked() needs to be called before peek_key_cache(), which traverses other paths and may do a trans unlock/relock. This fixes an assertion pop in path_peek_slot(), when the path we're using is unexpectedly not uptodate. Signed-off-by: Kent Overstreet <[email protected]>
1 parent 61198e6 commit 43b9fec

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

fs/bcachefs/btree_iter.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,7 +2749,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
27492749
ret = trans_maybe_inject_restart(trans, _RET_IP_);
27502750
if (unlikely(ret)) {
27512751
k = bkey_s_c_err(ret);
2752-
goto out_no_locked;
2752+
goto out;
27532753
}
27542754

27552755
/* extents can't span inode numbers: */
@@ -2769,13 +2769,15 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
27692769
ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
27702770
if (unlikely(ret)) {
27712771
k = bkey_s_c_err(ret);
2772-
goto out_no_locked;
2772+
goto out;
27732773
}
27742774

27752775
struct btree_path *path = btree_iter_path(trans, iter);
27762776
if (unlikely(!btree_path_node(path, path->level)))
27772777
return bkey_s_c_null;
27782778

2779+
btree_path_set_should_be_locked(trans, path);
2780+
27792781
if ((iter->flags & BTREE_ITER_cached) ||
27802782
!(iter->flags & (BTREE_ITER_is_extents|BTREE_ITER_filter_snapshots))) {
27812783
k = bkey_s_c_null;
@@ -2796,12 +2798,12 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
27962798
if (!bkey_err(k))
27972799
iter->k = *k.k;
27982800
/* We're not returning a key from iter->path: */
2799-
goto out_no_locked;
2801+
goto out;
28002802
}
28012803

2802-
k = bch2_btree_path_peek_slot(trans->paths + iter->path, &iter->k);
2804+
k = bch2_btree_path_peek_slot(btree_iter_path(trans, iter), &iter->k);
28032805
if (unlikely(!k.k))
2804-
goto out_no_locked;
2806+
goto out;
28052807

28062808
if (unlikely(k.k->type == KEY_TYPE_whiteout &&
28072809
(iter->flags & BTREE_ITER_filter_snapshots) &&
@@ -2839,7 +2841,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
28392841
}
28402842

28412843
if (unlikely(bkey_err(k)))
2842-
goto out_no_locked;
2844+
goto out;
28432845

28442846
next = k.k ? bkey_start_pos(k.k) : POS_MAX;
28452847

@@ -2861,8 +2863,6 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
28612863
}
28622864
}
28632865
out:
2864-
btree_path_set_should_be_locked(trans, btree_iter_path(trans, iter));
2865-
out_no_locked:
28662866
bch2_btree_iter_verify_entry_exit(iter);
28672867
bch2_btree_iter_verify(trans, iter);
28682868
ret = bch2_btree_iter_verify_ret(trans, iter, k);

0 commit comments

Comments
 (0)