Commit bbd8d203 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: BTREE_ITER_SLOTS isn't a type of btree iter

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent ef9f95ba
...@@ -473,7 +473,7 @@ static void __bch2_btree_iter_verify(struct btree_iter *iter, ...@@ -473,7 +473,7 @@ static void __bch2_btree_iter_verify(struct btree_iter *iter,
} }
BUG_ON(iter->uptodate == BTREE_ITER_UPTODATE && BUG_ON(iter->uptodate == BTREE_ITER_UPTODATE &&
(iter->flags & BTREE_ITER_TYPE) == BTREE_ITER_KEYS && btree_iter_type(iter) == BTREE_ITER_KEYS &&
!bkey_whiteout(&iter->k) && !bkey_whiteout(&iter->k) &&
bch2_btree_node_iter_end(&l->iter)); bch2_btree_node_iter_end(&l->iter));
} }
...@@ -1152,6 +1152,7 @@ static inline void bch2_btree_iter_checks(struct btree_iter *iter, ...@@ -1152,6 +1152,7 @@ static inline void bch2_btree_iter_checks(struct btree_iter *iter,
EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) !=
(btree_node_type_is_extents(iter->btree_id) && (btree_node_type_is_extents(iter->btree_id) &&
type != BTREE_ITER_NODES)); type != BTREE_ITER_NODES));
EBUG_ON(btree_iter_type(iter) != type);
bch2_btree_trans_verify_locks(iter->trans); bch2_btree_trans_verify_locks(iter->trans);
} }
...@@ -1661,7 +1662,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) ...@@ -1661,7 +1662,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
{ {
int ret; int ret;
bch2_btree_iter_checks(iter, BTREE_ITER_SLOTS); bch2_btree_iter_checks(iter, BTREE_ITER_KEYS);
if (iter->uptodate == BTREE_ITER_UPTODATE) if (iter->uptodate == BTREE_ITER_UPTODATE)
return btree_iter_peek_uptodate(iter); return btree_iter_peek_uptodate(iter);
...@@ -1675,7 +1676,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) ...@@ -1675,7 +1676,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *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_SLOTS); bch2_btree_iter_checks(iter, BTREE_ITER_KEYS);
iter->pos = btree_type_successor(iter->btree_id, iter->k.p); iter->pos = btree_type_successor(iter->btree_id, iter->k.p);
...@@ -1830,7 +1831,7 @@ static int bch2_trans_realloc_iters(struct btree_trans *trans, ...@@ -1830,7 +1831,7 @@ static int bch2_trans_realloc_iters(struct btree_trans *trans,
return 0; return 0;
} }
static int btree_trans_iter_alloc(struct btree_trans *trans) static struct btree_iter *btree_trans_iter_alloc(struct btree_trans *trans)
{ {
unsigned idx = __ffs64(~trans->iters_linked); unsigned idx = __ffs64(~trans->iters_linked);
...@@ -1840,7 +1841,7 @@ static int btree_trans_iter_alloc(struct btree_trans *trans) ...@@ -1840,7 +1841,7 @@ static int btree_trans_iter_alloc(struct btree_trans *trans)
if (trans->nr_iters == trans->size) { if (trans->nr_iters == trans->size) {
int ret = bch2_trans_realloc_iters(trans, trans->size * 2); int ret = bch2_trans_realloc_iters(trans, trans->size * 2);
if (ret) if (ret)
return ret; return ERR_PTR(ret);
} }
idx = trans->nr_iters++; idx = trans->nr_iters++;
...@@ -1850,7 +1851,7 @@ static int btree_trans_iter_alloc(struct btree_trans *trans) ...@@ -1850,7 +1851,7 @@ static int btree_trans_iter_alloc(struct btree_trans *trans)
got_slot: got_slot:
BUG_ON(trans->iters_linked & (1ULL << idx)); BUG_ON(trans->iters_linked & (1ULL << idx));
trans->iters_linked |= 1ULL << idx; trans->iters_linked |= 1ULL << idx;
return idx; return &trans->iters[idx];
} }
static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans, static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
...@@ -1858,37 +1859,29 @@ static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans, ...@@ -1858,37 +1859,29 @@ static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
unsigned flags, u64 iter_id) unsigned flags, u64 iter_id)
{ {
struct btree_iter *iter; struct btree_iter *iter;
int idx;
BUG_ON(trans->nr_iters > BTREE_ITER_MAX); BUG_ON(trans->nr_iters > BTREE_ITER_MAX);
for (idx = 0; idx < trans->nr_iters; idx++) { trans_for_each_iter(trans, iter)
if (!(trans->iters_linked & (1ULL << idx)))
continue;
iter = &trans->iters[idx];
if (iter_id if (iter_id
? iter->id == iter_id ? iter->id == iter_id
: (iter->btree_id == btree_id && : (iter->btree_id == btree_id &&
!bkey_cmp(iter->pos, pos))) !bkey_cmp(iter->pos, pos)))
goto found; goto found;
}
idx = -1; iter = NULL;
found: found:
if (idx < 0) { if (!iter) {
idx = btree_trans_iter_alloc(trans); iter = btree_trans_iter_alloc(trans);
if (idx < 0) if (IS_ERR(iter))
return ERR_PTR(idx); return iter;
iter = &trans->iters[idx];
iter->id = iter_id; iter->id = iter_id;
bch2_btree_iter_init(trans, iter, btree_id, pos, flags); bch2_btree_iter_init(trans, iter, btree_id, pos, flags);
} else { } else {
iter = &trans->iters[idx]; iter->flags &= ~(BTREE_ITER_SLOTS|BTREE_ITER_INTENT|BTREE_ITER_PREFETCH);
iter->flags |= flags & (BTREE_ITER_SLOTS|BTREE_ITER_INTENT|BTREE_ITER_PREFETCH);
iter->flags &= ~(BTREE_ITER_INTENT|BTREE_ITER_PREFETCH);
iter->flags |= flags & (BTREE_ITER_INTENT|BTREE_ITER_PREFETCH);
if ((iter->flags & BTREE_ITER_INTENT) && if ((iter->flags & BTREE_ITER_INTENT) &&
!bch2_btree_iter_upgrade(iter, 1)) { !bch2_btree_iter_upgrade(iter, 1)) {
...@@ -1898,9 +1891,9 @@ static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans, ...@@ -1898,9 +1891,9 @@ static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
} }
BUG_ON(iter->btree_id != btree_id); BUG_ON(iter->btree_id != btree_id);
BUG_ON(trans->iters_live & (1ULL << idx)); BUG_ON(trans->iters_live & (1ULL << iter->idx));
trans->iters_live |= 1ULL << idx; trans->iters_live |= 1ULL << iter->idx;
trans->iters_touched |= 1ULL << idx; trans->iters_touched |= 1ULL << iter->idx;
BUG_ON(iter->btree_id != btree_id); BUG_ON(iter->btree_id != btree_id);
BUG_ON((iter->flags ^ flags) & BTREE_ITER_TYPE); BUG_ON((iter->flags ^ flags) & BTREE_ITER_TYPE);
...@@ -1950,29 +1943,26 @@ struct btree_iter *bch2_trans_copy_iter(struct btree_trans *trans, ...@@ -1950,29 +1943,26 @@ struct btree_iter *bch2_trans_copy_iter(struct btree_trans *trans,
struct btree_iter *src) struct btree_iter *src)
{ {
struct btree_iter *iter; struct btree_iter *iter;
unsigned offset = offsetof(struct btree_iter, trans); int idx, i;
int i, idx;
idx = btree_trans_iter_alloc(trans); iter = btree_trans_iter_alloc(trans);
if (idx < 0) if (IS_ERR(iter))
return ERR_PTR(idx); return iter;
idx = iter->idx;
*iter = *src;
iter->idx = idx;
trans->iters_live |= 1ULL << idx; trans->iters_live |= 1ULL << idx;
trans->iters_touched |= 1ULL << idx; trans->iters_touched |= 1ULL << idx;
trans->iters_unlink_on_restart |= 1ULL << idx; trans->iters_unlink_on_restart |= 1ULL << idx;
iter = &trans->iters[idx];
memcpy((void *) iter + offset,
(void *) src + offset,
sizeof(*iter) - offset);
for (i = 0; i < BTREE_MAX_DEPTH; i++) for (i = 0; i < BTREE_MAX_DEPTH; i++)
if (btree_node_locked(iter, i)) if (btree_node_locked(iter, i))
six_lock_increment(&iter->l[i].b->c.lock, six_lock_increment(&iter->l[i].b->c.lock,
__btree_lock_want(iter, i)); __btree_lock_want(iter, i));
return &trans->iters[idx]; return iter;
} }
static int bch2_trans_preload_mem(struct btree_trans *trans, size_t size) static int bch2_trans_preload_mem(struct btree_trans *trans, size_t size)
......
...@@ -183,20 +183,20 @@ struct btree_node_iter { ...@@ -183,20 +183,20 @@ struct btree_node_iter {
enum btree_iter_type { enum btree_iter_type {
BTREE_ITER_KEYS, BTREE_ITER_KEYS,
BTREE_ITER_SLOTS,
BTREE_ITER_NODES, BTREE_ITER_NODES,
}; };
#define BTREE_ITER_TYPE ((1 << 2) - 1) #define BTREE_ITER_TYPE ((1 << 2) - 1)
#define BTREE_ITER_INTENT (1 << 2) #define BTREE_ITER_SLOTS (1 << 2)
#define BTREE_ITER_PREFETCH (1 << 3) #define BTREE_ITER_INTENT (1 << 3)
#define BTREE_ITER_PREFETCH (1 << 4)
/* /*
* Used in bch2_btree_iter_traverse(), to indicate whether we're searching for * Used in bch2_btree_iter_traverse(), to indicate whether we're searching for
* @pos or the first key strictly greater than @pos * @pos or the first key strictly greater than @pos
*/ */
#define BTREE_ITER_IS_EXTENTS (1 << 4) #define BTREE_ITER_IS_EXTENTS (1 << 5)
#define BTREE_ITER_ERROR (1 << 5) #define BTREE_ITER_ERROR (1 << 6)
enum btree_iter_uptodate { enum btree_iter_uptodate {
BTREE_ITER_UPTODATE = 0, BTREE_ITER_UPTODATE = 0,
...@@ -241,6 +241,11 @@ struct btree_iter { ...@@ -241,6 +241,11 @@ struct btree_iter {
u64 id; u64 id;
}; };
static inline enum btree_iter_type btree_iter_type(struct btree_iter *iter)
{
return iter->flags & BTREE_ITER_TYPE;
}
struct deferred_update { struct deferred_update {
struct journal_preres res; struct journal_preres res;
struct journal_entry_pin journal; struct journal_entry_pin journal;
......
...@@ -447,10 +447,9 @@ static int bchfs_write_index_update(struct bch_write_op *wop) ...@@ -447,10 +447,9 @@ static int bchfs_write_index_update(struct bch_write_op *wop)
bch2_trans_init(&trans, c, BTREE_ITER_MAX, 1024); bch2_trans_init(&trans, c, BTREE_ITER_MAX, 1024);
iter = bch2_trans_get_iter(&trans, iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS,
BTREE_ID_EXTENTS, bkey_start_pos(&k->k),
bkey_start_pos(&k->k), BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
BTREE_ITER_INTENT);
do { do {
BKEY_PADDED(k) tmp; BKEY_PADDED(k) tmp;
......
...@@ -1417,8 +1417,8 @@ static void bch2_rbio_narrow_crcs(struct bch_read_bio *rbio) ...@@ -1417,8 +1417,8 @@ static void bch2_rbio_narrow_crcs(struct bch_read_bio *rbio)
bch2_trans_begin(&trans); bch2_trans_begin(&trans);
iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, rbio->pos, iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, rbio->pos,
BTREE_ITER_INTENT); BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
k = bch2_btree_iter_peek(iter); k = bch2_btree_iter_peek_slot(iter);
if (IS_ERR_OR_NULL(k.k)) if (IS_ERR_OR_NULL(k.k))
goto out; goto out;
......
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