GNU Linux-libre 6.9-gnu
[releases.git] / fs / bcachefs / inode_format.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_INODE_FORMAT_H
3 #define _BCACHEFS_INODE_FORMAT_H
4
5 #define BLOCKDEV_INODE_MAX      4096
6 #define BCACHEFS_ROOT_INO       4096
7
8 struct bch_inode {
9         struct bch_val          v;
10
11         __le64                  bi_hash_seed;
12         __le32                  bi_flags;
13         __le16                  bi_mode;
14         __u8                    fields[];
15 } __packed __aligned(8);
16
17 struct bch_inode_v2 {
18         struct bch_val          v;
19
20         __le64                  bi_journal_seq;
21         __le64                  bi_hash_seed;
22         __le64                  bi_flags;
23         __le16                  bi_mode;
24         __u8                    fields[];
25 } __packed __aligned(8);
26
27 struct bch_inode_v3 {
28         struct bch_val          v;
29
30         __le64                  bi_journal_seq;
31         __le64                  bi_hash_seed;
32         __le64                  bi_flags;
33         __le64                  bi_sectors;
34         __le64                  bi_size;
35         __le64                  bi_version;
36         __u8                    fields[];
37 } __packed __aligned(8);
38
39 #define INODEv3_FIELDS_START_INITIAL    6
40 #define INODEv3_FIELDS_START_CUR        (offsetof(struct bch_inode_v3, fields) / sizeof(__u64))
41
42 struct bch_inode_generation {
43         struct bch_val          v;
44
45         __le32                  bi_generation;
46         __le32                  pad;
47 } __packed __aligned(8);
48
49 /*
50  * bi_subvol and bi_parent_subvol are only set for subvolume roots:
51  */
52
53 #define BCH_INODE_FIELDS_v2()                   \
54         x(bi_atime,                     96)     \
55         x(bi_ctime,                     96)     \
56         x(bi_mtime,                     96)     \
57         x(bi_otime,                     96)     \
58         x(bi_size,                      64)     \
59         x(bi_sectors,                   64)     \
60         x(bi_uid,                       32)     \
61         x(bi_gid,                       32)     \
62         x(bi_nlink,                     32)     \
63         x(bi_generation,                32)     \
64         x(bi_dev,                       32)     \
65         x(bi_data_checksum,             8)      \
66         x(bi_compression,               8)      \
67         x(bi_project,                   32)     \
68         x(bi_background_compression,    8)      \
69         x(bi_data_replicas,             8)      \
70         x(bi_promote_target,            16)     \
71         x(bi_foreground_target,         16)     \
72         x(bi_background_target,         16)     \
73         x(bi_erasure_code,              16)     \
74         x(bi_fields_set,                16)     \
75         x(bi_dir,                       64)     \
76         x(bi_dir_offset,                64)     \
77         x(bi_subvol,                    32)     \
78         x(bi_parent_subvol,             32)
79
80 #define BCH_INODE_FIELDS_v3()                   \
81         x(bi_atime,                     96)     \
82         x(bi_ctime,                     96)     \
83         x(bi_mtime,                     96)     \
84         x(bi_otime,                     96)     \
85         x(bi_uid,                       32)     \
86         x(bi_gid,                       32)     \
87         x(bi_nlink,                     32)     \
88         x(bi_generation,                32)     \
89         x(bi_dev,                       32)     \
90         x(bi_data_checksum,             8)      \
91         x(bi_compression,               8)      \
92         x(bi_project,                   32)     \
93         x(bi_background_compression,    8)      \
94         x(bi_data_replicas,             8)      \
95         x(bi_promote_target,            16)     \
96         x(bi_foreground_target,         16)     \
97         x(bi_background_target,         16)     \
98         x(bi_erasure_code,              16)     \
99         x(bi_fields_set,                16)     \
100         x(bi_dir,                       64)     \
101         x(bi_dir_offset,                64)     \
102         x(bi_subvol,                    32)     \
103         x(bi_parent_subvol,             32)     \
104         x(bi_nocow,                     8)
105
106 /* subset of BCH_INODE_FIELDS */
107 #define BCH_INODE_OPTS()                        \
108         x(data_checksum,                8)      \
109         x(compression,                  8)      \
110         x(project,                      32)     \
111         x(background_compression,       8)      \
112         x(data_replicas,                8)      \
113         x(promote_target,               16)     \
114         x(foreground_target,            16)     \
115         x(background_target,            16)     \
116         x(erasure_code,                 16)     \
117         x(nocow,                        8)
118
119 enum inode_opt_id {
120 #define x(name, ...)                            \
121         Inode_opt_##name,
122         BCH_INODE_OPTS()
123 #undef  x
124         Inode_opt_nr,
125 };
126
127 #define BCH_INODE_FLAGS()                       \
128         x(sync,                         0)      \
129         x(immutable,                    1)      \
130         x(append,                       2)      \
131         x(nodump,                       3)      \
132         x(noatime,                      4)      \
133         x(i_size_dirty,                 5)      \
134         x(i_sectors_dirty,              6)      \
135         x(unlinked,                     7)      \
136         x(backptr_untrusted,            8)
137
138 /* bits 20+ reserved for packed fields below: */
139
140 enum bch_inode_flags {
141 #define x(t, n) BCH_INODE_##t = 1U << n,
142         BCH_INODE_FLAGS()
143 #undef x
144 };
145
146 enum __bch_inode_flags {
147 #define x(t, n) __BCH_INODE_##t = n,
148         BCH_INODE_FLAGS()
149 #undef x
150 };
151
152 LE32_BITMASK(INODE_STR_HASH,    struct bch_inode, bi_flags, 20, 24);
153 LE32_BITMASK(INODE_NR_FIELDS,   struct bch_inode, bi_flags, 24, 31);
154 LE32_BITMASK(INODE_NEW_VARINT,  struct bch_inode, bi_flags, 31, 32);
155
156 LE64_BITMASK(INODEv2_STR_HASH,  struct bch_inode_v2, bi_flags, 20, 24);
157 LE64_BITMASK(INODEv2_NR_FIELDS, struct bch_inode_v2, bi_flags, 24, 31);
158
159 LE64_BITMASK(INODEv3_STR_HASH,  struct bch_inode_v3, bi_flags, 20, 24);
160 LE64_BITMASK(INODEv3_NR_FIELDS, struct bch_inode_v3, bi_flags, 24, 31);
161
162 LE64_BITMASK(INODEv3_FIELDS_START,
163                                 struct bch_inode_v3, bi_flags, 31, 36);
164 LE64_BITMASK(INODEv3_MODE,      struct bch_inode_v3, bi_flags, 36, 52);
165
166 #endif /* _BCACHEFS_INODE_FORMAT_H */