diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2025-07-14 22:05:34 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-07-22 12:05:27 -0400 |
commit | ea4c82fac938c280d0f8d49c51a1fea5e0f21363 (patch) | |
tree | 511684cdccea27b491fb1ef81091b8133408d293 | |
parent | 3d85f57d4cb0dcc94eeafb707a6e8fdaeef8b5a0 (diff) |
bcachefs: bch2_run_recovery_pass() now prints errors
With this the individual recovery passes no longer have to prin errors,
and we can eliminate some gotos.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/alloc_background.c | 13 | ||||
-rw-r--r-- | fs/bcachefs/backpointers.c | 5 | ||||
-rw-r--r-- | fs/bcachefs/btree_gc.c | 1 | ||||
-rw-r--r-- | fs/bcachefs/disk_accounting.c | 10 | ||||
-rw-r--r-- | fs/bcachefs/fsck.c | 34 | ||||
-rw-r--r-- | fs/bcachefs/inode.c | 17 | ||||
-rw-r--r-- | fs/bcachefs/logged_ops.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/lru.c | 1 | ||||
-rw-r--r-- | fs/bcachefs/recovery_passes.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/snapshot.c | 11 | ||||
-rw-r--r-- | fs/bcachefs/subvolume.c | 17 |
11 files changed, 29 insertions, 88 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 58706dfcdfe0..4c1604fd80f9 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -609,7 +609,6 @@ iter_err: BCH_TRANS_COMMIT_no_enospc, bch2_btree_insert_trans(trans, BTREE_ID_bucket_gens, &g.k_i, 0)); - bch_err_fn(c, ret); return ret; } @@ -678,7 +677,6 @@ int bch2_alloc_read(struct bch_fs *c) } bch2_dev_put(ca); - bch_err_fn(c, ret); return ret; } @@ -1619,14 +1617,14 @@ bkey_err: ca = NULL; if (ret < 0) - goto err; + return ret; ret = for_each_btree_key(trans, iter, BTREE_ID_need_discard, POS_MIN, BTREE_ITER_prefetch, k, bch2_check_discard_freespace_key(trans, &iter)); if (ret) - goto err; + return ret; bch2_trans_iter_init(trans, &iter, BTREE_ID_freespace, POS_MIN, BTREE_ITER_prefetch); @@ -1653,15 +1651,14 @@ bkey_err: } bch2_trans_iter_exit(trans, &iter); if (ret) - goto err; + return ret; ret = for_each_btree_key_commit(trans, iter, BTREE_ID_bucket_gens, POS_MIN, BTREE_ITER_prefetch, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, bch2_check_bucket_gens_key(trans, &iter, k)); -err: - bch_err_fn(c, ret); + return ret; } @@ -1743,7 +1740,6 @@ int bch2_check_alloc_to_lru_refs(struct bch_fs *c) bch2_check_stripe_to_lru_refs(trans); bch2_bkey_buf_exit(&last_flushed, c); - bch_err_fn(c, ret); return ret; } @@ -2353,7 +2349,6 @@ int bch2_fs_freespace_init(struct bch_fs *c) if (c->sb.features & BIT_ULL(BCH_FEATURE_small_image)) return 0; - /* * We can crash during the device add path, so we need to check this on * every mount: diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c index 7bb9d0cab289..bd26ab3e6812 100644 --- a/fs/bcachefs/backpointers.c +++ b/fs/bcachefs/backpointers.c @@ -438,7 +438,6 @@ int bch2_check_btree_backpointers(struct bch_fs *c) bch2_check_backpointer_has_valid_bucket(trans, k, &last_flushed)); bch2_bkey_buf_exit(&last_flushed, c); - bch_err_fn(c, ret); return ret; } @@ -1163,8 +1162,6 @@ int bch2_check_extents_to_backpointers(struct bch_fs *c) err: bch2_bkey_buf_exit(&s.last_flushed, c); bch2_btree_cache_unpin(c); - - bch_err_fn(c, ret); return ret; } @@ -1327,8 +1324,6 @@ int bch2_check_backpointers_to_extents(struct bch_fs *c) } bch2_btree_cache_unpin(c); - - bch_err_fn(c, ret); return ret; } diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c index 0804329601c1..34cb8a4324dc 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -1099,7 +1099,6 @@ out: if (!ret && !test_bit(BCH_FS_errors_not_fixed, &c->flags)) bch2_sb_members_clean_deleted(c); - bch_err_fn(c, ret); return ret; } diff --git a/fs/bcachefs/disk_accounting.c b/fs/bcachefs/disk_accounting.c index 2f74e68da699..219e37738aee 100644 --- a/fs/bcachefs/disk_accounting.c +++ b/fs/bcachefs/disk_accounting.c @@ -785,7 +785,7 @@ int bch2_accounting_read(struct bch_fs *c) accounting_read_key(trans, k); })); if (ret) - goto err; + return ret; struct journal_keys *keys = &c->journal_keys; struct journal_key *dst = keys->data; @@ -824,7 +824,7 @@ int bch2_accounting_read(struct bch_fs *c) ret = accounting_read_key(trans, k); if (ret) - goto err; + return ret; } *dst++ = *i; @@ -863,7 +863,7 @@ int bch2_accounting_read(struct bch_fs *c) } if (ret) - goto fsck_err; + return ret; } eytzinger0_sort(acc->k.data, acc->k.nr, sizeof(acc->k.data[0]), @@ -904,9 +904,7 @@ int bch2_accounting_read(struct bch_fs *c) } } } -fsck_err: -err: - bch_err_fn(c, ret); + return ret; } diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c index f64155614f65..df0aa2522b18 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -1331,14 +1331,11 @@ int bch2_check_inodes(struct bch_fs *c) CLASS(btree_trans, trans)(c); CLASS(snapshots_seen, s)(); - int ret = for_each_btree_key_commit(trans, iter, BTREE_ID_inodes, + return for_each_btree_key_commit(trans, iter, BTREE_ID_inodes, POS_MIN, BTREE_ITER_prefetch|BTREE_ITER_all_snapshots, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_inode(trans, &iter, k, &snapshot_root, &s)); - - bch_err_fn(c, ret); - return ret; } static int find_oldest_inode_needs_reattach(struct btree_trans *trans, @@ -1426,13 +1423,11 @@ fsck_err: int bch2_check_unreachable_inodes(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_commit(trans, iter, BTREE_ID_inodes, + return for_each_btree_key_commit(trans, iter, BTREE_ID_inodes, POS_MIN, BTREE_ITER_prefetch|BTREE_ITER_all_snapshots, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_unreachable_inode(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } static inline bool btree_matches_i_mode(enum btree_id btree, unsigned mode) @@ -2032,8 +2027,6 @@ int bch2_check_extents(struct bch_fs *c) check_i_sectors_notnested(trans, &w); bch2_disk_reservation_put(c, &res); - - bch_err_fn(c, ret); return ret; } @@ -2052,7 +2045,6 @@ int bch2_check_indirect_extents(struct bch_fs *c) })); bch2_disk_reservation_put(c, &res); - bch_err_fn(c, ret); return ret; } @@ -2478,7 +2470,6 @@ again: ret = -EINVAL; } - bch_err_fn(c, ret); return ret; } @@ -2532,7 +2523,6 @@ int bch2_check_xattrs(struct bch_fs *c) NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_xattr(trans, &iter, k, &hash_info, &inode)); - bch_err_fn(c, ret); return ret; } @@ -2598,10 +2588,8 @@ fsck_err: int bch2_check_root(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, - check_root_trans(trans)); - bch_err_fn(c, ret); - return ret; + return commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, + check_root_trans(trans)); } static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter, struct bkey_s_c k) @@ -2676,12 +2664,10 @@ err: int bch2_check_subvolume_structure(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_commit(trans, iter, + return for_each_btree_key_commit(trans, iter, BTREE_ID_subvolumes, POS_MIN, BTREE_ITER_prefetch, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_subvol_path(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } static int bch2_bi_depth_renumber_one(struct btree_trans *trans, @@ -2850,7 +2836,7 @@ fsck_err: int bch2_check_directory_structure(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_reverse_commit(trans, iter, BTREE_ID_inodes, POS_MIN, + return for_each_btree_key_reverse_commit(trans, iter, BTREE_ID_inodes, POS_MIN, BTREE_ITER_intent| BTREE_ITER_prefetch| BTREE_ITER_all_snapshots, k, @@ -2863,9 +2849,6 @@ int bch2_check_directory_structure(struct bch_fs *c) check_path_loop(trans, k); })); - - bch_err_fn(c, ret); - return ret; } struct nlink_table { @@ -3115,7 +3098,6 @@ int bch2_check_nlinks(struct bch_fs *c) } while (next_iter_range_start != U64_MAX); kvfree(links.d); - bch_err_fn(c, ret); return ret; } @@ -3151,14 +3133,12 @@ int bch2_fix_reflink_p(struct bch_fs *c) return 0; CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_commit(trans, iter, + return for_each_btree_key_commit(trans, iter, BTREE_ID_extents, POS_MIN, BTREE_ITER_intent|BTREE_ITER_prefetch| BTREE_ITER_all_snapshots, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, fix_reflink_p_key(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } #ifndef NO_BCACHEFS_CHARDEV diff --git a/fs/bcachefs/inode.c b/fs/bcachefs/inode.c index fd4a20ce06ff..4a9725f30c4f 100644 --- a/fs/bcachefs/inode.c +++ b/fs/bcachefs/inode.c @@ -1522,28 +1522,22 @@ static int may_delete_deleted_inum(struct btree_trans *trans, subvol_inum inum, int bch2_delete_dead_inodes(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret; - /* * if we ran check_inodes() unlinked inodes will have already been * cleaned up but the write buffer will be out of sync; therefore we * alway need a write buffer flush - */ - ret = bch2_btree_write_buffer_flush_sync(trans); - if (ret) - goto err; - - /* + * * Weird transaction restart handling here because on successful delete, * bch2_inode_rm_snapshot() will return a nested transaction restart, * but we can't retry because the btree write buffer won't have been * flushed and we'd spin: */ - ret = for_each_btree_key_commit(trans, iter, BTREE_ID_deleted_inodes, POS_MIN, + return bch2_btree_write_buffer_flush_sync(trans) ?: + for_each_btree_key_commit(trans, iter, BTREE_ID_deleted_inodes, POS_MIN, BTREE_ITER_prefetch|BTREE_ITER_all_snapshots, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, ({ struct bch_inode_unpacked inode; - ret = may_delete_deleted_inode(trans, k.k->p, &inode, true); + int ret = may_delete_deleted_inode(trans, k.k->p, &inode, true); if (ret > 0) { bch_verbose_ratelimited(c, "deleting unlinked inode %llu:%u", k.k->p.offset, k.k->p.snapshot); @@ -1564,7 +1558,4 @@ int bch2_delete_dead_inodes(struct bch_fs *c) ret; })); -err: - bch_err_fn(c, ret); - return ret; } diff --git a/fs/bcachefs/logged_ops.c b/fs/bcachefs/logged_ops.c index 3964f92a26b0..0367ea37e857 100644 --- a/fs/bcachefs/logged_ops.c +++ b/fs/bcachefs/logged_ops.c @@ -62,14 +62,12 @@ fsck_err: int bch2_resume_logged_ops(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_max(trans, iter, + return for_each_btree_key_max(trans, iter, BTREE_ID_logged_ops, POS(LOGGED_OPS_INUM_logged_ops, 0), POS(LOGGED_OPS_INUM_logged_ops, U64_MAX), BTREE_ITER_prefetch, k, resume_logged_op(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } static int __bch2_logged_op_start(struct btree_trans *trans, struct bkey_i *k) diff --git a/fs/bcachefs/lru.c b/fs/bcachefs/lru.c index c2c593356f41..ee14656c3fdd 100644 --- a/fs/bcachefs/lru.c +++ b/fs/bcachefs/lru.c @@ -214,7 +214,6 @@ int bch2_check_lrus(struct bch_fs *c) bch2_check_lru_key(trans, &iter, k, &last_flushed)); bch2_bkey_buf_exit(&last_flushed, c); - bch_err_fn(c, ret); return ret; } diff --git a/fs/bcachefs/recovery_passes.c b/fs/bcachefs/recovery_passes.c index a89508a87def..f9d1c4921392 100644 --- a/fs/bcachefs/recovery_passes.c +++ b/fs/bcachefs/recovery_passes.c @@ -246,11 +246,12 @@ static int bch2_lookup_root_inode(struct bch_fs *c) struct recovery_pass_fn { int (*fn)(struct bch_fs *); + const char *name; unsigned when; }; static struct recovery_pass_fn recovery_pass_fns[] = { -#define x(_fn, _id, _when) { .fn = bch2_##_fn, .when = _when }, +#define x(_fn, _id, _when) { .fn = bch2_##_fn, .name = #_fn, .when = _when }, BCH_RECOVERY_PASSES() #undef x }; @@ -480,6 +481,7 @@ static int bch2_run_recovery_pass(struct bch_fs *c, enum bch_recovery_pass pass) r->passes_to_run &= ~BIT_ULL(pass); if (ret) { + bch_err(c, "%s(): error %s", p->name, bch2_err_str(ret)); r->passes_failing |= BIT_ULL(pass); return ret; } diff --git a/fs/bcachefs/snapshot.c b/fs/bcachefs/snapshot.c index 398a1a8bceab..7a801513b134 100644 --- a/fs/bcachefs/snapshot.c +++ b/fs/bcachefs/snapshot.c @@ -574,13 +574,11 @@ fsck_err: int bch2_check_snapshot_trees(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_commit(trans, iter, + return for_each_btree_key_commit(trans, iter, BTREE_ID_snapshot_trees, POS_MIN, BTREE_ITER_prefetch, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_snapshot_tree(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } /* @@ -842,13 +840,11 @@ int bch2_check_snapshots(struct bch_fs *c) * the parent's depth already be correct: */ CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_reverse_commit(trans, iter, + return for_each_btree_key_reverse_commit(trans, iter, BTREE_ID_snapshots, POS_MAX, BTREE_ITER_prefetch, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_snapshot(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } static int check_snapshot_exists(struct btree_trans *trans, u32 id) @@ -1016,7 +1012,6 @@ int bch2_reconstruct_snapshots(struct bch_fs *c) fsck_err: err: snapshot_tree_reconstruct_exit(&r); - bch_err_fn(c, ret); return ret; } @@ -1894,8 +1889,6 @@ err: bch2_recovery_pass_set_no_ratelimit(c, BCH_RECOVERY_PASS_check_snapshots); mutex_unlock(&d->lock); - if (!bch2_err_matches(ret, EROFS)) - bch_err_fn(c, ret); return ret; } diff --git a/fs/bcachefs/subvolume.c b/fs/bcachefs/subvolume.c index dbd6bbfd972f..2d2d6b22df88 100644 --- a/fs/bcachefs/subvolume.c +++ b/fs/bcachefs/subvolume.c @@ -183,12 +183,10 @@ fsck_err: int bch2_check_subvols(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_commit(trans, iter, + return for_each_btree_key_commit(trans, iter, BTREE_ID_subvolumes, POS_MIN, BTREE_ITER_prefetch, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_subvol(trans, &iter, k)); - bch_err_fn(c, ret); - return ret; } static int check_subvol_child(struct btree_trans *trans, @@ -218,12 +216,10 @@ fsck_err: int bch2_check_subvol_children(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = for_each_btree_key_commit(trans, iter, + return for_each_btree_key_commit(trans, iter, BTREE_ID_subvolume_children, POS_MIN, BTREE_ITER_prefetch, k, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, check_subvol_child(trans, &iter, k)); - bch_err_fn(c, ret); - return 0; } /* Subvolumes: */ @@ -679,7 +675,6 @@ int bch2_initialize_subvolumes(struct bch_fs *c) struct bkey_i_snapshot_tree root_tree; struct bkey_i_snapshot root_snapshot; struct bkey_i_subvolume root_volume; - int ret; bkey_snapshot_tree_init(&root_tree.k_i); root_tree.k.p.offset = 1; @@ -700,11 +695,9 @@ int bch2_initialize_subvolumes(struct bch_fs *c) root_volume.v.snapshot = cpu_to_le32(U32_MAX); root_volume.v.inode = cpu_to_le64(BCACHEFS_ROOT_INO); - ret = bch2_btree_insert(c, BTREE_ID_snapshot_trees, &root_tree.k_i, NULL, 0, 0) ?: + return bch2_btree_insert(c, BTREE_ID_snapshot_trees, &root_tree.k_i, NULL, 0, 0) ?: bch2_btree_insert(c, BTREE_ID_snapshots, &root_snapshot.k_i, NULL, 0, 0) ?: bch2_btree_insert(c, BTREE_ID_subvolumes, &root_volume.k_i, NULL, 0, 0); - bch_err_fn(c, ret); - return ret; } static int __bch2_fs_upgrade_for_subvolumes(struct btree_trans *trans) @@ -742,10 +735,8 @@ err: int bch2_fs_upgrade_for_subvolumes(struct bch_fs *c) { CLASS(btree_trans, trans)(c); - int ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, + return commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc, __bch2_fs_upgrade_for_subvolumes(trans)); - bch_err_fn(c, ret); - return ret; } void bch2_fs_subvolumes_init_early(struct bch_fs *c) |