Lines Matching refs:trans
104 static noinline int backpointer_mod_err(struct btree_trans *trans, in backpointer_mod_err() argument
110 struct bch_fs *c = trans->c; in backpointer_mod_err()
152 int bch2_bucket_backpointer_mod_nowritebuffer(struct btree_trans *trans, in bch2_bucket_backpointer_mod_nowritebuffer() argument
158 struct bkey_s_c k = bch2_bkey_get_iter(trans, &bp_iter, BTREE_ID_backpointers, in bch2_bucket_backpointer_mod_nowritebuffer()
171 ret = backpointer_mod_err(trans, orig_k, bp, k, insert); in bch2_bucket_backpointer_mod_nowritebuffer()
181 ret = bch2_trans_update(trans, &bp_iter, &bp->k_i, 0); in bch2_bucket_backpointer_mod_nowritebuffer()
183 bch2_trans_iter_exit(trans, &bp_iter); in bch2_bucket_backpointer_mod_nowritebuffer()
187 static int bch2_backpointer_del(struct btree_trans *trans, struct bpos pos) in bch2_backpointer_del() argument
190 ? bch2_btree_delete_at_buffered(trans, BTREE_ID_backpointers, pos) in bch2_backpointer_del()
191 : bch2_btree_delete(trans, BTREE_ID_backpointers, pos, 0)) ?: in bch2_backpointer_del()
192 bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in bch2_backpointer_del()
195 static inline int bch2_backpointers_maybe_flush(struct btree_trans *trans, in bch2_backpointers_maybe_flush() argument
200 ? bch2_btree_write_buffer_maybe_flush(trans, visiting_k, last_flushed) in bch2_backpointers_maybe_flush()
204 static int backpointer_target_not_found(struct btree_trans *trans, in backpointer_target_not_found() argument
210 struct bch_fs *c = trans->c; in backpointer_target_not_found()
220 ? bch2_backpointers_maybe_flush(trans, bp.s_c, last_flushed) in backpointer_target_not_found()
243 if (fsck_err(trans, backpointer_to_missing_ptr, in backpointer_target_not_found()
245 ret = bch2_backpointer_del(trans, bp.k->p); in backpointer_target_not_found()
263 ret = bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in backpointer_target_not_found()
271 static struct btree *__bch2_backpointer_get_node(struct btree_trans *trans, in __bch2_backpointer_get_node() argument
277 struct bch_fs *c = trans->c; in __bch2_backpointer_get_node()
281 bch2_trans_node_iter_init(trans, iter, in __bch2_backpointer_get_node()
287 struct btree *b = bch2_btree_iter_peek_node(trans, iter); in __bch2_backpointer_get_node()
300 int ret = backpointer_target_not_found(trans, bp, bkey_i_to_s_c(&b->key), in __bch2_backpointer_get_node()
305 bch2_trans_iter_exit(trans, iter); in __bch2_backpointer_get_node()
309 static struct bkey_s_c __bch2_backpointer_get_key(struct btree_trans *trans, in __bch2_backpointer_get_key() argument
316 struct bch_fs *c = trans->c; in __bch2_backpointer_get_key()
321 bch2_trans_node_iter_init(trans, iter, in __bch2_backpointer_get_key()
327 struct bkey_s_c k = bch2_btree_iter_peek_slot(trans, iter); in __bch2_backpointer_get_key()
329 bch2_trans_iter_exit(trans, iter); in __bch2_backpointer_get_key()
349 bch2_trans_iter_exit(trans, iter); in __bch2_backpointer_get_key()
352 int ret = backpointer_target_not_found(trans, bp, k, last_flushed, commit); in __bch2_backpointer_get_key()
355 struct btree *b = __bch2_backpointer_get_node(trans, bp, iter, last_flushed, commit); in __bch2_backpointer_get_key()
365 struct btree *bch2_backpointer_get_node(struct btree_trans *trans, in bch2_backpointer_get_node() argument
370 return __bch2_backpointer_get_node(trans, bp, iter, last_flushed, true); in bch2_backpointer_get_node()
373 struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *trans, in bch2_backpointer_get_key() argument
379 return __bch2_backpointer_get_key(trans, bp, iter, iter_flags, last_flushed, true); in bch2_backpointer_get_key()
382 static int bch2_check_backpointer_has_valid_bucket(struct btree_trans *trans, struct bkey_s_c k, in bch2_check_backpointer_has_valid_bucket() argument
388 struct bch_fs *c = trans->c; in bch2_check_backpointer_has_valid_bucket()
396 ret = bch2_backpointers_maybe_flush(trans, k, last_flushed); in bch2_check_backpointer_has_valid_bucket()
400 if (fsck_err(trans, backpointer_to_missing_device, in bch2_check_backpointer_has_valid_bucket()
403 ret = bch2_backpointer_del(trans, k.k->p); in bch2_check_backpointer_has_valid_bucket()
407 alloc_k = bch2_bkey_get_iter(trans, &alloc_iter, BTREE_ID_alloc, bucket, 0); in bch2_check_backpointer_has_valid_bucket()
413 ret = bch2_backpointers_maybe_flush(trans, k, last_flushed); in bch2_check_backpointer_has_valid_bucket()
417 if (fsck_err(trans, backpointer_to_missing_alloc, in bch2_check_backpointer_has_valid_bucket()
421 ret = bch2_backpointer_del(trans, k.k->p); in bch2_check_backpointer_has_valid_bucket()
425 bch2_trans_iter_exit(trans, &alloc_iter); in bch2_check_backpointer_has_valid_bucket()
438 for_each_btree_key_commit(trans, iter, in bch2_check_btree_backpointers()
441 bch2_check_backpointer_has_valid_bucket(trans, k, &last_flushed))); in bch2_check_btree_backpointers()
454 static int drop_dev_and_update(struct btree_trans *trans, enum btree_id btree, in drop_dev_and_update() argument
457 struct bkey_i *n = bch2_bkey_make_mut_noupdate(trans, extent); in drop_dev_and_update()
463 return bch2_btree_insert_trans(trans, btree, n, 0); in drop_dev_and_update()
466 static int check_extent_checksum(struct btree_trans *trans, in check_extent_checksum() argument
470 struct bch_fs *c = trans->c; in check_extent_checksum()
523 trans, dup_backpointer_to_bad_csum_extent, in check_extent_checksum()
525 ret = drop_dev_and_update(trans, btree, extent, dev) ?: 1; in check_extent_checksum()
537 static int check_bp_exists(struct btree_trans *trans, in check_bp_exists() argument
542 struct bch_fs *c = trans->c; in check_bp_exists()
551 struct bkey_s_c bp_k = bch2_bkey_get_iter(trans, &bp_iter, BTREE_ID_backpointers, bp->k.p, 0); in check_bp_exists()
558 ret = bch2_btree_write_buffer_maybe_flush(trans, orig_k, &s->last_flushed); in check_bp_exists()
567 bch2_trans_iter_exit(trans, &other_extent_iter); in check_bp_exists()
568 bch2_trans_iter_exit(trans, &bp_iter); in check_bp_exists()
579 __bch2_backpointer_get_key(trans, other_bp, &other_extent_iter, 0, NULL, false); in check_bp_exists()
597 ret = drop_dev_and_update(trans, other_bp.v->btree_id, in check_bp_exists()
615 ret = drop_dev_and_update(trans, other_bp.v->btree_id, in check_bp_exists()
621 ret = drop_dev_and_update(trans, bp->v.btree_id, orig_k, bp->k.p.inode); in check_bp_exists()
628 ret = check_extent_checksum(trans, in check_bp_exists()
639 ret = check_extent_checksum(trans, bp->v.btree_id, orig_k, in check_bp_exists()
665 if (fsck_err(trans, ptr_to_missing_backpointer, "%s", buf.buf)) in check_bp_exists()
666 ret = bch2_bucket_backpointer_mod(trans, orig_k, bp, true); in check_bp_exists()
671 static int check_extent_to_backpointers(struct btree_trans *trans, in check_extent_to_backpointers() argument
676 struct bch_fs *c = trans->c; in check_extent_to_backpointers()
707 ? check_bp_exists(trans, s, &bp, k) in check_extent_to_backpointers()
708 : bch2_bucket_backpointer_mod(trans, k, &bp, true); in check_extent_to_backpointers()
716 static int check_btree_root_to_backpointers(struct btree_trans *trans, in check_btree_root_to_backpointers() argument
721 struct bch_fs *c = trans->c; in check_btree_root_to_backpointers()
727 bch2_trans_node_iter_init(trans, &iter, btree_id, POS_MIN, in check_btree_root_to_backpointers()
729 b = bch2_btree_iter_peek_node(trans, &iter); in check_btree_root_to_backpointers()
735 bch2_trans_iter_exit(trans, &iter); in check_btree_root_to_backpointers()
742 ret = check_extent_to_backpointers(trans, s, btree_id, b->c.level + 1, k); in check_btree_root_to_backpointers()
744 bch2_trans_iter_exit(trans, &iter); in check_btree_root_to_backpointers()
762 static int bch2_get_btree_in_memory_pos(struct btree_trans *trans, in bch2_get_btree_in_memory_pos() argument
767 struct bch_fs *c = trans->c; in bch2_get_btree_in_memory_pos()
789 ret = __for_each_btree_node(trans, iter, btree, in bch2_get_btree_in_memory_pos()
813 static int bch2_check_extents_to_backpointers_pass(struct btree_trans *trans, in bch2_check_extents_to_backpointers_pass() argument
816 struct bch_fs *c = trans->c; in bch2_check_extents_to_backpointers_pass()
820 bch2_progress_init(&progress, trans->c, BIT_ULL(BTREE_ID_extents)|BIT_ULL(BTREE_ID_reflink)); in bch2_check_extents_to_backpointers_pass()
827 ret = commit_do(trans, NULL, NULL, in bch2_check_extents_to_backpointers_pass()
829 check_btree_root_to_backpointers(trans, s, btree_id, &level)); in bch2_check_extents_to_backpointers_pass()
835 bch2_trans_node_iter_init(trans, &iter, btree_id, POS_MIN, 0, level, in bch2_check_extents_to_backpointers_pass()
838 ret = for_each_btree_key_continue(trans, iter, 0, k, ({ in bch2_check_extents_to_backpointers_pass()
839 bch2_progress_update_iter(trans, &progress, &iter, "extents_to_backpointers"); in bch2_check_extents_to_backpointers_pass()
841 check_extent_to_backpointers(trans, s, btree_id, level, k) ?: in bch2_check_extents_to_backpointers_pass()
842 bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in bch2_check_extents_to_backpointers_pass()
879 static int check_bucket_backpointer_mismatch(struct btree_trans *trans, struct bkey_s_c alloc_k, in check_bucket_backpointer_mismatch() argument
883 struct bch_fs *c = trans->c; in check_bucket_backpointer_mismatch()
898 struct bch_dev *ca = bch2_dev_bucket_tryget_noerror(trans->c, alloc_k.k->p); in check_bucket_backpointer_mismatch()
905 for_each_btree_key_max_norestart(trans, iter, BTREE_ID_backpointers, in check_bucket_backpointer_mismatch()
916 ret = bch2_backpointer_del(trans, bp_k.k->p); in check_bucket_backpointer_mismatch()
933 bch2_trans_iter_exit(trans, &iter); in check_bucket_backpointer_mismatch()
938 ret = bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in check_bucket_backpointer_mismatch()
947 ret = bch2_backpointers_maybe_flush(trans, alloc_k, last_flushed); in check_bucket_backpointer_mismatch()
955 ret = check_bucket_backpointers_to_extents(trans, ca, alloc_k.k->p) ?: in check_bucket_backpointer_mismatch()
1022 static int btree_node_get_and_pin(struct btree_trans *trans, struct bkey_i *k, in btree_node_get_and_pin() argument
1026 bch2_trans_node_iter_init(trans, &iter, btree, k->k.p, 0, level, 0); in btree_node_get_and_pin()
1027 struct btree *b = bch2_btree_iter_peek_node(trans, &iter); in btree_node_get_and_pin()
1033 bch2_node_pin(trans->c, b); in btree_node_get_and_pin()
1035 bch2_trans_iter_exit(trans, &iter); in btree_node_get_and_pin()
1039 static int bch2_pin_backpointer_nodes_with_missing(struct btree_trans *trans, in bch2_pin_backpointer_nodes_with_missing() argument
1042 struct bch_fs *c = trans->c; in bch2_pin_backpointer_nodes_with_missing()
1054 bch2_trans_node_iter_init(trans, &iter, BTREE_ID_backpointers, start, in bch2_pin_backpointer_nodes_with_missing()
1056 ret = for_each_btree_key_continue(trans, iter, 0, k, ({ in bch2_pin_backpointer_nodes_with_missing()
1065 struct btree_path *path = btree_iter_path(trans, &iter); in bch2_pin_backpointer_nodes_with_missing()
1069 bch2_btree_node_prefetch(trans, path, tmp.k, path->btree_id, path->level - 1); in bch2_pin_backpointer_nodes_with_missing()
1076 bch2_trans_node_iter_init(trans, &iter, BTREE_ID_backpointers, start, in bch2_pin_backpointer_nodes_with_missing()
1078 ret = for_each_btree_key_continue(trans, iter, 0, k, ({ in bch2_pin_backpointer_nodes_with_missing()
1089 struct btree_path *path = btree_iter_path(trans, &iter); in bch2_pin_backpointer_nodes_with_missing()
1093 int ret2 = btree_node_get_and_pin(trans, tmp.k, path->btree_id, path->level - 1); in bch2_pin_backpointer_nodes_with_missing()
1110 struct btree_trans *trans = bch2_trans_get(c); in bch2_check_extents_to_backpointers() local
1116 ret = for_each_btree_key(trans, iter, BTREE_ID_alloc, in bch2_check_extents_to_backpointers()
1120 check_bucket_backpointer_mismatch(trans, k, &had_mismatch, &s.last_flushed); in bch2_check_extents_to_backpointers()
1138 ret = bch2_pin_backpointer_nodes_with_missing(trans, s.bp_start, &s.bp_end); in bch2_check_extents_to_backpointers()
1160 ret = bch2_check_extents_to_backpointers_pass(trans, &s); in bch2_check_extents_to_backpointers()
1172 bch2_trans_put(trans); in bch2_check_extents_to_backpointers()
1180 static int check_bucket_backpointer_pos_mismatch(struct btree_trans *trans, in check_bucket_backpointer_pos_mismatch() argument
1186 struct bkey_s_c k = bch2_bkey_get_iter(trans, &alloc_iter, in check_bucket_backpointer_pos_mismatch()
1193 ret = check_bucket_backpointer_mismatch(trans, k, had_mismatch, last_flushed); in check_bucket_backpointer_pos_mismatch()
1194 bch2_trans_iter_exit(trans, &alloc_iter); in check_bucket_backpointer_pos_mismatch()
1198 int bch2_check_bucket_backpointer_mismatch(struct btree_trans *trans, in bch2_check_bucket_backpointer_mismatch() argument
1203 struct bch_fs *c = trans->c; in bch2_check_bucket_backpointer_mismatch()
1205 int ret = lockrestart_do(trans, in bch2_check_bucket_backpointer_mismatch()
1206 check_bucket_backpointer_pos_mismatch(trans, POS(ca->dev_idx, bucket), in bch2_check_bucket_backpointer_mismatch()
1231 static int check_one_backpointer(struct btree_trans *trans, in check_one_backpointer() argument
1248 struct bkey_s_c k = bch2_backpointer_get_key(trans, bp, &iter, 0, last_flushed); in check_one_backpointer()
1255 bch2_trans_iter_exit(trans, &iter); in check_one_backpointer()
1259 static int check_bucket_backpointers_to_extents(struct btree_trans *trans, in check_bucket_backpointers_to_extents() argument
1262 u32 restart_count = trans->restart_count; in check_bucket_backpointers_to_extents()
1267 int ret = for_each_btree_key_max(trans, iter, BTREE_ID_backpointers, in check_bucket_backpointers_to_extents()
1271 check_one_backpointer(trans, BBPOS_MIN, BBPOS_MAX, k, &last_flushed) in check_bucket_backpointers_to_extents()
1274 bch2_bkey_buf_exit(&last_flushed, trans->c); in check_bucket_backpointers_to_extents()
1275 return ret ?: trans_was_restarted(trans, restart_count); in check_bucket_backpointers_to_extents()
1278 static int bch2_check_backpointers_to_extents_pass(struct btree_trans *trans, in bch2_check_backpointers_to_extents_pass() argument
1282 struct bch_fs *c = trans->c; in bch2_check_backpointers_to_extents_pass()
1288 bch2_progress_init(&progress, trans->c, BIT_ULL(BTREE_ID_backpointers)); in bch2_check_backpointers_to_extents_pass()
1290 int ret = for_each_btree_key(trans, iter, BTREE_ID_backpointers, in bch2_check_backpointers_to_extents_pass()
1292 bch2_progress_update_iter(trans, &progress, &iter, "backpointers_to_extents"); in bch2_check_backpointers_to_extents_pass()
1293 check_one_backpointer(trans, start, end, k, &last_flushed); in bch2_check_backpointers_to_extents_pass()
1302 struct btree_trans *trans = bch2_trans_get(c); in bch2_check_backpointers_to_extents() local
1307 ret = bch2_get_btree_in_memory_pos(trans, in bch2_check_backpointers_to_extents()
1333 ret = bch2_check_backpointers_to_extents_pass(trans, start, end); in bch2_check_backpointers_to_extents()
1339 bch2_trans_put(trans); in bch2_check_backpointers_to_extents()