mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
bcachefs: Fix bch2_btree_path_up_until_good_node()
There was a rare bug when path->locks_want was nonzero, but not BTREE_MAX_DEPTH, where we'd return on a valid node that wasn't locked - oops. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
e0eaf86259
commit
29cea6f483
@ -1030,7 +1030,7 @@ static inline unsigned btree_path_up_until_good_node(struct btree_trans *trans,
|
||||
int check_pos)
|
||||
{
|
||||
unsigned i, l = path->level;
|
||||
|
||||
again:
|
||||
while (btree_path_node(path, l) &&
|
||||
!btree_path_good_node(trans, path, l, check_pos))
|
||||
__btree_path_set_level_up(trans, path, l++);
|
||||
@ -1039,9 +1039,11 @@ static inline unsigned btree_path_up_until_good_node(struct btree_trans *trans,
|
||||
for (i = l + 1;
|
||||
i < path->locks_want && btree_path_node(path, i);
|
||||
i++)
|
||||
if (!bch2_btree_node_relock(trans, path, i))
|
||||
if (!bch2_btree_node_relock(trans, path, i)) {
|
||||
while (l <= i)
|
||||
__btree_path_set_level_up(trans, path, l++);
|
||||
goto again;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user