Lines Matching refs:i
46 static void verify_update_old_key(struct btree_trans *trans, struct btree_insert_entry *i) in verify_update_old_key() argument
51 struct bkey_s_c k = bch2_btree_path_peek_slot_exact(trans->paths + i->path, &u); in verify_update_old_key()
55 bch2_journal_keys_peek_slot(c, i->btree_id, i->level, i->k->k.p); in verify_update_old_key()
62 u.needs_whiteout = i->old_k.needs_whiteout; in verify_update_old_key()
64 BUG_ON(memcmp(&i->old_k, &u, sizeof(struct bkey))); in verify_update_old_key()
65 BUG_ON(i->old_v != k.v); in verify_update_old_key()
69 …c inline struct btree_path_level *insert_l(struct btree_trans *trans, struct btree_insert_entry *i) in insert_l() argument
71 return (trans->paths + i->path)->l + i->level; in insert_l()
75 struct btree_insert_entry *i) in same_leaf_as_prev() argument
77 return i != trans->updates && in same_leaf_as_prev()
78 insert_l(trans, &i[0])->b == insert_l(trans, &i[-1])->b; in same_leaf_as_prev()
82 struct btree_insert_entry *i) in same_leaf_as_next() argument
84 return i + 1 < trans->updates + trans->nr_updates && in same_leaf_as_next()
85 insert_l(trans, &i[0])->b == insert_l(trans, &i[1])->b; in same_leaf_as_next()
106 static noinline int trans_lock_write_fail(struct btree_trans *trans, struct btree_insert_entry *i) in trans_lock_write_fail() argument
108 while (--i >= trans->updates) { in trans_lock_write_fail()
109 if (same_leaf_as_prev(trans, i)) in trans_lock_write_fail()
112 bch2_btree_node_unlock_write(trans, trans->paths + i->path, insert_l(trans, i)->b); in trans_lock_write_fail()
123 trans_for_each_update(trans, i) { in bch2_trans_lock_write()
124 if (same_leaf_as_prev(trans, i)) in bch2_trans_lock_write()
127 if (bch2_btree_node_lock_write(trans, trans->paths + i->path, &insert_l(trans, i)->b->c)) in bch2_trans_lock_write()
128 return trans_lock_write_fail(trans, i); in bch2_trans_lock_write()
130 if (!i->cached) in bch2_trans_lock_write()
131 bch2_btree_node_prep_for_write(trans, trans->paths + i->path, insert_l(trans, i)->b); in bch2_trans_lock_write()
141 trans_for_each_update(trans, i) in bch2_trans_unlock_updates_write()
142 if (btree_node_locked_type(trans->paths + i->path, i->level) == in bch2_trans_unlock_updates_write()
145 trans->paths + i->path, insert_l(trans, i)->b); in bch2_trans_unlock_updates_write()
230 unsigned i, u64 seq) in __btree_node_flush() argument
234 struct btree *b = container_of(w, struct btree, writes[i]); in __btree_node_flush()
298 struct bset *i = bset(b, t); in bch2_btree_insert_key_leaf() local
307 i->journal_seq = cpu_to_le64(max(journal_seq, le64_to_cpu(i->journal_seq))); in bch2_btree_insert_key_leaf()
334 struct btree_insert_entry *i) in btree_insert_entry_checks() argument
336 struct btree_path *path = trans->paths + i->path; in btree_insert_entry_checks()
338 BUG_ON(!bpos_eq(i->k->k.p, path->pos)); in btree_insert_entry_checks()
339 BUG_ON(i->cached != path->cached); in btree_insert_entry_checks()
340 BUG_ON(i->level != path->level); in btree_insert_entry_checks()
341 BUG_ON(i->btree_id != path->btree_id); in btree_insert_entry_checks()
342 BUG_ON(i->bkey_type != __btree_node_type(path->level, path->btree_id)); in btree_insert_entry_checks()
343 EBUG_ON(!i->level && in btree_insert_entry_checks()
344 btree_type_has_snapshots(i->btree_id) && in btree_insert_entry_checks()
345 !(i->flags & BTREE_UPDATE_internal_snapshot_node) && in btree_insert_entry_checks()
347 i->k->k.p.snapshot && in btree_insert_entry_checks()
348 bch2_snapshot_is_internal_node(trans->c, i->k->k.p.snapshot) > 0); in btree_insert_entry_checks()
412 trans_for_each_update(trans, i) in btree_key_can_insert_cached_slowpath()
413 if (i->old_v == &ck->k->v) in btree_key_can_insert_cached_slowpath()
414 i->old_v = &new_k->v; in btree_key_can_insert_cached_slowpath()
452 trans_for_each_update(trans, i) in btree_key_can_insert_cached()
453 if (i->old_v == &ck->k->v) in btree_key_can_insert_cached()
454 i->old_v = &new_k->v; in btree_key_can_insert_cached()
464 struct btree_insert_entry *i, in run_one_mem_trigger() argument
467 verify_update_old_key(trans, i); in run_one_mem_trigger()
472 struct bkey_s_c old = { &i->old_k, i->old_v }; in run_one_mem_trigger()
473 struct bkey_i *new = i->k; in run_one_mem_trigger()
475 const struct bkey_ops *new_ops = bch2_bkey_type_ops(i->k->k.type); in run_one_mem_trigger()
478 return bch2_key_trigger(trans, i->btree_id, i->level, in run_one_mem_trigger()
482 return bch2_key_trigger_new(trans, i->btree_id, i->level, in run_one_mem_trigger()
484 bch2_key_trigger_old(trans, i->btree_id, i->level, in run_one_mem_trigger()
488 static int run_one_trans_trigger(struct btree_trans *trans, struct btree_insert_entry *i) in run_one_trans_trigger() argument
490 verify_update_old_key(trans, i); in run_one_trans_trigger()
492 if ((i->flags & BTREE_TRIGGER_norun) || in run_one_trans_trigger()
493 !btree_node_type_has_trans_triggers(i->bkey_type)) in run_one_trans_trigger()
501 struct bkey old_k = i->old_k; in run_one_trans_trigger()
502 struct bkey_s_c old = { &old_k, i->old_v }; in run_one_trans_trigger()
504 const struct bkey_ops *new_ops = bch2_bkey_type_ops(i->k->k.type); in run_one_trans_trigger()
505 unsigned flags = i->flags|BTREE_TRIGGER_transactional; in run_one_trans_trigger()
507 if (!i->insert_trigger_run && in run_one_trans_trigger()
508 !i->overwrite_trigger_run && in run_one_trans_trigger()
510 i->overwrite_trigger_run = true; in run_one_trans_trigger()
511 i->insert_trigger_run = true; in run_one_trans_trigger()
512 return bch2_key_trigger(trans, i->btree_id, i->level, old, bkey_i_to_s(i->k), in run_one_trans_trigger()
515 } else if (!i->overwrite_trigger_run) { in run_one_trans_trigger()
516 i->overwrite_trigger_run = true; in run_one_trans_trigger()
517 return bch2_key_trigger_old(trans, i->btree_id, i->level, old, flags) ?: 1; in run_one_trans_trigger()
518 } else if (!i->insert_trigger_run) { in run_one_trans_trigger()
519 i->insert_trigger_run = true; in run_one_trans_trigger()
520 return bch2_key_trigger_new(trans, i->btree_id, i->level, bkey_i_to_s(i->k), flags) ?: 1; in run_one_trans_trigger()
531 unsigned i, sort_id = trans->updates[sort_id_start].sort_order; in bch2_trans_commit_run_triggers() local
546 for (i = sort_id_start; in bch2_trans_commit_run_triggers()
547 i < trans->nr_updates && trans->updates[i].sort_order <= sort_id; in bch2_trans_commit_run_triggers()
548 i++) { in bch2_trans_commit_run_triggers()
549 if (trans->updates[i].sort_order < sort_id) { in bch2_trans_commit_run_triggers()
550 sort_id_start = i; in bch2_trans_commit_run_triggers()
554 int ret = run_one_trans_trigger(trans, trans->updates + i); in bch2_trans_commit_run_triggers()
562 sort_id_start = i; in bch2_trans_commit_run_triggers()
566 trans_for_each_update(trans, i) in bch2_trans_commit_run_triggers()
567 BUG_ON(!(i->flags & BTREE_TRIGGER_norun) && in bch2_trans_commit_run_triggers()
568 btree_node_type_has_trans_triggers(i->bkey_type) && in bch2_trans_commit_run_triggers()
569 (!i->insert_trigger_run || !i->overwrite_trigger_run)); in bch2_trans_commit_run_triggers()
576 trans_for_each_update(trans, i) in bch2_trans_commit_run_gc_triggers()
577 if (btree_node_type_has_triggers(i->bkey_type) && in bch2_trans_commit_run_gc_triggers()
578 gc_visited(trans->c, gc_pos_btree(i->btree_id, i->level, i->k->k.p))) { in bch2_trans_commit_run_gc_triggers()
579 int ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_gc); in bch2_trans_commit_run_gc_triggers()
613 trans_for_each_update(trans, i) { in bch2_trans_commit_write_locked()
615 if (!same_leaf_as_prev(trans, i)) in bch2_trans_commit_write_locked()
618 u64s += i->k->k.u64s; in bch2_trans_commit_write_locked()
619 ret = !i->cached in bch2_trans_commit_write_locked()
620 ? btree_key_can_insert(trans, insert_l(trans, i)->b, u64s) in bch2_trans_commit_write_locked()
621 : btree_key_can_insert_cached(trans, flags, trans->paths + i->path, u64s); in bch2_trans_commit_write_locked()
623 *stopped_at = i; in bch2_trans_commit_write_locked()
627 i->k->k.needs_whiteout = false; in bch2_trans_commit_write_locked()
653 trans_for_each_update(trans, i) in bch2_trans_commit_write_locked()
654 i->k->k.bversion.lo = trans->journal_res.seq; in bch2_trans_commit_write_locked()
656 trans_for_each_update(trans, i) in bch2_trans_commit_write_locked()
657 i->k->k.bversion = MAX_VERSION; in bch2_trans_commit_write_locked()
684 trans_for_each_update(trans, i) in bch2_trans_commit_write_locked()
685 if (btree_node_type_has_atomic_triggers(i->bkey_type)) { in bch2_trans_commit_write_locked()
686 ret = run_one_mem_trigger(trans, i, BTREE_TRIGGER_atomic|i->flags); in bch2_trans_commit_write_locked()
702 for (struct jset_entry *i = btree_trans_journal_entries_start(trans); in bch2_trans_commit_write_locked() local
703 i != btree_trans_journal_entries_top(trans); in bch2_trans_commit_write_locked()
704 i = vstruct_next(i)) { in bch2_trans_commit_write_locked()
705 ret = bch2_journal_entry_validate(c, NULL, i, in bch2_trans_commit_write_locked()
715 trans_for_each_update(trans, i) { in bch2_trans_commit_write_locked()
716 validate_context.level = i->level; in bch2_trans_commit_write_locked()
717 validate_context.btree = i->btree_id; in bch2_trans_commit_write_locked()
719 ret = bch2_bkey_validate(c, bkey_i_to_s_c(i->k), validate_context); in bch2_trans_commit_write_locked()
722 trans->fn, (void *) i->ip_allocated); in bch2_trans_commit_write_locked()
725 btree_insert_entry_checks(trans, i); in bch2_trans_commit_write_locked()
732 trans_for_each_update(trans, i) { in bch2_trans_commit_write_locked()
733 if (i->key_cache_already_flushed) in bch2_trans_commit_write_locked()
736 if (i->flags & BTREE_UPDATE_nojournal) in bch2_trans_commit_write_locked()
739 verify_update_old_key(trans, i); in bch2_trans_commit_write_locked()
744 i->btree_id, i->level, in bch2_trans_commit_write_locked()
745 i->old_k.u64s); in bch2_trans_commit_write_locked()
747 (struct bkey_s_c) { &i->old_k, i->old_v }); in bch2_trans_commit_write_locked()
752 i->btree_id, i->level, in bch2_trans_commit_write_locked()
753 i->k->k.u64s); in bch2_trans_commit_write_locked()
754 bkey_copy((struct bkey_i *) entry->start, i->k); in bch2_trans_commit_write_locked()
777 trans_for_each_update(trans, i) { in bch2_trans_commit_write_locked()
778 struct btree_path *path = trans->paths + i->path; in bch2_trans_commit_write_locked()
780 if (!i->cached) in bch2_trans_commit_write_locked()
781 bch2_btree_insert_key_leaf(trans, path, i->k, trans->journal_res.seq); in bch2_trans_commit_write_locked()
782 else if (!i->key_cache_already_flushed) in bch2_trans_commit_write_locked()
783 bch2_btree_insert_key_cached(trans, flags, i); in bch2_trans_commit_write_locked()
793 for (struct bkey_i *i = btree_trans_subbuf_base(trans, &trans->accounting); in bch2_trans_commit_write_locked() local
794 i != accounting; in bch2_trans_commit_write_locked()
795 i = bkey_next(i)) in bch2_trans_commit_write_locked()
796 bch2_accounting_trans_commit_revert(trans, bkey_i_to_accounting(i), flags); in bch2_trans_commit_write_locked()
809 trans_for_each_update(trans, i) in bch2_drop_overwrites_from_journal()
810 if (i->k->k.type != KEY_TYPE_accounting) in bch2_drop_overwrites_from_journal()
811 bch2_journal_key_overwritten(trans->c, i->btree_id, i->level, i->k->k.p); in bch2_drop_overwrites_from_journal()
831 struct btree_insert_entry *i = trans->updates + idx; in do_bch2_trans_commit() local
832 if (i->cached) in do_bch2_trans_commit()
835 u64s_delta += !bkey_deleted(&i->k->k) ? i->k->k.u64s : 0; in do_bch2_trans_commit()
836 u64s_delta -= i->old_btree_u64s; in do_bch2_trans_commit()
838 if (!same_leaf_as_next(trans, i)) { in do_bch2_trans_commit()
840 ret = bch2_foreground_maybe_merge(trans, i->path, in do_bch2_trans_commit()
841 i->level, flags); in do_bch2_trans_commit()
888 struct btree_insert_entry *i, in bch2_trans_commit_error() argument
914 ret = bch2_btree_split_leaf(trans, i->path, flags); in bch2_trans_commit_error()
917 trace_ip, trans->paths + i->path); in bch2_trans_commit_error()
965 trans_for_each_update(trans, i) { in do_bch2_trans_commit_to_journal_replay()
966 int ret = bch2_journal_key_insert(c, i->btree_id, i->level, i->k); in do_bch2_trans_commit_to_journal_replay()
971 for (struct jset_entry *i = btree_trans_journal_entries_start(trans); in do_bch2_trans_commit_to_journal_replay() local
972 i != btree_trans_journal_entries_top(trans); in do_bch2_trans_commit_to_journal_replay()
973 i = vstruct_next(i)) { in do_bch2_trans_commit_to_journal_replay()
974 if (i->type == BCH_JSET_ENTRY_btree_keys || in do_bch2_trans_commit_to_journal_replay()
975 i->type == BCH_JSET_ENTRY_write_buffer_keys) { in do_bch2_trans_commit_to_journal_replay()
976 jset_entry_for_each_key(i, k) { in do_bch2_trans_commit_to_journal_replay()
977 int ret = bch2_journal_key_insert(c, i->btree_id, i->level, k); in do_bch2_trans_commit_to_journal_replay()
983 if (i->type == BCH_JSET_ENTRY_btree_root) { in do_bch2_trans_commit_to_journal_replay()
986 struct btree_root *r = bch2_btree_id_root(c, i->btree_id); in do_bch2_trans_commit_to_journal_replay()
988 bkey_copy(&r->key, i->start); in do_bch2_trans_commit_to_journal_replay()
989 r->level = i->level; in do_bch2_trans_commit_to_journal_replay()
994 for (struct bkey_i *i = btree_trans_subbuf_base(trans, &trans->accounting); in do_bch2_trans_commit_to_journal_replay() local
995 i != btree_trans_subbuf_top(trans, &trans->accounting); in do_bch2_trans_commit_to_journal_replay()
996 i = bkey_next(i)) { in do_bch2_trans_commit_to_journal_replay()
997 int ret = bch2_journal_key_insert(c, BTREE_ID_accounting, 0, i); in do_bch2_trans_commit_to_journal_replay()
1043 trans_for_each_update(trans, i) { in __bch2_trans_commit()
1044 struct btree_path *path = trans->paths + i->path; in __bch2_trans_commit()
1048 ret = bch2_btree_path_upgrade(trans, path, i->level + 1); in __bch2_trans_commit()
1052 EBUG_ON(!btree_node_intent_locked(path, i->level)); in __bch2_trans_commit()
1054 if (i->key_cache_already_flushed) in __bch2_trans_commit()
1057 if (i->flags & BTREE_UPDATE_nojournal) in __bch2_trans_commit()
1061 journal_u64s += jset_u64s(i->k->k.u64s); in __bch2_trans_commit()
1065 journal_u64s += jset_u64s(i->old_k.u64s); in __bch2_trans_commit()