1
2
3
4
5
6#ifndef BTRFS_INODE_H
7#define BTRFS_INODE_H
8
9#include <linux/hash.h>
10#include <linux/refcount.h>
11#include "extent_map.h"
12#include "extent_io.h"
13#include "ordered-data.h"
14#include "delayed-inode.h"
15
16
17
18
19
20
21
22
23enum {
24 BTRFS_INODE_FLUSH_ON_CLOSE,
25 BTRFS_INODE_DUMMY,
26 BTRFS_INODE_IN_DEFRAG,
27 BTRFS_INODE_HAS_ASYNC_EXTENT,
28
29
30
31
32
33 BTRFS_INODE_NEEDS_FULL_SYNC,
34 BTRFS_INODE_COPY_EVERYTHING,
35 BTRFS_INODE_IN_DELALLOC_LIST,
36 BTRFS_INODE_HAS_PROPS,
37 BTRFS_INODE_SNAPSHOT_FLUSH,
38
39
40
41
42
43
44 BTRFS_INODE_NO_XATTRS,
45
46
47
48
49
50
51
52
53 BTRFS_INODE_NO_DELALLOC_FLUSH,
54
55
56
57
58
59
60 BTRFS_INODE_VERITY_IN_PROGRESS,
61};
62
63
64struct btrfs_inode {
65
66 struct btrfs_root *root;
67
68
69
70
71 struct btrfs_key location;
72
73
74
75
76
77
78
79 spinlock_t lock;
80
81
82 struct extent_map_tree extent_tree;
83
84
85 struct extent_io_tree io_tree;
86
87
88
89
90 struct extent_io_tree io_failure_tree;
91
92
93
94
95
96 struct extent_io_tree file_extent_tree;
97
98
99 struct mutex log_mutex;
100
101
102 struct btrfs_ordered_inode_tree ordered_tree;
103
104
105
106
107
108 struct list_head delalloc_inodes;
109
110
111 struct rb_node rb_node;
112
113 unsigned long runtime_flags;
114
115
116 atomic_t sync_writers;
117
118
119
120
121 u64 generation;
122
123
124
125
126 u64 last_trans;
127
128
129
130
131 u64 logged_trans;
132
133
134
135
136 int last_sub_trans;
137
138
139 int last_log_commit;
140
141
142
143
144 u64 delalloc_bytes;
145
146
147
148
149
150
151 u64 new_delalloc_bytes;
152
153
154
155
156
157 u64 defrag_bytes;
158
159
160
161
162
163
164 u64 disk_i_size;
165
166
167
168
169
170 u64 index_cnt;
171
172
173 u64 dir_index;
174
175
176
177
178
179
180 u64 last_unlink_trans;
181
182
183
184
185
186
187
188
189
190
191 u64 last_reflink_trans;
192
193
194
195
196
197 u64 csum_bytes;
198
199
200 u32 flags;
201
202 u32 ro_flags;
203
204
205
206
207
208
209
210 unsigned outstanding_extents;
211
212 struct btrfs_block_rsv block_rsv;
213
214
215
216
217 unsigned prop_compress;
218
219
220
221
222 unsigned defrag_compress;
223
224 struct btrfs_delayed_node *delayed_node;
225
226
227 struct timespec64 i_otime;
228
229
230 struct list_head delayed_iput;
231
232 struct rw_semaphore i_mmap_lock;
233 struct inode vfs_inode;
234};
235
236static inline u32 btrfs_inode_sectorsize(const struct btrfs_inode *inode)
237{
238 return inode->root->fs_info->sectorsize;
239}
240
241static inline struct btrfs_inode *BTRFS_I(const struct inode *inode)
242{
243 return container_of(inode, struct btrfs_inode, vfs_inode);
244}
245
246static inline unsigned long btrfs_inode_hash(u64 objectid,
247 const struct btrfs_root *root)
248{
249 u64 h = objectid ^ (root->root_key.objectid * GOLDEN_RATIO_PRIME);
250
251#if BITS_PER_LONG == 32
252 h = (h >> 32) ^ (h & 0xffffffff);
253#endif
254
255 return (unsigned long)h;
256}
257
258static inline void btrfs_insert_inode_hash(struct inode *inode)
259{
260 unsigned long h = btrfs_inode_hash(inode->i_ino, BTRFS_I(inode)->root);
261
262 __insert_inode_hash(inode, h);
263}
264
265static inline u64 btrfs_ino(const struct btrfs_inode *inode)
266{
267 u64 ino = inode->location.objectid;
268
269
270
271
272
273 if (!ino || inode->location.type == BTRFS_ROOT_ITEM_KEY)
274 ino = inode->vfs_inode.i_ino;
275 return ino;
276}
277
278static inline void btrfs_i_size_write(struct btrfs_inode *inode, u64 size)
279{
280 i_size_write(&inode->vfs_inode, size);
281 inode->disk_i_size = size;
282}
283
284static inline bool btrfs_is_free_space_inode(struct btrfs_inode *inode)
285{
286 struct btrfs_root *root = inode->root;
287
288 if (root == root->fs_info->tree_root &&
289 btrfs_ino(inode) != BTRFS_BTREE_INODE_OBJECTID)
290 return true;
291 if (inode->location.objectid == BTRFS_FREE_INO_OBJECTID)
292 return true;
293 return false;
294}
295
296static inline bool is_data_inode(struct inode *inode)
297{
298 return btrfs_ino(BTRFS_I(inode)) != BTRFS_BTREE_INODE_OBJECTID;
299}
300
301static inline void btrfs_mod_outstanding_extents(struct btrfs_inode *inode,
302 int mod)
303{
304 lockdep_assert_held(&inode->lock);
305 inode->outstanding_extents += mod;
306 if (btrfs_is_free_space_inode(inode))
307 return;
308 trace_btrfs_inode_mod_outstanding_extents(inode->root, btrfs_ino(inode),
309 mod);
310}
311
312
313
314
315
316
317
318
319
320static inline void btrfs_set_inode_last_sub_trans(struct btrfs_inode *inode)
321{
322 spin_lock(&inode->lock);
323 inode->last_sub_trans = inode->root->log_transid;
324 spin_unlock(&inode->lock);
325}
326
327static inline bool btrfs_inode_in_log(struct btrfs_inode *inode, u64 generation)
328{
329 bool ret = false;
330
331 spin_lock(&inode->lock);
332 if (inode->logged_trans == generation &&
333 inode->last_sub_trans <= inode->last_log_commit &&
334 inode->last_sub_trans <= inode->root->last_log_commit)
335 ret = true;
336 spin_unlock(&inode->lock);
337 return ret;
338}
339
340struct btrfs_dio_private {
341 struct inode *inode;
342 u64 logical_offset;
343 u64 disk_bytenr;
344
345 u32 bytes;
346
347
348
349
350
351 refcount_t refs;
352
353
354 struct bio *dio_bio;
355
356
357 u8 csums[];
358};
359
360
361
362
363
364static inline u64 btrfs_inode_combine_flags(u32 flags, u32 ro_flags)
365{
366 return (flags | ((u64)ro_flags << 32));
367}
368
369static inline void btrfs_inode_split_flags(u64 inode_item_flags,
370 u32 *flags, u32 *ro_flags)
371{
372 *flags = (u32)inode_item_flags;
373 *ro_flags = (u32)(inode_item_flags >> 32);
374}
375
376
377#define CSUM_FMT "0x%*phN"
378#define CSUM_FMT_VALUE(size, bytes) size, bytes
379
380static inline void btrfs_print_data_csum_error(struct btrfs_inode *inode,
381 u64 logical_start, u8 *csum, u8 *csum_expected, int mirror_num)
382{
383 struct btrfs_root *root = inode->root;
384 const u32 csum_size = root->fs_info->csum_size;
385
386
387 if (root->root_key.objectid >= BTRFS_LAST_FREE_OBJECTID)
388 btrfs_warn_rl(root->fs_info,
389"csum failed root %lld ino %lld off %llu csum " CSUM_FMT " expected csum " CSUM_FMT " mirror %d",
390 root->root_key.objectid, btrfs_ino(inode),
391 logical_start,
392 CSUM_FMT_VALUE(csum_size, csum),
393 CSUM_FMT_VALUE(csum_size, csum_expected),
394 mirror_num);
395 else
396 btrfs_warn_rl(root->fs_info,
397"csum failed root %llu ino %llu off %llu csum " CSUM_FMT " expected csum " CSUM_FMT " mirror %d",
398 root->root_key.objectid, btrfs_ino(inode),
399 logical_start,
400 CSUM_FMT_VALUE(csum_size, csum),
401 CSUM_FMT_VALUE(csum_size, csum_expected),
402 mirror_num);
403}
404
405#endif
406