Skip to content

Commit a850bde

Browse files
author
Kent Overstreet
committed
bcachefs: fsck_err() may now take a btree_trans
fsck_err() now optionally takes a btree_trans; if the current thread has one, it is required that it be passed. The next patch will use this to unlock when waiting for user input. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent 38e3ca2 commit a850bde

File tree

17 files changed

+200
-162
lines changed

17 files changed

+200
-162
lines changed

fs/bcachefs/alloc_background.c

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11141114

11151115
struct bch_dev *ca = bch2_dev_bucket_tryget_noerror(c, alloc_k.k->p);
11161116
if (fsck_err_on(!ca,
1117-
c, alloc_key_to_missing_dev_bucket,
1117+
trans, alloc_key_to_missing_dev_bucket,
11181118
"alloc key for invalid device:bucket %llu:%llu",
11191119
alloc_k.k->p.inode, alloc_k.k->p.offset))
11201120
ret = bch2_btree_delete_at(trans, alloc_iter, 0);
@@ -1134,7 +1134,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11341134
goto err;
11351135

11361136
if (fsck_err_on(k.k->type != discard_key_type,
1137-
c, need_discard_key_wrong,
1137+
trans, need_discard_key_wrong,
11381138
"incorrect key in need_discard btree (got %s should be %s)\n"
11391139
" %s",
11401140
bch2_bkey_types[k.k->type],
@@ -1164,7 +1164,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11641164
goto err;
11651165

11661166
if (fsck_err_on(k.k->type != freespace_key_type,
1167-
c, freespace_key_wrong,
1167+
trans, freespace_key_wrong,
11681168
"incorrect key in freespace btree (got %s should be %s)\n"
11691169
" %s",
11701170
bch2_bkey_types[k.k->type],
@@ -1195,7 +1195,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
11951195
goto err;
11961196

11971197
if (fsck_err_on(a->gen != alloc_gen(k, gens_offset),
1198-
c, bucket_gens_key_wrong,
1198+
trans, bucket_gens_key_wrong,
11991199
"incorrect gen in bucket_gens btree (got %u should be %u)\n"
12001200
" %s",
12011201
alloc_gen(k, gens_offset), a->gen,
@@ -1236,7 +1236,6 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
12361236
struct bpos *end,
12371237
struct btree_iter *freespace_iter)
12381238
{
1239-
struct bch_fs *c = trans->c;
12401239
struct bkey_s_c k;
12411240
struct printbuf buf = PRINTBUF;
12421241
int ret;
@@ -1254,7 +1253,7 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
12541253
*end = bkey_min(k.k->p, *end);
12551254

12561255
if (fsck_err_on(k.k->type != KEY_TYPE_set,
1257-
c, freespace_hole_missing,
1256+
trans, freespace_hole_missing,
12581257
"hole in alloc btree missing in freespace btree\n"
12591258
" device %llu buckets %llu-%llu",
12601259
freespace_iter->pos.inode,
@@ -1290,7 +1289,6 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
12901289
struct bpos *end,
12911290
struct btree_iter *bucket_gens_iter)
12921291
{
1293-
struct bch_fs *c = trans->c;
12941292
struct bkey_s_c k;
12951293
struct printbuf buf = PRINTBUF;
12961294
unsigned i, gens_offset, gens_end_offset;
@@ -1314,7 +1312,7 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
13141312
bkey_reassemble(&g.k_i, k);
13151313

13161314
for (i = gens_offset; i < gens_end_offset; i++) {
1317-
if (fsck_err_on(g.v.gens[i], c,
1315+
if (fsck_err_on(g.v.gens[i], trans,
13181316
bucket_gens_hole_wrong,
13191317
"hole in alloc btree at %llu:%llu with nonzero gen in bucket_gens btree (%u)",
13201318
bucket_gens_pos_to_alloc(k.k->p, i).inode,
@@ -1372,8 +1370,8 @@ static noinline_for_stack int bch2_check_discard_freespace_key(struct btree_tran
13721370
if (ret)
13731371
return ret;
13741372

1375-
if (fsck_err_on(!bch2_dev_bucket_exists(c, pos), c,
1376-
need_discard_freespace_key_to_invalid_dev_bucket,
1373+
if (fsck_err_on(!bch2_dev_bucket_exists(c, pos),
1374+
trans, need_discard_freespace_key_to_invalid_dev_bucket,
13771375
"entry in %s btree for nonexistant dev:bucket %llu:%llu",
13781376
bch2_btree_id_str(iter->btree_id), pos.inode, pos.offset))
13791377
goto delete;
@@ -1382,8 +1380,8 @@ static noinline_for_stack int bch2_check_discard_freespace_key(struct btree_tran
13821380

13831381
if (fsck_err_on(a->data_type != state ||
13841382
(state == BCH_DATA_free &&
1385-
genbits != alloc_freespace_genbits(*a)), c,
1386-
need_discard_freespace_key_bad,
1383+
genbits != alloc_freespace_genbits(*a)),
1384+
trans, need_discard_freespace_key_bad,
13871385
"%s\n incorrectly set at %s:%llu:%llu:0 (free %u, genbits %llu should be %llu)",
13881386
(bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf),
13891387
bch2_btree_id_str(iter->btree_id),
@@ -1430,33 +1428,33 @@ int bch2_check_bucket_gens_key(struct btree_trans *trans,
14301428

14311429
struct bch_dev *ca = bch2_dev_tryget_noerror(c, k.k->p.inode);
14321430
if (!ca) {
1433-
if (fsck_err(c, bucket_gens_to_invalid_dev,
1431+
if (fsck_err(trans, bucket_gens_to_invalid_dev,
14341432
"bucket_gens key for invalid device:\n %s",
14351433
(bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
14361434
ret = bch2_btree_delete_at(trans, iter, 0);
14371435
goto out;
14381436
}
14391437

14401438
if (fsck_err_on(end <= ca->mi.first_bucket ||
1441-
start >= ca->mi.nbuckets, c,
1442-
bucket_gens_to_invalid_buckets,
1439+
start >= ca->mi.nbuckets,
1440+
trans, bucket_gens_to_invalid_buckets,
14431441
"bucket_gens key for invalid buckets:\n %s",
14441442
(bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
14451443
ret = bch2_btree_delete_at(trans, iter, 0);
14461444
goto out;
14471445
}
14481446

14491447
for (b = start; b < ca->mi.first_bucket; b++)
1450-
if (fsck_err_on(g.v.gens[b & KEY_TYPE_BUCKET_GENS_MASK], c,
1451-
bucket_gens_nonzero_for_invalid_buckets,
1448+
if (fsck_err_on(g.v.gens[b & KEY_TYPE_BUCKET_GENS_MASK],
1449+
trans, bucket_gens_nonzero_for_invalid_buckets,
14521450
"bucket_gens key has nonzero gen for invalid bucket")) {
14531451
g.v.gens[b & KEY_TYPE_BUCKET_GENS_MASK] = 0;
14541452
need_update = true;
14551453
}
14561454

14571455
for (b = ca->mi.nbuckets; b < end; b++)
1458-
if (fsck_err_on(g.v.gens[b & KEY_TYPE_BUCKET_GENS_MASK], c,
1459-
bucket_gens_nonzero_for_invalid_buckets,
1456+
if (fsck_err_on(g.v.gens[b & KEY_TYPE_BUCKET_GENS_MASK],
1457+
trans, bucket_gens_nonzero_for_invalid_buckets,
14601458
"bucket_gens key has nonzero gen for invalid bucket")) {
14611459
g.v.gens[b & KEY_TYPE_BUCKET_GENS_MASK] = 0;
14621460
need_update = true;
@@ -1636,8 +1634,8 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
16361634
if (a->data_type != BCH_DATA_cached)
16371635
return 0;
16381636

1639-
if (fsck_err_on(!a->io_time[READ], c,
1640-
alloc_key_cached_but_read_time_zero,
1637+
if (fsck_err_on(!a->io_time[READ],
1638+
trans, alloc_key_cached_but_read_time_zero,
16411639
"cached bucket with read_time 0\n"
16421640
" %s",
16431641
(printbuf_reset(&buf),

fs/bcachefs/backpointers.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ static int bch2_check_btree_backpointer(struct btree_trans *trans, struct btree_
395395

396396
struct bpos bucket;
397397
if (!bp_pos_to_bucket_nodev_noerror(c, k.k->p, &bucket)) {
398-
if (fsck_err(c, backpointer_to_missing_device,
398+
if (fsck_err(trans, backpointer_to_missing_device,
399399
"backpointer for missing device:\n%s",
400400
(bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
401401
ret = bch2_btree_delete_at(trans, bp_iter, 0);
@@ -407,8 +407,8 @@ static int bch2_check_btree_backpointer(struct btree_trans *trans, struct btree_
407407
if (ret)
408408
goto out;
409409

410-
if (fsck_err_on(alloc_k.k->type != KEY_TYPE_alloc_v4, c,
411-
backpointer_to_missing_alloc,
410+
if (fsck_err_on(alloc_k.k->type != KEY_TYPE_alloc_v4,
411+
trans, backpointer_to_missing_alloc,
412412
"backpointer for nonexistent alloc key: %llu:%llu:0\n%s",
413413
alloc_iter.pos.inode, alloc_iter.pos.offset,
414414
(bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
@@ -505,7 +505,7 @@ static int check_extent_checksum(struct btree_trans *trans,
505505
struct nonce nonce = extent_nonce(extent.k->version, p.crc);
506506
struct bch_csum csum = bch2_checksum(c, p.crc.csum_type, nonce, data_buf, bytes);
507507
if (fsck_err_on(bch2_crc_cmp(csum, p.crc.csum),
508-
c, dup_backpointer_to_bad_csum_extent,
508+
trans, dup_backpointer_to_bad_csum_extent,
509509
"%s", buf.buf))
510510
ret = drop_dev_and_update(trans, btree, extent, dev) ?: 1;
511511
fsck_err:
@@ -647,7 +647,7 @@ static int check_bp_exists(struct btree_trans *trans,
647647
prt_printf(&buf, "\n want: ");
648648
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&n_bp_k.k_i));
649649

650-
if (fsck_err(c, ptr_to_missing_backpointer, "%s", buf.buf))
650+
if (fsck_err(trans, ptr_to_missing_backpointer, "%s", buf.buf))
651651
ret = bch2_bucket_backpointer_mod(trans, ca, bucket, bp, orig_k, true);
652652

653653
goto out;
@@ -908,7 +908,7 @@ static int check_one_backpointer(struct btree_trans *trans,
908908
if (ret)
909909
goto out;
910910

911-
if (fsck_err(c, backpointer_to_missing_ptr,
911+
if (fsck_err(trans, backpointer_to_missing_ptr,
912912
"backpointer for missing %s\n %s",
913913
bp.v->level ? "btree node" : "extent",
914914
(bch2_bkey_val_to_text(&buf, c, bp.s_c), buf.buf))) {

fs/bcachefs/btree_gc.c

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,11 @@ static int set_node_max(struct bch_fs *c, struct btree *b, struct bpos new_max)
175175
return 0;
176176
}
177177

178-
static int btree_check_node_boundaries(struct bch_fs *c, struct btree *b,
178+
static int btree_check_node_boundaries(struct btree_trans *trans, struct btree *b,
179179
struct btree *prev, struct btree *cur,
180180
struct bpos *pulled_from_scan)
181181
{
182+
struct bch_fs *c = trans->c;
182183
struct bpos expected_start = !prev
183184
? b->data->min_key
184185
: bpos_successor(prev->key.k.p);
@@ -216,29 +217,29 @@ static int btree_check_node_boundaries(struct bch_fs *c, struct btree *b,
216217
*pulled_from_scan = cur->data->min_key;
217218
ret = DID_FILL_FROM_SCAN;
218219
} else {
219-
if (mustfix_fsck_err(c, btree_node_topology_bad_min_key,
220+
if (mustfix_fsck_err(trans, btree_node_topology_bad_min_key,
220221
"btree node with incorrect min_key%s", buf.buf))
221222
ret = set_node_min(c, cur, expected_start);
222223
}
223224
} else { /* overlap */
224225
if (prev && BTREE_NODE_SEQ(cur->data) > BTREE_NODE_SEQ(prev->data)) { /* cur overwrites prev */
225226
if (bpos_ge(prev->data->min_key, cur->data->min_key)) { /* fully? */
226-
if (mustfix_fsck_err(c, btree_node_topology_overwritten_by_next_node,
227+
if (mustfix_fsck_err(trans, btree_node_topology_overwritten_by_next_node,
227228
"btree node overwritten by next node%s", buf.buf))
228229
ret = DROP_PREV_NODE;
229230
} else {
230-
if (mustfix_fsck_err(c, btree_node_topology_bad_max_key,
231+
if (mustfix_fsck_err(trans, btree_node_topology_bad_max_key,
231232
"btree node with incorrect max_key%s", buf.buf))
232233
ret = set_node_max(c, prev,
233234
bpos_predecessor(cur->data->min_key));
234235
}
235236
} else {
236237
if (bpos_ge(expected_start, cur->data->max_key)) { /* fully? */
237-
if (mustfix_fsck_err(c, btree_node_topology_overwritten_by_prev_node,
238+
if (mustfix_fsck_err(trans, btree_node_topology_overwritten_by_prev_node,
238239
"btree node overwritten by prev node%s", buf.buf))
239240
ret = DROP_THIS_NODE;
240241
} else {
241-
if (mustfix_fsck_err(c, btree_node_topology_bad_min_key,
242+
if (mustfix_fsck_err(trans, btree_node_topology_bad_min_key,
242243
"btree node with incorrect min_key%s", buf.buf))
243244
ret = set_node_min(c, cur, expected_start);
244245
}
@@ -250,9 +251,10 @@ static int btree_check_node_boundaries(struct bch_fs *c, struct btree *b,
250251
return ret;
251252
}
252253

253-
static int btree_repair_node_end(struct bch_fs *c, struct btree *b,
254+
static int btree_repair_node_end(struct btree_trans *trans, struct btree *b,
254255
struct btree *child, struct bpos *pulled_from_scan)
255256
{
257+
struct bch_fs *c = trans->c;
256258
struct printbuf buf = PRINTBUF;
257259
int ret = 0;
258260

@@ -266,7 +268,7 @@ static int btree_repair_node_end(struct bch_fs *c, struct btree *b,
266268
prt_str(&buf, "\n child: ");
267269
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&child->key));
268270

269-
if (mustfix_fsck_err(c, btree_node_topology_bad_max_key,
271+
if (mustfix_fsck_err(trans, btree_node_topology_bad_max_key,
270272
"btree node with incorrect max_key%s", buf.buf)) {
271273
if (b->c.level == 1 &&
272274
bpos_lt(*pulled_from_scan, b->key.k.p)) {
@@ -325,8 +327,8 @@ static int bch2_btree_repair_topology_recurse(struct btree_trans *trans, struct
325327
printbuf_reset(&buf);
326328
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(cur_k.k));
327329

328-
if (mustfix_fsck_err_on(bch2_err_matches(ret, EIO), c,
329-
btree_node_unreadable,
330+
if (mustfix_fsck_err_on(bch2_err_matches(ret, EIO),
331+
trans, btree_node_unreadable,
330332
"Topology repair: unreadable btree node at btree %s level %u:\n"
331333
" %s",
332334
bch2_btree_id_str(b->c.btree_id),
@@ -363,7 +365,7 @@ static int bch2_btree_repair_topology_recurse(struct btree_trans *trans, struct
363365
continue;
364366
}
365367

366-
ret = btree_check_node_boundaries(c, b, prev, cur, pulled_from_scan);
368+
ret = btree_check_node_boundaries(trans, b, prev, cur, pulled_from_scan);
367369
if (ret == DID_FILL_FROM_SCAN) {
368370
new_pass = true;
369371
ret = 0;
@@ -404,7 +406,7 @@ static int bch2_btree_repair_topology_recurse(struct btree_trans *trans, struct
404406

405407
if (!ret && !IS_ERR_OR_NULL(prev)) {
406408
BUG_ON(cur);
407-
ret = btree_repair_node_end(c, b, prev, pulled_from_scan);
409+
ret = btree_repair_node_end(trans, b, prev, pulled_from_scan);
408410
if (ret == DID_FILL_FROM_SCAN) {
409411
new_pass = true;
410412
ret = 0;
@@ -462,8 +464,8 @@ static int bch2_btree_repair_topology_recurse(struct btree_trans *trans, struct
462464
printbuf_reset(&buf);
463465
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
464466

465-
if (mustfix_fsck_err_on(!have_child, c,
466-
btree_node_topology_interior_node_empty,
467+
if (mustfix_fsck_err_on(!have_child,
468+
trans, btree_node_topology_interior_node_empty,
467469
"empty interior btree node at btree %s level %u\n"
468470
" %s",
469471
bch2_btree_id_str(b->c.btree_id),
@@ -510,7 +512,7 @@ int bch2_check_topology(struct bch_fs *c)
510512
r->error = 0;
511513

512514
if (!bch2_btree_has_scanned_nodes(c, i)) {
513-
mustfix_fsck_err(c, btree_root_unreadable_and_scan_found_nothing,
515+
mustfix_fsck_err(trans, btree_root_unreadable_and_scan_found_nothing,
514516
"no nodes found for btree %s, continue?", bch2_btree_id_str(i));
515517
bch2_btree_root_alloc_fake_trans(trans, i, 0);
516518
} else {
@@ -585,16 +587,16 @@ static int bch2_gc_mark_key(struct btree_trans *trans, enum btree_id btree_id,
585587
k.k->version.lo > atomic64_read(&c->journal.seq));
586588

587589
if (fsck_err_on(btree_id != BTREE_ID_accounting &&
588-
k.k->version.lo > atomic64_read(&c->key_version), c,
589-
bkey_version_in_future,
590+
k.k->version.lo > atomic64_read(&c->key_version),
591+
trans, bkey_version_in_future,
590592
"key version number higher than recorded %llu\n %s",
591593
atomic64_read(&c->key_version),
592594
(bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
593595
atomic64_set(&c->key_version, k.k->version.lo);
594596
}
595597

596598
if (mustfix_fsck_err_on(level && !bch2_dev_btree_bitmap_marked(c, k),
597-
c, btree_bitmap_not_marked,
599+
trans, btree_bitmap_not_marked,
598600
"btree ptr not marked in member info btree allocated bitmap\n %s",
599601
(printbuf_reset(&buf),
600602
bch2_bkey_val_to_text(&buf, c, k),
@@ -710,7 +712,7 @@ static int bch2_gc_btrees(struct bch_fs *c)
710712
ret = bch2_gc_btree(trans, btree, true);
711713

712714
if (mustfix_fsck_err_on(bch2_err_matches(ret, EIO),
713-
c, btree_node_read_error,
715+
trans, btree_node_read_error,
714716
"btree node read error for %s",
715717
bch2_btree_id_str(btree)))
716718
ret = bch2_run_explicit_recovery_pass(c, BCH_RECOVERY_PASS_check_topology);
@@ -816,8 +818,8 @@ static int bch2_alloc_write_key(struct btree_trans *trans,
816818

817819
gc.fragmentation_lru = alloc_lru_idx_fragmentation(gc, ca);
818820

819-
if (fsck_err_on(new.data_type != gc.data_type, c,
820-
alloc_key_data_type_wrong,
821+
if (fsck_err_on(new.data_type != gc.data_type,
822+
trans, alloc_key_data_type_wrong,
821823
"bucket %llu:%llu gen %u has wrong data_type"
822824
": got %s, should be %s",
823825
iter->pos.inode, iter->pos.offset,
@@ -827,7 +829,8 @@ static int bch2_alloc_write_key(struct btree_trans *trans,
827829
new.data_type = gc.data_type;
828830

829831
#define copy_bucket_field(_errtype, _f) \
830-
if (fsck_err_on(new._f != gc._f, c, _errtype, \
832+
if (fsck_err_on(new._f != gc._f, \
833+
trans, _errtype, \
831834
"bucket %llu:%llu gen %u data type %s has wrong " #_f \
832835
": got %llu, should be %llu", \
833836
iter->pos.inode, iter->pos.offset, \
@@ -939,8 +942,8 @@ static int bch2_gc_write_reflink_key(struct btree_trans *trans,
939942
return -EINVAL;
940943
}
941944

942-
if (fsck_err_on(r->refcount != le64_to_cpu(*refcount), c,
943-
reflink_v_refcount_wrong,
945+
if (fsck_err_on(r->refcount != le64_to_cpu(*refcount),
946+
trans, reflink_v_refcount_wrong,
944947
"reflink key has wrong refcount:\n"
945948
" %s\n"
946949
" should be %u",
@@ -1038,7 +1041,8 @@ static int bch2_gc_write_stripes_key(struct btree_trans *trans,
10381041
if (bad)
10391042
bch2_bkey_val_to_text(&buf, c, k);
10401043

1041-
if (fsck_err_on(bad, c, stripe_sector_count_wrong,
1044+
if (fsck_err_on(bad,
1045+
trans, stripe_sector_count_wrong,
10421046
"%s", buf.buf)) {
10431047
struct bkey_i_stripe *new;
10441048

fs/bcachefs/btree_io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ static int __btree_err(int ret,
585585
switch (ret) {
586586
case -BCH_ERR_btree_node_read_err_fixable:
587587
ret = !silent
588-
? bch2_fsck_err(c, FSCK_CAN_FIX, err_type, "%s", out.buf)
588+
? __bch2_fsck_err(c, NULL, FSCK_CAN_FIX, err_type, "%s", out.buf)
589589
: -BCH_ERR_fsck_fix;
590590
if (ret != -BCH_ERR_fsck_fix &&
591591
ret != -BCH_ERR_fsck_ignore)

0 commit comments

Comments
 (0)