1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BUCKETS_TYPES_H
3 #define _BUCKETS_TYPES_H
4 
5 #include "bcachefs_format.h"
6 #include "util.h"
7 
8 #define BUCKET_JOURNAL_SEQ_BITS		16
9 
10 struct bucket {
11 	u8			lock;
12 	u8			gen_valid:1;
13 	u8			data_type:7;
14 	u8			gen;
15 	u8			stripe_redundancy;
16 	u32			stripe;
17 	u32			dirty_sectors;
18 	u32			cached_sectors;
19 };
20 
21 struct bucket_array {
22 	struct rcu_head		rcu;
23 	u16			first_bucket;
24 	size_t			nbuckets;
25 	struct bucket		b[];
26 };
27 
28 struct bucket_gens {
29 	struct rcu_head		rcu;
30 	u16			first_bucket;
31 	size_t			nbuckets;
32 	u8			b[];
33 };
34 
35 struct bch_dev_usage {
36 	struct {
37 		u64		buckets;
38 		u64		sectors; /* _compressed_ sectors: */
39 		/*
40 		 * XXX
41 		 * Why do we have this? Isn't it just buckets * bucket_size -
42 		 * sectors?
43 		 */
44 		u64		fragmented;
45 	}			d[BCH_DATA_NR];
46 };
47 
48 struct bch_fs_usage_base {
49 	u64			hidden;
50 	u64			btree;
51 	u64			data;
52 	u64			cached;
53 	u64			reserved;
54 	u64			nr_inodes;
55 };
56 
57 struct bch_fs_usage {
58 	/* all fields are in units of 512 byte sectors: */
59 	struct bch_fs_usage_base b;
60 	u64			persistent_reserved[BCH_REPLICAS_MAX];
61 	u64			replicas[];
62 };
63 
64 struct bch_fs_usage_online {
65 	u64			online_reserved;
66 	struct bch_fs_usage	u;
67 };
68 
69 struct bch_fs_usage_short {
70 	u64			capacity;
71 	u64			used;
72 	u64			free;
73 	u64			nr_inodes;
74 };
75 
76 /*
77  * A reservation for space on disk:
78  */
79 struct disk_reservation {
80 	u64			sectors;
81 	u32			gen;
82 	unsigned		nr_replicas;
83 };
84 
85 #endif /* _BUCKETS_TYPES_H */
86