summaryrefslogtreecommitdiff
path: root/libbcache/buckets_types.h
blob: 6bbdcd26fba4e63c1b24ec5be5de1d69f2709ba4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef _BUCKETS_TYPES_H
#define _BUCKETS_TYPES_H

struct bucket_mark {
	union {
	struct {
		u64		counter;
	};

	struct {
		u8		gen;

		/* generation copygc is going to move this bucket into */
		unsigned	copygc:1;
		unsigned	wait_on_journal:1;

		/*
		 * If this bucket ever had metadata in it, the allocator must
		 * increment its gen before we reuse it:
		 */
		unsigned	had_metadata:1;

		unsigned	owned_by_allocator:1;
		unsigned	is_metadata:1;

		u16		cached_sectors;
		u16		dirty_sectors;

		/*
		 * low bits of journal sequence number when this bucket was most
		 * recently modified:
		 */
		u16		journal_seq;
	};
	};
};

struct bucket {
	union {
		struct {
			u16	read_prio;
			u16	write_prio;
		};
		u16		prio[2];
	};

	union {
		struct bucket_mark	_mark;
		const struct bucket_mark mark;
	};
};

struct bucket_stats_cache {
	u64			buckets_dirty;
	u64			buckets_cached;
	u64			buckets_meta;
	u64			buckets_alloc;

	u64			sectors_dirty;
	u64			sectors_cached;
	u64			sectors_meta;
};

enum s_alloc {
	S_META,
	S_DIRTY,
	S_CACHED,
	S_ALLOC_NR,
};

enum s_compressed {
	S_COMPRESSED,
	S_UNCOMPRESSED,
	S_COMPRESSED_NR,
};

struct bucket_stats_cache_set {
	/* all fields are in units of 512 byte sectors: */
	u64			s[S_COMPRESSED_NR][S_ALLOC_NR];
	u64			persistent_reserved;
	u64			online_reserved;
	u64			available_cache;
};

struct bucket_heap_entry {
	struct bucket *g;
	unsigned long val;
};

/*
 * A reservation for space on disk:
 */
struct disk_reservation {
	u64		sectors;
	u32		gen;
	unsigned	nr_replicas;
};

#endif /* _BUCKETS_TYPES_H */