summaryrefslogtreecommitdiff
path: root/fs/bcachefs/buckets_types.h
blob: 6f7d3a23d2f09862456e4dba2f2cd1d1c87ef747 (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
#ifndef _BUCKETS_TYPES_H
#define _BUCKETS_TYPES_H

#include "bcachefs_format.h"
#include "util.h"

#define BUCKET_JOURNAL_SEQ_BITS		16

struct bucket_mark {
	union {
	struct {
		atomic64_t	v;
	};

	struct {
		u8		gen;
		u8		data_type:3,
				gen_valid:1,
				owned_by_allocator:1,
				nouse:1,
				journal_seq_valid:1;
		u16		dirty_sectors;
		u16		cached_sectors;

		/*
		 * low bits of journal sequence number when this bucket was most
		 * recently modified: if journal_seq_valid is set, this bucket
		 * can't be reused until the journal sequence number written to
		 * disk is >= the bucket's journal sequence number:
		 */
		u16		journal_seq;
	};
	};
};

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

	u16				io_time[2];
};

struct bucket_array {
	struct rcu_head		rcu;
	u16			first_bucket;
	size_t			nbuckets;
	struct bucket		b[];
};

struct bch_dev_usage {
	u64			buckets[BCH_DATA_NR];
	u64			buckets_alloc;
	u64			buckets_unavailable;

	/* _compressed_ sectors: */
	u64			sectors[BCH_DATA_NR];
	u64			sectors_fragmented;
};

struct bch_fs_usage {
	/* all fields are in units of 512 byte sectors: */
	u64			online_reserved;
	u64			available_cache;

	struct {
		u64		data[BCH_DATA_NR];
		u64		persistent_reserved;
	}			replicas[BCH_REPLICAS_MAX];

	u64			buckets[BCH_DATA_NR];
};

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

struct copygc_heap_entry {
	u8			gen;
	u32			sectors;
	u64			offset;
};

typedef HEAP(struct copygc_heap_entry) copygc_heap;

#endif /* _BUCKETS_TYPES_H */