Skip to content

Commit d97de0d

Browse files
author
Kent Overstreet
committed
bcachefs: Make bkey_fsck_err() a wrapper around fsck_err()
bkey_fsck_err() was added as an interface that looks like fsck_err(), but previously all it did was ensure that the appropriate error counter was incremented in the superblock. This is a cleanup and bugfix patch that converts it to a wrapper around fsck_err(). This is needed to fix an issue with the upgrade path to disk_accounting_v3, where the "silent fix" error list now includes bkey_fsck errors; fsck_err() handles this in a unified way, and since we need to change printing of bkey fsck errors from the caller to the inner bkey_fsck_err() calls, this ends up being a pretty big change. Als,, rename .invalid() methods to .validate(), for clarity, while we're changing the function signature anyways (to drop the printbuf argument). Signed-off-by: Kent Overstreet <[email protected]>
1 parent c994710 commit d97de0d

38 files changed

+448
-553
lines changed

fs/bcachefs/alloc_background.c

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -196,75 +196,71 @@ static unsigned bch_alloc_v1_val_u64s(const struct bch_alloc *a)
196196
return DIV_ROUND_UP(bytes, sizeof(u64));
197197
}
198198

199-
int bch2_alloc_v1_invalid(struct bch_fs *c, struct bkey_s_c k,
200-
enum bch_validate_flags flags,
201-
struct printbuf *err)
199+
int bch2_alloc_v1_validate(struct bch_fs *c, struct bkey_s_c k,
200+
enum bch_validate_flags flags)
202201
{
203202
struct bkey_s_c_alloc a = bkey_s_c_to_alloc(k);
204203
int ret = 0;
205204

206205
/* allow for unknown fields */
207-
bkey_fsck_err_on(bkey_val_u64s(a.k) < bch_alloc_v1_val_u64s(a.v), c, err,
208-
alloc_v1_val_size_bad,
206+
bkey_fsck_err_on(bkey_val_u64s(a.k) < bch_alloc_v1_val_u64s(a.v),
207+
c, alloc_v1_val_size_bad,
209208
"incorrect value size (%zu < %u)",
210209
bkey_val_u64s(a.k), bch_alloc_v1_val_u64s(a.v));
211210
fsck_err:
212211
return ret;
213212
}
214213

215-
int bch2_alloc_v2_invalid(struct bch_fs *c, struct bkey_s_c k,
216-
enum bch_validate_flags flags,
217-
struct printbuf *err)
214+
int bch2_alloc_v2_validate(struct bch_fs *c, struct bkey_s_c k,
215+
enum bch_validate_flags flags)
218216
{
219217
struct bkey_alloc_unpacked u;
220218
int ret = 0;
221219

222-
bkey_fsck_err_on(bch2_alloc_unpack_v2(&u, k), c, err,
223-
alloc_v2_unpack_error,
220+
bkey_fsck_err_on(bch2_alloc_unpack_v2(&u, k),
221+
c, alloc_v2_unpack_error,
224222
"unpack error");
225223
fsck_err:
226224
return ret;
227225
}
228226

229-
int bch2_alloc_v3_invalid(struct bch_fs *c, struct bkey_s_c k,
230-
enum bch_validate_flags flags,
231-
struct printbuf *err)
227+
int bch2_alloc_v3_validate(struct bch_fs *c, struct bkey_s_c k,
228+
enum bch_validate_flags flags)
232229
{
233230
struct bkey_alloc_unpacked u;
234231
int ret = 0;
235232

236-
bkey_fsck_err_on(bch2_alloc_unpack_v3(&u, k), c, err,
237-
alloc_v2_unpack_error,
233+
bkey_fsck_err_on(bch2_alloc_unpack_v3(&u, k),
234+
c, alloc_v2_unpack_error,
238235
"unpack error");
239236
fsck_err:
240237
return ret;
241238
}
242239

243-
int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
244-
enum bch_validate_flags flags, struct printbuf *err)
240+
int bch2_alloc_v4_validate(struct bch_fs *c, struct bkey_s_c k,
241+
enum bch_validate_flags flags)
245242
{
246243
struct bkey_s_c_alloc_v4 a = bkey_s_c_to_alloc_v4(k);
247244
int ret = 0;
248245

249-
bkey_fsck_err_on(alloc_v4_u64s_noerror(a.v) > bkey_val_u64s(k.k), c, err,
250-
alloc_v4_val_size_bad,
246+
bkey_fsck_err_on(alloc_v4_u64s_noerror(a.v) > bkey_val_u64s(k.k),
247+
c, alloc_v4_val_size_bad,
251248
"bad val size (%u > %zu)",
252249
alloc_v4_u64s_noerror(a.v), bkey_val_u64s(k.k));
253250

254251
bkey_fsck_err_on(!BCH_ALLOC_V4_BACKPOINTERS_START(a.v) &&
255-
BCH_ALLOC_V4_NR_BACKPOINTERS(a.v), c, err,
256-
alloc_v4_backpointers_start_bad,
252+
BCH_ALLOC_V4_NR_BACKPOINTERS(a.v),
253+
c, alloc_v4_backpointers_start_bad,
257254
"invalid backpointers_start");
258255

259-
bkey_fsck_err_on(alloc_data_type(*a.v, a.v->data_type) != a.v->data_type, c, err,
260-
alloc_key_data_type_bad,
256+
bkey_fsck_err_on(alloc_data_type(*a.v, a.v->data_type) != a.v->data_type,
257+
c, alloc_key_data_type_bad,
261258
"invalid data type (got %u should be %u)",
262259
a.v->data_type, alloc_data_type(*a.v, a.v->data_type));
263260

264261
for (unsigned i = 0; i < 2; i++)
265262
bkey_fsck_err_on(a.v->io_time[i] > LRU_TIME_MAX,
266-
c, err,
267-
alloc_key_io_time_bad,
263+
c, alloc_key_io_time_bad,
268264
"invalid io_time[%s]: %llu, max %llu",
269265
i == READ ? "read" : "write",
270266
a.v->io_time[i], LRU_TIME_MAX);
@@ -282,7 +278,7 @@ int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
282278
a.v->dirty_sectors ||
283279
a.v->cached_sectors ||
284280
a.v->stripe,
285-
c, err, alloc_key_empty_but_have_data,
281+
c, alloc_key_empty_but_have_data,
286282
"empty data type free but have data %u.%u.%u %u",
287283
stripe_sectors,
288284
a.v->dirty_sectors,
@@ -296,7 +292,7 @@ int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
296292
case BCH_DATA_parity:
297293
bkey_fsck_err_on(!a.v->dirty_sectors &&
298294
!stripe_sectors,
299-
c, err, alloc_key_dirty_sectors_0,
295+
c, alloc_key_dirty_sectors_0,
300296
"data_type %s but dirty_sectors==0",
301297
bch2_data_type_str(a.v->data_type));
302298
break;
@@ -305,12 +301,12 @@ int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
305301
a.v->dirty_sectors ||
306302
stripe_sectors ||
307303
a.v->stripe,
308-
c, err, alloc_key_cached_inconsistency,
304+
c, alloc_key_cached_inconsistency,
309305
"data type inconsistency");
310306

311307
bkey_fsck_err_on(!a.v->io_time[READ] &&
312308
c->curr_recovery_pass > BCH_RECOVERY_PASS_check_alloc_to_lru_refs,
313-
c, err, alloc_key_cached_but_read_time_zero,
309+
c, alloc_key_cached_but_read_time_zero,
314310
"cached bucket with read_time == 0");
315311
break;
316312
case BCH_DATA_stripe:
@@ -513,14 +509,13 @@ static unsigned alloc_gen(struct bkey_s_c k, unsigned offset)
513509
: 0;
514510
}
515511

516-
int bch2_bucket_gens_invalid(struct bch_fs *c, struct bkey_s_c k,
517-
enum bch_validate_flags flags,
518-
struct printbuf *err)
512+
int bch2_bucket_gens_validate(struct bch_fs *c, struct bkey_s_c k,
513+
enum bch_validate_flags flags)
519514
{
520515
int ret = 0;
521516

522-
bkey_fsck_err_on(bkey_val_bytes(k.k) != sizeof(struct bch_bucket_gens), c, err,
523-
bucket_gens_val_size_bad,
517+
bkey_fsck_err_on(bkey_val_bytes(k.k) != sizeof(struct bch_bucket_gens),
518+
c, bucket_gens_val_size_bad,
524519
"bad val size (%zu != %zu)",
525520
bkey_val_bytes(k.k), sizeof(struct bch_bucket_gens));
526521
fsck_err:

fs/bcachefs/alloc_background.h

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -240,52 +240,48 @@ struct bkey_i_alloc_v4 *bch2_alloc_to_v4_mut(struct btree_trans *, struct bkey_s
240240

241241
int bch2_bucket_io_time_reset(struct btree_trans *, unsigned, size_t, int);
242242

243-
int bch2_alloc_v1_invalid(struct bch_fs *, struct bkey_s_c,
244-
enum bch_validate_flags, struct printbuf *);
245-
int bch2_alloc_v2_invalid(struct bch_fs *, struct bkey_s_c,
246-
enum bch_validate_flags, struct printbuf *);
247-
int bch2_alloc_v3_invalid(struct bch_fs *, struct bkey_s_c,
248-
enum bch_validate_flags, struct printbuf *);
249-
int bch2_alloc_v4_invalid(struct bch_fs *, struct bkey_s_c,
250-
enum bch_validate_flags, struct printbuf *);
243+
int bch2_alloc_v1_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
244+
int bch2_alloc_v2_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
245+
int bch2_alloc_v3_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
246+
int bch2_alloc_v4_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
251247
void bch2_alloc_v4_swab(struct bkey_s);
252248
void bch2_alloc_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
253249

254250
#define bch2_bkey_ops_alloc ((struct bkey_ops) { \
255-
.key_invalid = bch2_alloc_v1_invalid, \
251+
.key_validate = bch2_alloc_v1_validate, \
256252
.val_to_text = bch2_alloc_to_text, \
257253
.trigger = bch2_trigger_alloc, \
258254
.min_val_size = 8, \
259255
})
260256

261257
#define bch2_bkey_ops_alloc_v2 ((struct bkey_ops) { \
262-
.key_invalid = bch2_alloc_v2_invalid, \
258+
.key_validate = bch2_alloc_v2_validate, \
263259
.val_to_text = bch2_alloc_to_text, \
264260
.trigger = bch2_trigger_alloc, \
265261
.min_val_size = 8, \
266262
})
267263

268264
#define bch2_bkey_ops_alloc_v3 ((struct bkey_ops) { \
269-
.key_invalid = bch2_alloc_v3_invalid, \
265+
.key_validate = bch2_alloc_v3_validate, \
270266
.val_to_text = bch2_alloc_to_text, \
271267
.trigger = bch2_trigger_alloc, \
272268
.min_val_size = 16, \
273269
})
274270

275271
#define bch2_bkey_ops_alloc_v4 ((struct bkey_ops) { \
276-
.key_invalid = bch2_alloc_v4_invalid, \
272+
.key_validate = bch2_alloc_v4_validate, \
277273
.val_to_text = bch2_alloc_to_text, \
278274
.swab = bch2_alloc_v4_swab, \
279275
.trigger = bch2_trigger_alloc, \
280276
.min_val_size = 48, \
281277
})
282278

283-
int bch2_bucket_gens_invalid(struct bch_fs *, struct bkey_s_c,
284-
enum bch_validate_flags, struct printbuf *);
279+
int bch2_bucket_gens_validate(struct bch_fs *, struct bkey_s_c,
280+
enum bch_validate_flags);
285281
void bch2_bucket_gens_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
286282

287283
#define bch2_bkey_ops_bucket_gens ((struct bkey_ops) { \
288-
.key_invalid = bch2_bucket_gens_invalid, \
284+
.key_validate = bch2_bucket_gens_validate, \
289285
.val_to_text = bch2_bucket_gens_to_text, \
290286
})
291287

fs/bcachefs/backpointers.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@ static bool extent_matches_bp(struct bch_fs *c,
4747
return false;
4848
}
4949

50-
int bch2_backpointer_invalid(struct bch_fs *c, struct bkey_s_c k,
51-
enum bch_validate_flags flags,
52-
struct printbuf *err)
50+
int bch2_backpointer_validate(struct bch_fs *c, struct bkey_s_c k,
51+
enum bch_validate_flags flags)
5352
{
5453
struct bkey_s_c_backpointer bp = bkey_s_c_to_backpointer(k);
5554

@@ -68,8 +67,7 @@ int bch2_backpointer_invalid(struct bch_fs *c, struct bkey_s_c k,
6867

6968
bkey_fsck_err_on((bp.v->bucket_offset >> MAX_EXTENT_COMPRESS_RATIO_SHIFT) >= ca->mi.bucket_size ||
7069
!bpos_eq(bp.k->p, bp_pos),
71-
c, err,
72-
backpointer_bucket_offset_wrong,
70+
c, backpointer_bucket_offset_wrong,
7371
"backpointer bucket_offset wrong");
7472
fsck_err:
7573
return ret;

fs/bcachefs/backpointers.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,13 @@ static inline u64 swab40(u64 x)
1818
((x & 0xff00000000ULL) >> 32));
1919
}
2020

21-
int bch2_backpointer_invalid(struct bch_fs *, struct bkey_s_c k,
22-
enum bch_validate_flags, struct printbuf *);
21+
int bch2_backpointer_validate(struct bch_fs *, struct bkey_s_c k, enum bch_validate_flags);
2322
void bch2_backpointer_to_text(struct printbuf *, const struct bch_backpointer *);
2423
void bch2_backpointer_k_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
2524
void bch2_backpointer_swab(struct bkey_s);
2625

2726
#define bch2_bkey_ops_backpointer ((struct bkey_ops) { \
28-
.key_invalid = bch2_backpointer_invalid, \
27+
.key_validate = bch2_backpointer_validate, \
2928
.val_to_text = bch2_backpointer_k_to_text, \
3029
.swab = bch2_backpointer_swab, \
3130
.min_val_size = 32, \

fs/bcachefs/bkey.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
#include "vstructs.h"
1111

1212
enum bch_validate_flags {
13-
BCH_VALIDATE_write = (1U << 0),
14-
BCH_VALIDATE_commit = (1U << 1),
15-
BCH_VALIDATE_journal = (1U << 2),
13+
BCH_VALIDATE_write = BIT(0),
14+
BCH_VALIDATE_commit = BIT(1),
15+
BCH_VALIDATE_journal = BIT(2),
16+
BCH_VALIDATE_silent = BIT(3),
1617
};
1718

1819
#if 0

0 commit comments

Comments
 (0)