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
8struct 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
17struct 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
27struct 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
42struct 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
119enum 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
140enum bch_inode_flags {
141#define x(t, n) BCH_INODE_##t = 1U << n,
142 BCH_INODE_FLAGS()
143#undef x
144};
145
146enum __bch_inode_flags {
147#define x(t, n) __BCH_INODE_##t = n,
148 BCH_INODE_FLAGS()
149#undef x
150};
151
152LE32_BITMASK(INODE_STR_HASH, struct bch_inode, bi_flags, 20, 24);
153LE32_BITMASK(INODE_NR_FIELDS, struct bch_inode, bi_flags, 24, 31);
154LE32_BITMASK(INODE_NEW_VARINT, struct bch_inode, bi_flags, 31, 32);
155
156LE64_BITMASK(INODEv2_STR_HASH, struct bch_inode_v2, bi_flags, 20, 24);
157LE64_BITMASK(INODEv2_NR_FIELDS, struct bch_inode_v2, bi_flags, 24, 31);
158
159LE64_BITMASK(INODEv3_STR_HASH, struct bch_inode_v3, bi_flags, 20, 24);
160LE64_BITMASK(INODEv3_NR_FIELDS, struct bch_inode_v3, bi_flags, 24, 31);
161
162LE64_BITMASK(INODEv3_FIELDS_START,
163 struct bch_inode_v3, bi_flags, 31, 36);
164LE64_BITMASK(INODEv3_MODE, struct bch_inode_v3, bi_flags, 36, 52);
165
166#endif /* _BCACHEFS_INODE_FORMAT_H */
167

source code of linux/fs/bcachefs/inode_format.h