1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _BCACHEFS_BTREE_WRITE_BUFFER_TYPES_H
3#define _BCACHEFS_BTREE_WRITE_BUFFER_TYPES_H
4
5#include "darray.h"
6#include "journal_types.h"
7
8#define BTREE_WRITE_BUFERED_VAL_U64s_MAX	4
9#define BTREE_WRITE_BUFERED_U64s_MAX	(BKEY_U64s + BTREE_WRITE_BUFERED_VAL_U64s_MAX)
10
11struct wb_key_ref {
12union {
13	struct {
14#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
15		unsigned			idx:24;
16		u8				pos[sizeof(struct bpos)];
17		enum btree_id			btree:8;
18#else
19		enum btree_id			btree:8;
20		u8				pos[sizeof(struct bpos)];
21		unsigned			idx:24;
22#endif
23	} __packed;
24	struct {
25#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
26		u64 lo;
27		u64 mi;
28		u64 hi;
29#else
30		u64 hi;
31		u64 mi;
32		u64 lo;
33#endif
34	};
35};
36};
37
38struct btree_write_buffered_key {
39	enum btree_id			btree:8;
40	u64				journal_seq:56;
41	__BKEY_PADDED(k, BTREE_WRITE_BUFERED_VAL_U64s_MAX);
42};
43
44struct btree_write_buffer_keys {
45	DARRAY(struct btree_write_buffered_key) keys;
46	struct journal_entry_pin	pin;
47	struct mutex			lock;
48};
49
50struct btree_write_buffer {
51	DARRAY(struct wb_key_ref)	sorted;
52	struct btree_write_buffer_keys	inc;
53	struct btree_write_buffer_keys	flushing;
54	struct work_struct		flush_work;
55};
56
57#endif /* _BCACHEFS_BTREE_WRITE_BUFFER_TYPES_H */
58