Lines Matching refs:iter

204 static void journal_iter_verify(struct journal_iter *iter)  in journal_iter_verify()  argument
207 struct journal_keys *keys = iter->keys; in journal_iter_verify()
210 BUG_ON(iter->idx >= keys->gap && in journal_iter_verify()
211 iter->idx < keys->gap + gap_size); in journal_iter_verify()
213 if (iter->idx < keys->size) { in journal_iter_verify()
214 struct journal_key *k = keys->data + iter->idx; in journal_iter_verify()
216 int cmp = __journal_key_btree_cmp(iter->btree_id, iter->level, k); in journal_iter_verify()
228 struct journal_iter *iter; in journal_iters_fix() local
236 list_for_each_entry(iter, &c->journal_iters, list) { in journal_iters_fix()
237 journal_iter_verify(iter); in journal_iters_fix()
238 if (iter->idx == gap_end && in journal_iters_fix()
239 new_key->btree_id == iter->btree_id && in journal_iters_fix()
240 new_key->level == iter->level) in journal_iters_fix()
241 iter->idx = keys->gap - 1; in journal_iters_fix()
242 journal_iter_verify(iter); in journal_iters_fix()
249 struct journal_iter *iter; in journal_iters_move_gap() local
252 list_for_each_entry(iter, &c->journal_iters, list) { in journal_iters_move_gap()
253 if (iter->idx > old_gap) in journal_iters_move_gap()
254 iter->idx -= gap_size; in journal_iters_move_gap()
255 if (iter->idx >= new_gap) in journal_iters_move_gap()
256 iter->idx += gap_size; in journal_iters_move_gap()
459 static void bch2_journal_iter_advance(struct journal_iter *iter) in bch2_journal_iter_advance() argument
461 if (iter->idx < iter->keys->size) { in bch2_journal_iter_advance()
462 iter->idx++; in bch2_journal_iter_advance()
463 if (iter->idx == iter->keys->gap) in bch2_journal_iter_advance()
464 iter->idx += iter->keys->size - iter->keys->nr; in bch2_journal_iter_advance()
468 static struct bkey_s_c bch2_journal_iter_peek(struct journal_iter *iter) in bch2_journal_iter_peek() argument
470 journal_iter_verify(iter); in bch2_journal_iter_peek()
473 while (iter->idx < iter->keys->size) { in bch2_journal_iter_peek()
474 struct journal_key *k = iter->keys->data + iter->idx; in bch2_journal_iter_peek()
476 int cmp = __journal_key_btree_cmp(iter->btree_id, iter->level, k); in bch2_journal_iter_peek()
485 iter->idx = idx_to_pos(iter->keys, rcu_dereference(k->overwritten_range)->end); in bch2_journal_iter_peek()
487 bch2_journal_iter_advance(iter); in bch2_journal_iter_peek()
493 static void bch2_journal_iter_exit(struct journal_iter *iter) in bch2_journal_iter_exit() argument
495 list_del(&iter->list); in bch2_journal_iter_exit()
499 struct journal_iter *iter, in bch2_journal_iter_init() argument
503 iter->btree_id = id; in bch2_journal_iter_init()
504 iter->level = level; in bch2_journal_iter_init()
505 iter->keys = &c->journal_keys; in bch2_journal_iter_init()
506 iter->idx = bch2_journal_key_search(&c->journal_keys, id, level, pos); in bch2_journal_iter_init()
508 journal_iter_verify(iter); in bch2_journal_iter_init()
511 static struct bkey_s_c bch2_journal_iter_peek_btree(struct btree_and_journal_iter *iter) in bch2_journal_iter_peek_btree() argument
513 return bch2_btree_node_iter_peek_unpack(&iter->node_iter, in bch2_journal_iter_peek_btree()
514 iter->b, &iter->unpacked); in bch2_journal_iter_peek_btree()
517 static void bch2_journal_iter_advance_btree(struct btree_and_journal_iter *iter) in bch2_journal_iter_advance_btree() argument
519 bch2_btree_node_iter_advance(&iter->node_iter, iter->b); in bch2_journal_iter_advance_btree()
522 void bch2_btree_and_journal_iter_advance(struct btree_and_journal_iter *iter) in bch2_btree_and_journal_iter_advance() argument
524 if (bpos_eq(iter->pos, SPOS_MAX)) in bch2_btree_and_journal_iter_advance()
525 iter->at_end = true; in bch2_btree_and_journal_iter_advance()
527 iter->pos = bpos_successor(iter->pos); in bch2_btree_and_journal_iter_advance()
532 struct btree_and_journal_iter iter = *_iter; in btree_and_journal_iter_prefetch() local
533 struct bch_fs *c = iter.trans->c; in btree_and_journal_iter_prefetch()
534 unsigned level = iter.journal.level; in btree_and_journal_iter_prefetch()
540 iter.prefetch = false; in btree_and_journal_iter_prefetch()
541 iter.fail_if_too_many_whiteouts = true; in btree_and_journal_iter_prefetch()
545 bch2_btree_and_journal_iter_advance(&iter); in btree_and_journal_iter_prefetch()
546 struct bkey_s_c k = bch2_btree_and_journal_iter_peek(&iter); in btree_and_journal_iter_prefetch()
551 bch2_btree_node_prefetch(iter.trans, NULL, tmp.k, iter.journal.btree_id, level - 1); in btree_and_journal_iter_prefetch()
557 struct bkey_s_c bch2_btree_and_journal_iter_peek(struct btree_and_journal_iter *iter) in bch2_btree_and_journal_iter_peek() argument
562 if (iter->prefetch && iter->journal.level) in bch2_btree_and_journal_iter_peek()
563 btree_and_journal_iter_prefetch(iter); in bch2_btree_and_journal_iter_peek()
565 if (iter->at_end) in bch2_btree_and_journal_iter_peek()
570 if (iters > 20 && iter->fail_if_too_many_whiteouts) in bch2_btree_and_journal_iter_peek()
573 while ((btree_k = bch2_journal_iter_peek_btree(iter)).k && in bch2_btree_and_journal_iter_peek()
574 bpos_lt(btree_k.k->p, iter->pos)) in bch2_btree_and_journal_iter_peek()
575 bch2_journal_iter_advance_btree(iter); in bch2_btree_and_journal_iter_peek()
577 if (iter->trans->journal_replay_not_finished) in bch2_btree_and_journal_iter_peek()
578 while ((journal_k = bch2_journal_iter_peek(&iter->journal)).k && in bch2_btree_and_journal_iter_peek()
579 bpos_lt(journal_k.k->p, iter->pos)) in bch2_btree_and_journal_iter_peek()
580 bch2_journal_iter_advance(&iter->journal); in bch2_btree_and_journal_iter_peek()
587 if (ret.k && iter->b && bpos_gt(ret.k->p, iter->b->data->max_key)) in bch2_btree_and_journal_iter_peek()
591 iter->pos = ret.k->p; in bch2_btree_and_journal_iter_peek()
593 bch2_btree_and_journal_iter_advance(iter); in bch2_btree_and_journal_iter_peek()
597 iter->pos = SPOS_MAX; in bch2_btree_and_journal_iter_peek()
598 iter->at_end = true; in bch2_btree_and_journal_iter_peek()
604 void bch2_btree_and_journal_iter_exit(struct btree_and_journal_iter *iter) in bch2_btree_and_journal_iter_exit() argument
606 bch2_journal_iter_exit(&iter->journal); in bch2_btree_and_journal_iter_exit()
610 struct btree_and_journal_iter *iter, in __bch2_btree_and_journal_iter_init_node_iter() argument
615 memset(iter, 0, sizeof(*iter)); in __bch2_btree_and_journal_iter_init_node_iter()
617 iter->trans = trans; in __bch2_btree_and_journal_iter_init_node_iter()
618 iter->b = b; in __bch2_btree_and_journal_iter_init_node_iter()
619 iter->node_iter = node_iter; in __bch2_btree_and_journal_iter_init_node_iter()
620 iter->pos = b->data->min_key; in __bch2_btree_and_journal_iter_init_node_iter()
621 iter->at_end = false; in __bch2_btree_and_journal_iter_init_node_iter()
622 INIT_LIST_HEAD(&iter->journal.list); in __bch2_btree_and_journal_iter_init_node_iter()
625 bch2_journal_iter_init(trans->c, &iter->journal, b->c.btree_id, b->c.level, pos); in __bch2_btree_and_journal_iter_init_node_iter()
627 list_add(&iter->journal.list, &trans->c->journal_iters); in __bch2_btree_and_journal_iter_init_node_iter()
636 struct btree_and_journal_iter *iter, in bch2_btree_and_journal_iter_init_node_iter() argument
642 __bch2_btree_and_journal_iter_init_node_iter(trans, iter, b, node_iter, b->data->min_key); in bch2_btree_and_journal_iter_init_node_iter()
687 struct genradix_iter iter; in bch2_journal_keys_put() local
689 genradix_for_each(&c->journal_entries, iter, i) in bch2_journal_keys_put()
722 struct genradix_iter iter; in bch2_journal_keys_sort() local
729 genradix_for_each(&c->journal_entries, iter, _i) { in bch2_journal_keys_sort()