Lines Matching full:trans

88 static noinline int backpointer_mod_err(struct btree_trans *trans,  in backpointer_mod_err()  argument
94 struct bch_fs *c = trans->c; in backpointer_mod_err()
138 int bch2_bucket_backpointer_mod_nowritebuffer(struct btree_trans *trans, in bch2_bucket_backpointer_mod_nowritebuffer() argument
144 struct bkey_s_c k = bch2_bkey_get_iter(trans, &bp_iter, BTREE_ID_backpointers, in bch2_bucket_backpointer_mod_nowritebuffer()
157 ret = backpointer_mod_err(trans, orig_k, bp, k, insert); in bch2_bucket_backpointer_mod_nowritebuffer()
167 ret = bch2_trans_update(trans, &bp_iter, &bp->k_i, 0); in bch2_bucket_backpointer_mod_nowritebuffer()
169 bch2_trans_iter_exit(trans, &bp_iter); in bch2_bucket_backpointer_mod_nowritebuffer()
173 static int bch2_backpointer_del(struct btree_trans *trans, struct bpos pos) in bch2_backpointer_del() argument
176 ? bch2_btree_delete_at_buffered(trans, BTREE_ID_backpointers, pos) in bch2_backpointer_del()
177 : bch2_btree_delete(trans, BTREE_ID_backpointers, pos, 0)) ?: in bch2_backpointer_del()
178 bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in bch2_backpointer_del()
181 static inline int bch2_backpointers_maybe_flush(struct btree_trans *trans, in bch2_backpointers_maybe_flush() argument
186 ? bch2_btree_write_buffer_maybe_flush(trans, visiting_k, last_flushed) in bch2_backpointers_maybe_flush()
190 static int backpointer_target_not_found(struct btree_trans *trans, in backpointer_target_not_found() argument
195 struct bch_fs *c = trans->c; in backpointer_target_not_found()
205 ? bch2_backpointers_maybe_flush(trans, bp.s_c, last_flushed) in backpointer_target_not_found()
228 if (fsck_err(trans, backpointer_to_missing_ptr, in backpointer_target_not_found()
230 ret = bch2_backpointer_del(trans, bp.k->p); in backpointer_target_not_found()
236 struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *trans, in bch2_backpointer_get_key() argument
242 struct bch_fs *c = trans->c; in bch2_backpointer_get_key()
248 bch2_trans_node_iter_init(trans, iter, in bch2_backpointer_get_key()
255 bch2_trans_iter_exit(trans, iter); in bch2_backpointer_get_key()
263 bch2_trans_iter_exit(trans, iter); in bch2_backpointer_get_key()
264 int ret = backpointer_target_not_found(trans, bp, k, last_flushed); in bch2_backpointer_get_key()
267 struct btree *b = bch2_backpointer_get_node(trans, bp, iter, last_flushed); in bch2_backpointer_get_key()
275 struct btree *bch2_backpointer_get_node(struct btree_trans *trans, in bch2_backpointer_get_node() argument
280 struct bch_fs *c = trans->c; in bch2_backpointer_get_node()
284 bch2_trans_node_iter_init(trans, iter, in bch2_backpointer_get_node()
303 int ret = backpointer_target_not_found(trans, bp, bkey_i_to_s_c(&b->key), last_flushed); in bch2_backpointer_get_node()
307 bch2_trans_iter_exit(trans, iter); in bch2_backpointer_get_node()
311 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
317 struct bch_fs *c = trans->c; in bch2_check_backpointer_has_valid_bucket()
325 ret = bch2_backpointers_maybe_flush(trans, k, last_flushed); in bch2_check_backpointer_has_valid_bucket()
329 if (fsck_err(trans, backpointer_to_missing_device, in bch2_check_backpointer_has_valid_bucket()
332 ret = bch2_backpointer_del(trans, k.k->p); in bch2_check_backpointer_has_valid_bucket()
336 alloc_k = bch2_bkey_get_iter(trans, &alloc_iter, BTREE_ID_alloc, bucket, 0); in bch2_check_backpointer_has_valid_bucket()
342 ret = bch2_backpointers_maybe_flush(trans, k, last_flushed); in bch2_check_backpointer_has_valid_bucket()
346 if (fsck_err(trans, backpointer_to_missing_alloc, in bch2_check_backpointer_has_valid_bucket()
350 ret = bch2_backpointer_del(trans, k.k->p); in bch2_check_backpointer_has_valid_bucket()
354 bch2_trans_iter_exit(trans, &alloc_iter); in bch2_check_backpointer_has_valid_bucket()
367 for_each_btree_key_commit(trans, iter, in bch2_check_btree_backpointers()
370 bch2_check_backpointer_has_valid_bucket(trans, k, &last_flushed))); in bch2_check_btree_backpointers()
383 static int drop_dev_and_update(struct btree_trans *trans, enum btree_id btree, in drop_dev_and_update() argument
386 struct bkey_i *n = bch2_bkey_make_mut_noupdate(trans, extent); in drop_dev_and_update()
392 return bch2_btree_insert_trans(trans, btree, n, 0); in drop_dev_and_update()
395 static int check_extent_checksum(struct btree_trans *trans, in check_extent_checksum() argument
399 struct bch_fs *c = trans->c; in check_extent_checksum()
452 trans, dup_backpointer_to_bad_csum_extent, in check_extent_checksum()
454 ret = drop_dev_and_update(trans, btree, extent, dev) ?: 1; in check_extent_checksum()
465 static int check_bp_exists(struct btree_trans *trans, in check_bp_exists() argument
470 struct bch_fs *c = trans->c; in check_bp_exists()
479 struct bkey_s_c bp_k = bch2_bkey_get_iter(trans, &bp_iter, BTREE_ID_backpointers, bp->k.p, 0); in check_bp_exists()
486 ret = bch2_btree_write_buffer_maybe_flush(trans, orig_k, &s->last_flushed); in check_bp_exists()
495 bch2_trans_iter_exit(trans, &other_extent_iter); in check_bp_exists()
496 bch2_trans_iter_exit(trans, &bp_iter); in check_bp_exists()
507 bch2_backpointer_get_key(trans, other_bp, &other_extent_iter, 0, NULL); in check_bp_exists()
526 ret = drop_dev_and_update(trans, other_bp.v->btree_id, in check_bp_exists()
532 ret = drop_dev_and_update(trans, bp->v.btree_id, orig_k, bp->k.p.inode); in check_bp_exists()
539 ret = check_extent_checksum(trans, in check_bp_exists()
550 ret = check_extent_checksum(trans, bp->v.btree_id, orig_k, in check_bp_exists()
576 if (fsck_err(trans, ptr_to_missing_backpointer, "%s", buf.buf)) in check_bp_exists()
577 ret = bch2_bucket_backpointer_mod(trans, orig_k, bp, true); in check_bp_exists()
582 static int check_extent_to_backpointers(struct btree_trans *trans, in check_extent_to_backpointers() argument
587 struct bch_fs *c = trans->c; in check_extent_to_backpointers()
610 ? check_bp_exists(trans, s, &bp, k) in check_extent_to_backpointers()
611 : bch2_bucket_backpointer_mod(trans, k, &bp, true); in check_extent_to_backpointers()
620 static int check_btree_root_to_backpointers(struct btree_trans *trans, in check_btree_root_to_backpointers() argument
625 struct bch_fs *c = trans->c; in check_btree_root_to_backpointers()
631 bch2_trans_node_iter_init(trans, &iter, btree_id, POS_MIN, in check_btree_root_to_backpointers()
639 bch2_trans_iter_exit(trans, &iter); in check_btree_root_to_backpointers()
646 ret = check_extent_to_backpointers(trans, s, btree_id, b->c.level + 1, k); in check_btree_root_to_backpointers()
648 bch2_trans_iter_exit(trans, &iter); in check_btree_root_to_backpointers()
674 static int bch2_get_btree_in_memory_pos(struct btree_trans *trans, in bch2_get_btree_in_memory_pos() argument
679 struct bch_fs *c = trans->c; in bch2_get_btree_in_memory_pos()
701 ret = __for_each_btree_node(trans, iter, btree, in bch2_get_btree_in_memory_pos()
757 static void progress_update_iter(struct btree_trans *trans, in progress_update_iter() argument
762 struct bch_fs *c = trans->c; in progress_update_iter()
763 struct btree *b = path_l(btree_iter_path(trans, iter))->b; in progress_update_iter()
783 static int bch2_check_extents_to_backpointers_pass(struct btree_trans *trans, in bch2_check_extents_to_backpointers_pass() argument
786 struct bch_fs *c = trans->c; in bch2_check_extents_to_backpointers_pass()
790 progress_init(&progress, trans->c, BIT_ULL(BTREE_ID_extents)|BIT_ULL(BTREE_ID_reflink)); in bch2_check_extents_to_backpointers_pass()
797 ret = commit_do(trans, NULL, NULL, in bch2_check_extents_to_backpointers_pass()
799 check_btree_root_to_backpointers(trans, s, btree_id, &level)); in bch2_check_extents_to_backpointers_pass()
805 bch2_trans_node_iter_init(trans, &iter, btree_id, POS_MIN, 0, level, in bch2_check_extents_to_backpointers_pass()
808 ret = for_each_btree_key_continue(trans, iter, 0, k, ({ in bch2_check_extents_to_backpointers_pass()
809 progress_update_iter(trans, &progress, &iter, "extents_to_backpointers"); in bch2_check_extents_to_backpointers_pass()
810 check_extent_to_backpointers(trans, s, btree_id, level, k) ?: in bch2_check_extents_to_backpointers_pass()
811 bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in bch2_check_extents_to_backpointers_pass()
847 static int check_bucket_backpointer_mismatch(struct btree_trans *trans, struct bkey_s_c alloc_k, in check_bucket_backpointer_mismatch() argument
850 struct bch_fs *c = trans->c; in check_bucket_backpointer_mismatch()
863 struct bch_dev *ca = bch2_dev_bucket_tryget_noerror(trans->c, alloc_k.k->p); in check_bucket_backpointer_mismatch()
870 for_each_btree_key_max_norestart(trans, iter, BTREE_ID_backpointers, in check_bucket_backpointer_mismatch()
881 ret = bch2_backpointer_del(trans, bp_k.k->p); in check_bucket_backpointer_mismatch()
894 bch2_trans_iter_exit(trans, &iter); in check_bucket_backpointer_mismatch()
899 ret = bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); in check_bucket_backpointer_mismatch()
909 ret = bch2_backpointers_maybe_flush(trans, alloc_k, last_flushed); in check_bucket_backpointer_mismatch()
916 ret = check_bucket_backpointers_to_extents(trans, ca, alloc_k.k->p) ?: in check_bucket_backpointer_mismatch()
971 static int btree_node_get_and_pin(struct btree_trans *trans, struct bkey_i *k, in btree_node_get_and_pin() argument
975 bch2_trans_node_iter_init(trans, &iter, btree, k->k.p, 0, level, 0); in btree_node_get_and_pin()
982 bch2_node_pin(trans->c, b); in btree_node_get_and_pin()
984 bch2_trans_iter_exit(trans, &iter); in btree_node_get_and_pin()
988 static int bch2_pin_backpointer_nodes_with_missing(struct btree_trans *trans, in bch2_pin_backpointer_nodes_with_missing() argument
991 struct bch_fs *c = trans->c; in bch2_pin_backpointer_nodes_with_missing()
1003 bch2_trans_node_iter_init(trans, &iter, BTREE_ID_backpointers, start, in bch2_pin_backpointer_nodes_with_missing()
1005 ret = for_each_btree_key_continue(trans, iter, 0, k, ({ in bch2_pin_backpointer_nodes_with_missing()
1014 struct btree_path *path = btree_iter_path(trans, &iter); in bch2_pin_backpointer_nodes_with_missing()
1018 bch2_btree_node_prefetch(trans, path, tmp.k, path->btree_id, path->level - 1); in bch2_pin_backpointer_nodes_with_missing()
1025 bch2_trans_node_iter_init(trans, &iter, BTREE_ID_backpointers, start, in bch2_pin_backpointer_nodes_with_missing()
1027 ret = for_each_btree_key_continue(trans, iter, 0, k, ({ in bch2_pin_backpointer_nodes_with_missing()
1038 struct btree_path *path = btree_iter_path(trans, &iter); in bch2_pin_backpointer_nodes_with_missing()
1042 int ret2 = btree_node_get_and_pin(trans, tmp.k, path->btree_id, path->level - 1); in bch2_pin_backpointer_nodes_with_missing()
1081 struct btree_trans *trans = bch2_trans_get(c); in bch2_check_extents_to_backpointers() local
1087 ret = for_each_btree_key(trans, iter, BTREE_ID_alloc, in bch2_check_extents_to_backpointers()
1089 check_bucket_backpointer_mismatch(trans, k, &s.last_flushed); in bch2_check_extents_to_backpointers()
1108 ret = bch2_pin_backpointer_nodes_with_missing(trans, s.bp_start, &s.bp_end); in bch2_check_extents_to_backpointers()
1130 ret = bch2_check_extents_to_backpointers_pass(trans, &s); in bch2_check_extents_to_backpointers()
1137 bch2_trans_put(trans); in bch2_check_extents_to_backpointers()
1152 static int check_one_backpointer(struct btree_trans *trans, in check_one_backpointer() argument
1169 struct bkey_s_c k = bch2_backpointer_get_key(trans, bp, &iter, 0, last_flushed); in check_one_backpointer()
1176 bch2_trans_iter_exit(trans, &iter); in check_one_backpointer()
1180 static int check_bucket_backpointers_to_extents(struct btree_trans *trans, in check_bucket_backpointers_to_extents() argument
1183 u32 restart_count = trans->restart_count; in check_bucket_backpointers_to_extents()
1188 int ret = for_each_btree_key_max(trans, iter, BTREE_ID_backpointers, in check_bucket_backpointers_to_extents()
1192 check_one_backpointer(trans, BBPOS_MIN, BBPOS_MAX, k, &last_flushed) in check_bucket_backpointers_to_extents()
1195 bch2_bkey_buf_exit(&last_flushed, trans->c); in check_bucket_backpointers_to_extents()
1196 return ret ?: trans_was_restarted(trans, restart_count); in check_bucket_backpointers_to_extents()
1199 static int bch2_check_backpointers_to_extents_pass(struct btree_trans *trans, in bch2_check_backpointers_to_extents_pass() argument
1203 struct bch_fs *c = trans->c; in bch2_check_backpointers_to_extents_pass()
1209 progress_init(&progress, trans->c, BIT_ULL(BTREE_ID_backpointers)); in bch2_check_backpointers_to_extents_pass()
1211 int ret = for_each_btree_key(trans, iter, BTREE_ID_backpointers, in bch2_check_backpointers_to_extents_pass()
1213 progress_update_iter(trans, &progress, &iter, "backpointers_to_extents"); in bch2_check_backpointers_to_extents_pass()
1214 check_one_backpointer(trans, start, end, k, &last_flushed); in bch2_check_backpointers_to_extents_pass()
1223 struct btree_trans *trans = bch2_trans_get(c); in bch2_check_backpointers_to_extents() local
1228 ret = bch2_get_btree_in_memory_pos(trans, in bch2_check_backpointers_to_extents()
1254 ret = bch2_check_backpointers_to_extents_pass(trans, start, end); in bch2_check_backpointers_to_extents()
1260 bch2_trans_put(trans); in bch2_check_backpointers_to_extents()