Skip to content

Commit cb3f349

Browse files
author
Kent Overstreet
committed
bcachefs: Assert that btree write buffer only touches the right btrees
More asserts, more better. Also, clean up the per-btree flags a bit. Signed-off-by: Kent Overstreet <[email protected]>
1 parent bdedae7 commit cb3f349

File tree

3 files changed

+60
-29
lines changed

3 files changed

+60
-29
lines changed

fs/bcachefs/bcachefs_format.h

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,32 +1288,39 @@ LE32_BITMASK(JSET_NO_FLUSH, struct jset, flags, 5, 6);
12881288
/* Btree: */
12891289

12901290
enum btree_id_flags {
1291-
BTREE_ID_EXTENTS = BIT(0),
1292-
BTREE_ID_SNAPSHOTS = BIT(1),
1293-
BTREE_ID_SNAPSHOT_FIELD = BIT(2),
1294-
BTREE_ID_DATA = BIT(3),
1291+
BTREE_IS_extents = BIT(0),
1292+
BTREE_IS_snapshots = BIT(1),
1293+
BTREE_IS_snapshot_field = BIT(2),
1294+
BTREE_IS_data = BIT(3),
1295+
BTREE_IS_write_buffer = BIT(4),
12951296
};
12961297

12971298
#define BCH_BTREE_IDS() \
1298-
x(extents, 0, BTREE_ID_EXTENTS|BTREE_ID_SNAPSHOTS|BTREE_ID_DATA,\
1299+
x(extents, 0, \
1300+
BTREE_IS_extents| \
1301+
BTREE_IS_snapshots| \
1302+
BTREE_IS_data, \
12991303
BIT_ULL(KEY_TYPE_whiteout)| \
13001304
BIT_ULL(KEY_TYPE_error)| \
13011305
BIT_ULL(KEY_TYPE_cookie)| \
13021306
BIT_ULL(KEY_TYPE_extent)| \
13031307
BIT_ULL(KEY_TYPE_reservation)| \
13041308
BIT_ULL(KEY_TYPE_reflink_p)| \
13051309
BIT_ULL(KEY_TYPE_inline_data)) \
1306-
x(inodes, 1, BTREE_ID_SNAPSHOTS, \
1310+
x(inodes, 1, \
1311+
BTREE_IS_snapshots, \
13071312
BIT_ULL(KEY_TYPE_whiteout)| \
13081313
BIT_ULL(KEY_TYPE_inode)| \
13091314
BIT_ULL(KEY_TYPE_inode_v2)| \
13101315
BIT_ULL(KEY_TYPE_inode_v3)| \
13111316
BIT_ULL(KEY_TYPE_inode_generation)) \
1312-
x(dirents, 2, BTREE_ID_SNAPSHOTS, \
1317+
x(dirents, 2, \
1318+
BTREE_IS_snapshots, \
13131319
BIT_ULL(KEY_TYPE_whiteout)| \
13141320
BIT_ULL(KEY_TYPE_hash_whiteout)| \
13151321
BIT_ULL(KEY_TYPE_dirent)) \
1316-
x(xattrs, 3, BTREE_ID_SNAPSHOTS, \
1322+
x(xattrs, 3, \
1323+
BTREE_IS_snapshots, \
13171324
BIT_ULL(KEY_TYPE_whiteout)| \
13181325
BIT_ULL(KEY_TYPE_cookie)| \
13191326
BIT_ULL(KEY_TYPE_hash_whiteout)| \
@@ -1327,37 +1334,48 @@ enum btree_id_flags {
13271334
BIT_ULL(KEY_TYPE_quota)) \
13281335
x(stripes, 6, 0, \
13291336
BIT_ULL(KEY_TYPE_stripe)) \
1330-
x(reflink, 7, BTREE_ID_EXTENTS|BTREE_ID_DATA, \
1337+
x(reflink, 7, \
1338+
BTREE_IS_extents| \
1339+
BTREE_IS_data, \
13311340
BIT_ULL(KEY_TYPE_reflink_v)| \
13321341
BIT_ULL(KEY_TYPE_indirect_inline_data)| \
13331342
BIT_ULL(KEY_TYPE_error)) \
13341343
x(subvolumes, 8, 0, \
13351344
BIT_ULL(KEY_TYPE_subvolume)) \
13361345
x(snapshots, 9, 0, \
13371346
BIT_ULL(KEY_TYPE_snapshot)) \
1338-
x(lru, 10, 0, \
1347+
x(lru, 10, \
1348+
BTREE_IS_write_buffer, \
13391349
BIT_ULL(KEY_TYPE_set)) \
1340-
x(freespace, 11, BTREE_ID_EXTENTS, \
1350+
x(freespace, 11, \
1351+
BTREE_IS_extents, \
13411352
BIT_ULL(KEY_TYPE_set)) \
13421353
x(need_discard, 12, 0, \
13431354
BIT_ULL(KEY_TYPE_set)) \
1344-
x(backpointers, 13, 0, \
1355+
x(backpointers, 13, \
1356+
BTREE_IS_write_buffer, \
13451357
BIT_ULL(KEY_TYPE_backpointer)) \
13461358
x(bucket_gens, 14, 0, \
13471359
BIT_ULL(KEY_TYPE_bucket_gens)) \
13481360
x(snapshot_trees, 15, 0, \
13491361
BIT_ULL(KEY_TYPE_snapshot_tree)) \
1350-
x(deleted_inodes, 16, BTREE_ID_SNAPSHOT_FIELD, \
1362+
x(deleted_inodes, 16, \
1363+
BTREE_IS_snapshot_field| \
1364+
BTREE_IS_write_buffer, \
13511365
BIT_ULL(KEY_TYPE_set)) \
13521366
x(logged_ops, 17, 0, \
13531367
BIT_ULL(KEY_TYPE_logged_op_truncate)| \
13541368
BIT_ULL(KEY_TYPE_logged_op_finsert)| \
13551369
BIT_ULL(KEY_TYPE_inode_alloc_cursor)) \
1356-
x(rebalance_work, 18, BTREE_ID_SNAPSHOT_FIELD, \
1370+
x(rebalance_work, 18, \
1371+
BTREE_IS_snapshot_field| \
1372+
BTREE_IS_write_buffer, \
13571373
BIT_ULL(KEY_TYPE_set)|BIT_ULL(KEY_TYPE_cookie)) \
13581374
x(subvolume_children, 19, 0, \
13591375
BIT_ULL(KEY_TYPE_set)) \
1360-
x(accounting, 20, BTREE_ID_SNAPSHOT_FIELD, \
1376+
x(accounting, 20, \
1377+
BTREE_IS_snapshot_field| \
1378+
BTREE_IS_write_buffer, \
13611379
BIT_ULL(KEY_TYPE_accounting)) \
13621380

13631381
enum btree_id {

fs/bcachefs/btree_types.h

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -790,53 +790,64 @@ static inline bool btree_node_type_has_triggers(enum btree_node_type type)
790790
return BIT_ULL(type) & BTREE_NODE_TYPE_HAS_TRIGGERS;
791791
}
792792

793-
static inline bool btree_node_type_is_extents(enum btree_node_type type)
793+
static inline bool btree_id_is_extents(enum btree_id btree)
794794
{
795795
const u64 mask = 0
796-
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_ID_EXTENTS)) << (nr + 1))
796+
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_IS_extents)) << nr)
797797
BCH_BTREE_IDS()
798798
#undef x
799799
;
800800

801-
return BIT_ULL(type) & mask;
801+
return BIT_ULL(btree) & mask;
802802
}
803803

804-
static inline bool btree_id_is_extents(enum btree_id btree)
804+
static inline bool btree_node_type_is_extents(enum btree_node_type type)
805+
{
806+
return type != BKEY_TYPE_btree && btree_id_is_extents(type - 1);
807+
}
808+
809+
static inline bool btree_type_has_snapshots(enum btree_id btree)
805810
{
806-
return btree_node_type_is_extents(__btree_node_type(0, btree));
811+
const u64 mask = 0
812+
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_IS_snapshots)) << nr)
813+
BCH_BTREE_IDS()
814+
#undef x
815+
;
816+
817+
return BIT_ULL(btree) & mask;
807818
}
808819

809-
static inline bool btree_type_has_snapshots(enum btree_id id)
820+
static inline bool btree_type_has_snapshot_field(enum btree_id btree)
810821
{
811822
const u64 mask = 0
812-
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_ID_SNAPSHOTS)) << nr)
823+
#define x(name, nr, flags, ...) |((!!((flags) & (BTREE_IS_snapshot_field|BTREE_IS_snapshots))) << nr)
813824
BCH_BTREE_IDS()
814825
#undef x
815826
;
816827

817-
return BIT_ULL(id) & mask;
828+
return BIT_ULL(btree) & mask;
818829
}
819830

820-
static inline bool btree_type_has_snapshot_field(enum btree_id id)
831+
static inline bool btree_type_has_ptrs(enum btree_id btree)
821832
{
822833
const u64 mask = 0
823-
#define x(name, nr, flags, ...) |((!!((flags) & (BTREE_ID_SNAPSHOT_FIELD|BTREE_ID_SNAPSHOTS))) << nr)
834+
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_IS_data)) << nr)
824835
BCH_BTREE_IDS()
825836
#undef x
826837
;
827838

828-
return BIT_ULL(id) & mask;
839+
return BIT_ULL(btree) & mask;
829840
}
830841

831-
static inline bool btree_type_has_ptrs(enum btree_id id)
842+
static inline bool btree_type_uses_write_buffer(enum btree_id btree)
832843
{
833844
const u64 mask = 0
834-
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_ID_DATA)) << nr)
845+
#define x(name, nr, flags, ...) |((!!((flags) & BTREE_IS_write_buffer)) << nr)
835846
BCH_BTREE_IDS()
836847
#undef x
837848
;
838849

839-
return BIT_ULL(id) & mask;
850+
return BIT_ULL(btree) & mask;
840851
}
841852

842853
struct btree_root {

fs/bcachefs/btree_write_buffer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ static int bch2_btree_write_buffer_flush_locked(struct btree_trans *trans)
312312
darray_for_each(wb->sorted, i) {
313313
struct btree_write_buffered_key *k = &wb->flushing.keys.data[i->idx];
314314

315+
BUG_ON(!btree_type_uses_write_buffer(k->btree));
316+
315317
for (struct wb_key_ref *n = i + 1; n < min(i + 4, &darray_top(wb->sorted)); n++)
316318
prefetch(&wb->flushing.keys.data[n->idx]);
317319

0 commit comments

Comments
 (0)