]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/buckets_types.h
Update bcachefs sources to bfb7133d71 bcachefs: Refactor bch2_alloc_write()
[bcachefs-tools-debian] / libbcachefs / buckets_types.h
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_mark {
11         union {
12         atomic64_t      v;
13
14         struct {
15         u8              gen;
16         u8              data_type:3,
17                         owned_by_allocator:1,
18                         journal_seq_valid:1,
19                         stripe:1;
20         u16             dirty_sectors;
21         u16             cached_sectors;
22
23         /*
24          * low bits of journal sequence number when this bucket was most
25          * recently modified: if journal_seq_valid is set, this bucket can't be
26          * reused until the journal sequence number written to disk is >= the
27          * bucket's journal sequence number:
28          */
29         u16             journal_seq;
30         };
31         };
32 };
33
34 struct bucket {
35         union {
36                 struct bucket_mark      _mark;
37                 const struct bucket_mark mark;
38         };
39
40         u16                             io_time[2];
41         u8                              oldest_gen;
42         unsigned                        gen_valid:1;
43 };
44
45 struct bucket_array {
46         struct rcu_head         rcu;
47         u16                     first_bucket;
48         size_t                  nbuckets;
49         struct bucket           b[];
50 };
51
52 struct bch_dev_usage {
53         u64                     buckets[BCH_DATA_NR];
54         u64                     buckets_alloc;
55         u64                     buckets_ec;
56         u64                     buckets_unavailable;
57
58         /* _compressed_ sectors: */
59         u64                     sectors[BCH_DATA_NR];
60         u64                     sectors_fragmented;
61 };
62
63 struct bch_fs_usage {
64         /* all fields are in units of 512 byte sectors: */
65
66         u64                     online_reserved;
67
68         /* fields after online_reserved are cleared/recalculated by gc: */
69         u64                     gc_start[0];
70
71         u64                     hidden;
72         u64                     btree;
73         u64                     data;
74         u64                     cached;
75         u64                     reserved;
76         u64                     nr_inodes;
77
78         /* XXX: add stats for compression ratio */
79 #if 0
80         u64                     uncompressed;
81         u64                     compressed;
82 #endif
83
84         /* broken out: */
85
86         u64                     persistent_reserved[BCH_REPLICAS_MAX];
87         u64                     replicas[];
88 };
89
90 struct bch_fs_usage_short {
91         u64                     capacity;
92         u64                     used;
93         u64                     free;
94         u64                     nr_inodes;
95 };
96
97 struct replicas_delta {
98         s64                     delta;
99         struct bch_replicas_entry r;
100 } __packed;
101
102 struct replicas_delta_list {
103         unsigned                size;
104         unsigned                used;
105         struct bch_fs_usage     fs_usage;
106         struct replicas_delta   d[0];
107 };
108
109 /*
110  * A reservation for space on disk:
111  */
112 struct disk_reservation {
113         u64                     sectors;
114         u32                     gen;
115         unsigned                nr_replicas;
116 };
117
118 struct copygc_heap_entry {
119         u8                      gen;
120         u32                     sectors;
121         u64                     offset;
122 };
123
124 typedef HEAP(struct copygc_heap_entry) copygc_heap;
125
126 #endif /* _BUCKETS_TYPES_H */