mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-25 22:29:43 +00:00
bcachefs: Simplify bch2_btree_iter_peek_slot()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
2dac0eae78
commit
c380123988
@ -1595,8 +1595,17 @@ __bch2_btree_iter_peek_slot_extents(struct btree_iter *iter)
|
|||||||
struct bkey n;
|
struct bkey n;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
recheck:
|
/* keys & holes can't span inode numbers: */
|
||||||
btree_iter_advance_to_pos(iter, l, -1);
|
if (iter->pos.offset == KEY_OFFSET_MAX) {
|
||||||
|
if (iter->pos.inode == KEY_INODE_MAX)
|
||||||
|
return bkey_s_c_null;
|
||||||
|
|
||||||
|
bch2_btree_iter_set_pos(iter, bkey_successor(iter->pos));
|
||||||
|
|
||||||
|
ret = bch2_btree_iter_traverse(iter);
|
||||||
|
if (unlikely(ret))
|
||||||
|
return bkey_s_c_err(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iterator is now at the correct position for inserting at iter->pos,
|
* iterator is now at the correct position for inserting at iter->pos,
|
||||||
@ -1610,47 +1619,17 @@ recheck:
|
|||||||
|
|
||||||
if (k.k && bkey_cmp(bkey_start_pos(k.k), iter->pos) <= 0) {
|
if (k.k && bkey_cmp(bkey_start_pos(k.k), iter->pos) <= 0) {
|
||||||
/*
|
/*
|
||||||
* If there wasn't actually a hole, want the iterator to be
|
* We're not setting iter->uptodate because the node iterator
|
||||||
* pointed at the key we found:
|
* doesn't necessarily point at the key we're returning:
|
||||||
*
|
|
||||||
* XXX: actually, we shouldn't be changing the iterator here:
|
|
||||||
* the iterator needs to be correct for inserting at iter->pos,
|
|
||||||
* and there may be whiteouts between iter->pos and what this
|
|
||||||
* iterator points at:
|
|
||||||
*/
|
*/
|
||||||
l->iter = node_iter;
|
|
||||||
|
|
||||||
EBUG_ON(bkey_cmp(k.k->p, iter->pos) <= 0);
|
EBUG_ON(bkey_cmp(k.k->p, iter->pos) <= 0);
|
||||||
iter->uptodate = BTREE_ITER_UPTODATE;
|
|
||||||
|
|
||||||
bch2_btree_iter_verify_level(iter, 0);
|
bch2_btree_iter_verify_level(iter, 0);
|
||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* If we got to the end of the node, check if we need to traverse to the
|
|
||||||
* next node:
|
|
||||||
*/
|
|
||||||
if (unlikely(!k.k && btree_iter_pos_after_node(iter, l->b))) {
|
|
||||||
btree_iter_set_dirty(iter, BTREE_ITER_NEED_TRAVERSE);
|
|
||||||
ret = bch2_btree_iter_traverse(iter);
|
|
||||||
if (unlikely(ret))
|
|
||||||
return bkey_s_c_err(ret);
|
|
||||||
|
|
||||||
goto recheck;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hole */
|
/* hole */
|
||||||
|
|
||||||
/* holes can't span inode numbers: */
|
|
||||||
if (iter->pos.offset == KEY_OFFSET_MAX) {
|
|
||||||
if (iter->pos.inode == KEY_INODE_MAX)
|
|
||||||
return bkey_s_c_null;
|
|
||||||
|
|
||||||
iter->pos = bkey_successor(iter->pos);
|
|
||||||
goto recheck;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!k.k)
|
if (!k.k)
|
||||||
k.k = &l->b->key.k;
|
k.k = &l->b->key.k;
|
||||||
|
|
||||||
@ -1672,11 +1651,20 @@ recheck:
|
|||||||
return (struct bkey_s_c) { &iter->k, NULL };
|
return (struct bkey_s_c) { &iter->k, NULL };
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct bkey_s_c
|
struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
|
||||||
__bch2_btree_iter_peek_slot(struct btree_iter *iter)
|
|
||||||
{
|
{
|
||||||
struct btree_iter_level *l = &iter->l[0];
|
struct btree_iter_level *l = &iter->l[0];
|
||||||
struct bkey_s_c k;
|
struct bkey_s_c k;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
bch2_btree_iter_checks(iter, BTREE_ITER_KEYS);
|
||||||
|
|
||||||
|
if (iter->uptodate == BTREE_ITER_UPTODATE)
|
||||||
|
return btree_iter_peek_uptodate(iter);
|
||||||
|
|
||||||
|
ret = bch2_btree_iter_traverse(iter);
|
||||||
|
if (unlikely(ret))
|
||||||
|
return bkey_s_c_err(ret);
|
||||||
|
|
||||||
if (iter->flags & BTREE_ITER_IS_EXTENTS)
|
if (iter->flags & BTREE_ITER_IS_EXTENTS)
|
||||||
return __bch2_btree_iter_peek_slot_extents(iter);
|
return __bch2_btree_iter_peek_slot_extents(iter);
|
||||||
@ -1697,22 +1685,6 @@ __bch2_btree_iter_peek_slot(struct btree_iter *iter)
|
|||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
bch2_btree_iter_checks(iter, BTREE_ITER_KEYS);
|
|
||||||
|
|
||||||
if (iter->uptodate == BTREE_ITER_UPTODATE)
|
|
||||||
return btree_iter_peek_uptodate(iter);
|
|
||||||
|
|
||||||
ret = bch2_btree_iter_traverse(iter);
|
|
||||||
if (unlikely(ret))
|
|
||||||
return bkey_s_c_err(ret);
|
|
||||||
|
|
||||||
return __bch2_btree_iter_peek_slot(iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct bkey_s_c bch2_btree_iter_next_slot(struct btree_iter *iter)
|
struct bkey_s_c bch2_btree_iter_next_slot(struct btree_iter *iter)
|
||||||
{
|
{
|
||||||
bch2_btree_iter_checks(iter, BTREE_ITER_KEYS);
|
bch2_btree_iter_checks(iter, BTREE_ITER_KEYS);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user