Skip to content

Commit b718175

Browse files
committed
Merge tag 'bcachefs-2024-08-16' of git://evilpiepirate.org/bcachefs
Pull bcachefs fixes from Kent OverstreetL - New on disk format version, bcachefs_metadata_version_disk_accounting_inum This adds one more disk accounting counter, which counts disk usage and number of extents per inode number. This lets us track fragmentation, for implementing defragmentation later, and it also counts disk usage per inode in all snapshots, which will be a useful thing to expose to users. - One performance issue we've observed is threads spinning when they should be waiting for dirty keys in the key cache to be flushed by journal reclaim, so we now have hysteresis for the waiting thread, as well as improving the tracepoint and a new time_stat, for tracking time blocked waiting on key cache flushing. ... and various assorted smaller fixes. * tag 'bcachefs-2024-08-16' of git://evilpiepirate.org/bcachefs: bcachefs: Fix locking in __bch2_trans_mark_dev_sb() bcachefs: fix incorrect i_state usage bcachefs: avoid overflowing LRU_TIME_BITS for cached data lru bcachefs: Fix forgetting to pass trans to fsck_err() bcachefs: Increase size of cuckoo hash table on too many rehashes bcachefs: bcachefs_metadata_version_disk_accounting_inum bcachefs: Kill __bch2_accounting_mem_mod() bcachefs: Make bkey_fsck_err() a wrapper around fsck_err() bcachefs: Fix warning in __bch2_fsck_err() for trans not passed in bcachefs: Add a time_stat for blocked on key cache flush bcachefs: Improve trans_blocked_journal_reclaim tracepoint bcachefs: Add hysteresis to waiting on btree key cache flush lib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc() bcachefs: Convert for_each_btree_node() to lockrestart_do() bcachefs: Add missing downgrade table entry bcachefs: disk accounting: ignore unknown types bcachefs: bch2_accounting_invalid() fixup bcachefs: Fix bch2_trigger_alloc when upgrading from old versions bcachefs: delete faulty fastpath in bch2_btree_path_traverse_cached()
2 parents e5fa841 + 0e49d3f commit b718175

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+650
-672
lines changed

fs/bcachefs/alloc_background.c

Lines changed: 42 additions & 35 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:
@@ -829,7 +824,19 @@ int bch2_trigger_alloc(struct btree_trans *trans,
829824

830825
struct bch_alloc_v4 old_a_convert;
831826
const struct bch_alloc_v4 *old_a = bch2_alloc_to_v4(old, &old_a_convert);
832-
struct bch_alloc_v4 *new_a = bkey_s_to_alloc_v4(new).v;
827+
828+
struct bch_alloc_v4 *new_a;
829+
if (likely(new.k->type == KEY_TYPE_alloc_v4)) {
830+
new_a = bkey_s_to_alloc_v4(new).v;
831+
} else {
832+
BUG_ON(!(flags & BTREE_TRIGGER_gc));
833+
834+
struct bkey_i_alloc_v4 *new_ka = bch2_alloc_to_v4_mut_inlined(trans, new.s_c);
835+
ret = PTR_ERR_OR_ZERO(new_ka);
836+
if (unlikely(ret))
837+
goto err;
838+
new_a = &new_ka->v;
839+
}
833840

834841
if (flags & BTREE_TRIGGER_transactional) {
835842
alloc_data_type_set(new_a, new_a->data_type);

fs/bcachefs/alloc_background.h

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ static inline void alloc_data_type_set(struct bch_alloc_v4 *a, enum bch_data_typ
150150

151151
static inline u64 alloc_lru_idx_read(struct bch_alloc_v4 a)
152152
{
153-
return a.data_type == BCH_DATA_cached ? a.io_time[READ] : 0;
153+
return a.data_type == BCH_DATA_cached
154+
? a.io_time[READ] & LRU_TIME_MAX
155+
: 0;
154156
}
155157

156158
#define DATA_TYPES_MOVABLE \
@@ -240,52 +242,48 @@ struct bkey_i_alloc_v4 *bch2_alloc_to_v4_mut(struct btree_trans *, struct bkey_s
240242

241243
int bch2_bucket_io_time_reset(struct btree_trans *, unsigned, size_t, int);
242244

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 *);
245+
int bch2_alloc_v1_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
246+
int bch2_alloc_v2_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
247+
int bch2_alloc_v3_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
248+
int bch2_alloc_v4_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags);
251249
void bch2_alloc_v4_swab(struct bkey_s);
252250
void bch2_alloc_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
253251

254252
#define bch2_bkey_ops_alloc ((struct bkey_ops) { \
255-
.key_invalid = bch2_alloc_v1_invalid, \
253+
.key_validate = bch2_alloc_v1_validate, \
256254
.val_to_text = bch2_alloc_to_text, \
257255
.trigger = bch2_trigger_alloc, \
258256
.min_val_size = 8, \
259257
})
260258

261259
#define bch2_bkey_ops_alloc_v2 ((struct bkey_ops) { \
262-
.key_invalid = bch2_alloc_v2_invalid, \
260+
.key_validate = bch2_alloc_v2_validate, \
263261
.val_to_text = bch2_alloc_to_text, \
264262
.trigger = bch2_trigger_alloc, \
265263
.min_val_size = 8, \
266264
})
267265

268266
#define bch2_bkey_ops_alloc_v3 ((struct bkey_ops) { \
269-
.key_invalid = bch2_alloc_v3_invalid, \
267+
.key_validate = bch2_alloc_v3_validate, \
270268
.val_to_text = bch2_alloc_to_text, \
271269
.trigger = bch2_trigger_alloc, \
272270
.min_val_size = 16, \
273271
})
274272

275273
#define bch2_bkey_ops_alloc_v4 ((struct bkey_ops) { \
276-
.key_invalid = bch2_alloc_v4_invalid, \
274+
.key_validate = bch2_alloc_v4_validate, \
277275
.val_to_text = bch2_alloc_to_text, \
278276
.swab = bch2_alloc_v4_swab, \
279277
.trigger = bch2_trigger_alloc, \
280278
.min_val_size = 48, \
281279
})
282280

283-
int bch2_bucket_gens_invalid(struct bch_fs *, struct bkey_s_c,
284-
enum bch_validate_flags, struct printbuf *);
281+
int bch2_bucket_gens_validate(struct bch_fs *, struct bkey_s_c,
282+
enum bch_validate_flags);
285283
void bch2_bucket_gens_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
286284

287285
#define bch2_bkey_ops_bucket_gens ((struct bkey_ops) { \
288-
.key_invalid = bch2_bucket_gens_invalid, \
286+
.key_validate = bch2_bucket_gens_validate, \
289287
.val_to_text = bch2_bucket_gens_to_text, \
290288
})
291289

fs/bcachefs/backpointers.c

Lines changed: 8 additions & 15 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;
@@ -763,27 +761,22 @@ static int bch2_get_btree_in_memory_pos(struct btree_trans *trans,
763761
btree < BTREE_ID_NR && !ret;
764762
btree++) {
765763
unsigned depth = (BIT_ULL(btree) & btree_leaf_mask) ? 0 : 1;
766-
struct btree_iter iter;
767-
struct btree *b;
768764

769765
if (!(BIT_ULL(btree) & btree_leaf_mask) &&
770766
!(BIT_ULL(btree) & btree_interior_mask))
771767
continue;
772768

773-
bch2_trans_begin(trans);
774-
775-
__for_each_btree_node(trans, iter, btree,
769+
ret = __for_each_btree_node(trans, iter, btree,
776770
btree == start.btree ? start.pos : POS_MIN,
777-
0, depth, BTREE_ITER_prefetch, b, ret) {
771+
0, depth, BTREE_ITER_prefetch, b, ({
778772
mem_may_pin -= btree_buf_bytes(b);
779773
if (mem_may_pin <= 0) {
780774
c->btree_cache.pinned_nodes_end = *end =
781775
BBPOS(btree, b->key.k.p);
782-
bch2_trans_iter_exit(trans, &iter);
783-
return 0;
776+
break;
784777
}
785-
}
786-
bch2_trans_iter_exit(trans, &iter);
778+
0;
779+
}));
787780
}
788781

789782
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/bcachefs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ BCH_DEBUG_PARAMS_DEBUG()
447447
x(blocked_journal_low_on_space) \
448448
x(blocked_journal_low_on_pin) \
449449
x(blocked_journal_max_in_flight) \
450+
x(blocked_key_cache_flush) \
450451
x(blocked_allocate) \
451452
x(blocked_allocate_open_bucket) \
452453
x(blocked_write_buffer_full) \

fs/bcachefs/bcachefs_format.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,8 @@ struct bch_sb_field_ext {
676676
x(mi_btree_bitmap, BCH_VERSION(1, 7)) \
677677
x(bucket_stripe_sectors, BCH_VERSION(1, 8)) \
678678
x(disk_accounting_v2, BCH_VERSION(1, 9)) \
679-
x(disk_accounting_v3, BCH_VERSION(1, 10))
679+
x(disk_accounting_v3, BCH_VERSION(1, 10)) \
680+
x(disk_accounting_inum, BCH_VERSION(1, 11))
680681

681682
enum bcachefs_metadata_version {
682683
bcachefs_metadata_version_min = 9,

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)