Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/fs/btrfs/accessors.h
26282 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
3
#ifndef BTRFS_ACCESSORS_H
4
#define BTRFS_ACCESSORS_H
5
6
#include <linux/unaligned.h>
7
#include <linux/stddef.h>
8
#include <linux/types.h>
9
#include <linux/align.h>
10
#include <linux/build_bug.h>
11
#include <linux/compiler.h>
12
#include <linux/string.h>
13
#include <linux/mm.h>
14
#include <uapi/linux/btrfs_tree.h>
15
#include "extent_io.h"
16
17
struct extent_buffer;
18
19
/*
20
* Some macros to generate set/get functions for the struct fields. This
21
* assumes there is a lefoo_to_cpu for every type, so lets make a simple one
22
* for u8:
23
*/
24
#define le8_to_cpu(v) (v)
25
#define cpu_to_le8(v) (v)
26
#define __le8 u8
27
28
static inline u8 get_unaligned_le8(const void *p)
29
{
30
return *(const u8 *)p;
31
}
32
33
static inline void put_unaligned_le8(u8 val, void *p)
34
{
35
*(u8 *)p = val;
36
}
37
38
#define read_eb_member(eb, ptr, type, member, result) (\
39
read_extent_buffer(eb, (char *)(result), \
40
((unsigned long)(ptr)) + \
41
offsetof(type, member), \
42
sizeof_field(type, member)))
43
44
#define write_eb_member(eb, ptr, type, member, source) ( \
45
write_extent_buffer(eb, (const char *)(source), \
46
((unsigned long)(ptr)) + \
47
offsetof(type, member), \
48
sizeof_field(type, member)))
49
50
#define DECLARE_BTRFS_SETGET_BITS(bits) \
51
u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
52
const void *ptr, unsigned long off); \
53
void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
54
unsigned long off, u##bits val);
55
56
DECLARE_BTRFS_SETGET_BITS(8)
57
DECLARE_BTRFS_SETGET_BITS(16)
58
DECLARE_BTRFS_SETGET_BITS(32)
59
DECLARE_BTRFS_SETGET_BITS(64)
60
61
#define BTRFS_SETGET_FUNCS(name, type, member, bits) \
62
static inline u##bits btrfs_##name(const struct extent_buffer *eb, \
63
const type *s) \
64
{ \
65
static_assert(sizeof(u##bits) == sizeof_field(type, member)); \
66
return btrfs_get_##bits(eb, s, offsetof(type, member)); \
67
} \
68
static inline void btrfs_set_##name(const struct extent_buffer *eb, type *s, \
69
u##bits val) \
70
{ \
71
static_assert(sizeof(u##bits) == sizeof_field(type, member)); \
72
btrfs_set_##bits(eb, s, offsetof(type, member), val); \
73
}
74
75
#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
76
static inline u##bits btrfs_##name(const struct extent_buffer *eb) \
77
{ \
78
const type *p = folio_address(eb->folios[0]) + \
79
offset_in_page(eb->start); \
80
return get_unaligned_le##bits(&p->member); \
81
} \
82
static inline void btrfs_set_##name(const struct extent_buffer *eb, \
83
u##bits val) \
84
{ \
85
type *p = folio_address(eb->folios[0]) + offset_in_page(eb->start); \
86
put_unaligned_le##bits(val, &p->member); \
87
}
88
89
#define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \
90
static inline u##bits btrfs_##name(const type *s) \
91
{ \
92
return get_unaligned_le##bits(&s->member); \
93
} \
94
static inline void btrfs_set_##name(type *s, u##bits val) \
95
{ \
96
put_unaligned_le##bits(val, &s->member); \
97
}
98
99
static inline u64 btrfs_device_total_bytes(const struct extent_buffer *eb,
100
struct btrfs_dev_item *s)
101
{
102
static_assert(sizeof(u64) == sizeof_field(struct btrfs_dev_item, total_bytes));
103
return btrfs_get_64(eb, s, offsetof(struct btrfs_dev_item, total_bytes));
104
}
105
static inline void btrfs_set_device_total_bytes(const struct extent_buffer *eb,
106
struct btrfs_dev_item *s,
107
u64 val)
108
{
109
static_assert(sizeof(u64) == sizeof_field(struct btrfs_dev_item, total_bytes));
110
WARN_ON(!IS_ALIGNED(val, eb->fs_info->sectorsize));
111
btrfs_set_64(eb, s, offsetof(struct btrfs_dev_item, total_bytes), val);
112
}
113
114
BTRFS_SETGET_FUNCS(device_type, struct btrfs_dev_item, type, 64);
115
BTRFS_SETGET_FUNCS(device_bytes_used, struct btrfs_dev_item, bytes_used, 64);
116
BTRFS_SETGET_FUNCS(device_io_align, struct btrfs_dev_item, io_align, 32);
117
BTRFS_SETGET_FUNCS(device_io_width, struct btrfs_dev_item, io_width, 32);
118
BTRFS_SETGET_FUNCS(device_start_offset, struct btrfs_dev_item, start_offset, 64);
119
BTRFS_SETGET_FUNCS(device_sector_size, struct btrfs_dev_item, sector_size, 32);
120
BTRFS_SETGET_FUNCS(device_id, struct btrfs_dev_item, devid, 64);
121
BTRFS_SETGET_FUNCS(device_group, struct btrfs_dev_item, dev_group, 32);
122
BTRFS_SETGET_FUNCS(device_seek_speed, struct btrfs_dev_item, seek_speed, 8);
123
BTRFS_SETGET_FUNCS(device_bandwidth, struct btrfs_dev_item, bandwidth, 8);
124
BTRFS_SETGET_FUNCS(device_generation, struct btrfs_dev_item, generation, 64);
125
126
BTRFS_SETGET_STACK_FUNCS(stack_device_type, struct btrfs_dev_item, type, 64);
127
BTRFS_SETGET_STACK_FUNCS(stack_device_total_bytes, struct btrfs_dev_item,
128
total_bytes, 64);
129
BTRFS_SETGET_STACK_FUNCS(stack_device_bytes_used, struct btrfs_dev_item,
130
bytes_used, 64);
131
BTRFS_SETGET_STACK_FUNCS(stack_device_io_align, struct btrfs_dev_item,
132
io_align, 32);
133
BTRFS_SETGET_STACK_FUNCS(stack_device_io_width, struct btrfs_dev_item,
134
io_width, 32);
135
BTRFS_SETGET_STACK_FUNCS(stack_device_sector_size, struct btrfs_dev_item,
136
sector_size, 32);
137
BTRFS_SETGET_STACK_FUNCS(stack_device_id, struct btrfs_dev_item, devid, 64);
138
BTRFS_SETGET_STACK_FUNCS(stack_device_group, struct btrfs_dev_item, dev_group, 32);
139
BTRFS_SETGET_STACK_FUNCS(stack_device_seek_speed, struct btrfs_dev_item,
140
seek_speed, 8);
141
BTRFS_SETGET_STACK_FUNCS(stack_device_bandwidth, struct btrfs_dev_item,
142
bandwidth, 8);
143
BTRFS_SETGET_STACK_FUNCS(stack_device_generation, struct btrfs_dev_item,
144
generation, 64);
145
146
static inline unsigned long btrfs_device_uuid(struct btrfs_dev_item *d)
147
{
148
return (unsigned long)d + offsetof(struct btrfs_dev_item, uuid);
149
}
150
151
static inline unsigned long btrfs_device_fsid(struct btrfs_dev_item *d)
152
{
153
return (unsigned long)d + offsetof(struct btrfs_dev_item, fsid);
154
}
155
156
BTRFS_SETGET_FUNCS(chunk_length, struct btrfs_chunk, length, 64);
157
BTRFS_SETGET_FUNCS(chunk_owner, struct btrfs_chunk, owner, 64);
158
BTRFS_SETGET_FUNCS(chunk_stripe_len, struct btrfs_chunk, stripe_len, 64);
159
BTRFS_SETGET_FUNCS(chunk_io_align, struct btrfs_chunk, io_align, 32);
160
BTRFS_SETGET_FUNCS(chunk_io_width, struct btrfs_chunk, io_width, 32);
161
BTRFS_SETGET_FUNCS(chunk_sector_size, struct btrfs_chunk, sector_size, 32);
162
BTRFS_SETGET_FUNCS(chunk_type, struct btrfs_chunk, type, 64);
163
BTRFS_SETGET_FUNCS(chunk_num_stripes, struct btrfs_chunk, num_stripes, 16);
164
BTRFS_SETGET_FUNCS(chunk_sub_stripes, struct btrfs_chunk, sub_stripes, 16);
165
BTRFS_SETGET_FUNCS(stripe_devid, struct btrfs_stripe, devid, 64);
166
BTRFS_SETGET_FUNCS(stripe_offset, struct btrfs_stripe, offset, 64);
167
168
static inline char *btrfs_stripe_dev_uuid(struct btrfs_stripe *s)
169
{
170
return (char *)s + offsetof(struct btrfs_stripe, dev_uuid);
171
}
172
173
BTRFS_SETGET_STACK_FUNCS(stack_chunk_length, struct btrfs_chunk, length, 64);
174
BTRFS_SETGET_STACK_FUNCS(stack_chunk_owner, struct btrfs_chunk, owner, 64);
175
BTRFS_SETGET_STACK_FUNCS(stack_chunk_stripe_len, struct btrfs_chunk,
176
stripe_len, 64);
177
BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_align, struct btrfs_chunk, io_align, 32);
178
BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_width, struct btrfs_chunk, io_width, 32);
179
BTRFS_SETGET_STACK_FUNCS(stack_chunk_sector_size, struct btrfs_chunk,
180
sector_size, 32);
181
BTRFS_SETGET_STACK_FUNCS(stack_chunk_type, struct btrfs_chunk, type, 64);
182
BTRFS_SETGET_STACK_FUNCS(stack_chunk_num_stripes, struct btrfs_chunk,
183
num_stripes, 16);
184
BTRFS_SETGET_STACK_FUNCS(stack_chunk_sub_stripes, struct btrfs_chunk,
185
sub_stripes, 16);
186
BTRFS_SETGET_STACK_FUNCS(stack_stripe_devid, struct btrfs_stripe, devid, 64);
187
BTRFS_SETGET_STACK_FUNCS(stack_stripe_offset, struct btrfs_stripe, offset, 64);
188
189
static inline struct btrfs_stripe *btrfs_stripe_nr(struct btrfs_chunk *c, int nr)
190
{
191
unsigned long offset = (unsigned long)c;
192
193
offset += offsetof(struct btrfs_chunk, stripe);
194
offset += nr * sizeof(struct btrfs_stripe);
195
return (struct btrfs_stripe *)offset;
196
}
197
198
static inline char *btrfs_stripe_dev_uuid_nr(struct btrfs_chunk *c, int nr)
199
{
200
return btrfs_stripe_dev_uuid(btrfs_stripe_nr(c, nr));
201
}
202
203
static inline u64 btrfs_stripe_offset_nr(const struct extent_buffer *eb,
204
struct btrfs_chunk *c, int nr)
205
{
206
return btrfs_stripe_offset(eb, btrfs_stripe_nr(c, nr));
207
}
208
209
static inline void btrfs_set_stripe_offset_nr(struct extent_buffer *eb,
210
struct btrfs_chunk *c, int nr,
211
u64 val)
212
{
213
btrfs_set_stripe_offset(eb, btrfs_stripe_nr(c, nr), val);
214
}
215
216
static inline u64 btrfs_stripe_devid_nr(const struct extent_buffer *eb,
217
struct btrfs_chunk *c, int nr)
218
{
219
return btrfs_stripe_devid(eb, btrfs_stripe_nr(c, nr));
220
}
221
222
static inline void btrfs_set_stripe_devid_nr(struct extent_buffer *eb,
223
struct btrfs_chunk *c, int nr,
224
u64 val)
225
{
226
btrfs_set_stripe_devid(eb, btrfs_stripe_nr(c, nr), val);
227
}
228
229
/* struct btrfs_block_group_item */
230
BTRFS_SETGET_STACK_FUNCS(stack_block_group_used, struct btrfs_block_group_item,
231
used, 64);
232
BTRFS_SETGET_FUNCS(block_group_used, struct btrfs_block_group_item, used, 64);
233
BTRFS_SETGET_STACK_FUNCS(stack_block_group_chunk_objectid,
234
struct btrfs_block_group_item, chunk_objectid, 64);
235
236
BTRFS_SETGET_FUNCS(block_group_chunk_objectid,
237
struct btrfs_block_group_item, chunk_objectid, 64);
238
BTRFS_SETGET_FUNCS(block_group_flags, struct btrfs_block_group_item, flags, 64);
239
BTRFS_SETGET_STACK_FUNCS(stack_block_group_flags,
240
struct btrfs_block_group_item, flags, 64);
241
242
/* struct btrfs_free_space_info */
243
BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info,
244
extent_count, 32);
245
BTRFS_SETGET_FUNCS(free_space_flags, struct btrfs_free_space_info, flags, 32);
246
247
/* struct btrfs_inode_ref */
248
BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
249
BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64);
250
BTRFS_SETGET_STACK_FUNCS(stack_inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
251
BTRFS_SETGET_STACK_FUNCS(stack_inode_ref_index, struct btrfs_inode_ref, index, 64);
252
253
/* struct btrfs_inode_extref */
254
BTRFS_SETGET_FUNCS(inode_extref_parent, struct btrfs_inode_extref,
255
parent_objectid, 64);
256
BTRFS_SETGET_FUNCS(inode_extref_name_len, struct btrfs_inode_extref,
257
name_len, 16);
258
BTRFS_SETGET_FUNCS(inode_extref_index, struct btrfs_inode_extref, index, 64);
259
260
/* struct btrfs_inode_item */
261
BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
262
BTRFS_SETGET_FUNCS(inode_sequence, struct btrfs_inode_item, sequence, 64);
263
BTRFS_SETGET_FUNCS(inode_transid, struct btrfs_inode_item, transid, 64);
264
BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64);
265
BTRFS_SETGET_FUNCS(inode_nbytes, struct btrfs_inode_item, nbytes, 64);
266
BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64);
267
BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32);
268
BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32);
269
BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32);
270
BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32);
271
BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 64);
272
BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 64);
273
BTRFS_SETGET_STACK_FUNCS(stack_inode_generation, struct btrfs_inode_item,
274
generation, 64);
275
BTRFS_SETGET_STACK_FUNCS(stack_inode_sequence, struct btrfs_inode_item,
276
sequence, 64);
277
BTRFS_SETGET_STACK_FUNCS(stack_inode_transid, struct btrfs_inode_item,
278
transid, 64);
279
BTRFS_SETGET_STACK_FUNCS(stack_inode_size, struct btrfs_inode_item, size, 64);
280
BTRFS_SETGET_STACK_FUNCS(stack_inode_nbytes, struct btrfs_inode_item, nbytes, 64);
281
BTRFS_SETGET_STACK_FUNCS(stack_inode_block_group, struct btrfs_inode_item,
282
block_group, 64);
283
BTRFS_SETGET_STACK_FUNCS(stack_inode_nlink, struct btrfs_inode_item, nlink, 32);
284
BTRFS_SETGET_STACK_FUNCS(stack_inode_uid, struct btrfs_inode_item, uid, 32);
285
BTRFS_SETGET_STACK_FUNCS(stack_inode_gid, struct btrfs_inode_item, gid, 32);
286
BTRFS_SETGET_STACK_FUNCS(stack_inode_mode, struct btrfs_inode_item, mode, 32);
287
BTRFS_SETGET_STACK_FUNCS(stack_inode_rdev, struct btrfs_inode_item, rdev, 64);
288
BTRFS_SETGET_STACK_FUNCS(stack_inode_flags, struct btrfs_inode_item, flags, 64);
289
BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_timespec, sec, 64);
290
BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
291
BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec, sec, 64);
292
BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec, nsec, 32);
293
294
BTRFS_SETGET_FUNCS(raid_stride_devid, struct btrfs_raid_stride, devid, 64);
295
BTRFS_SETGET_FUNCS(raid_stride_physical, struct btrfs_raid_stride, physical, 64);
296
BTRFS_SETGET_STACK_FUNCS(stack_raid_stride_devid, struct btrfs_raid_stride, devid, 64);
297
BTRFS_SETGET_STACK_FUNCS(stack_raid_stride_physical, struct btrfs_raid_stride, physical, 64);
298
299
/* struct btrfs_dev_extent */
300
BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent, chunk_tree, 64);
301
BTRFS_SETGET_FUNCS(dev_extent_chunk_objectid, struct btrfs_dev_extent,
302
chunk_objectid, 64);
303
BTRFS_SETGET_FUNCS(dev_extent_chunk_offset, struct btrfs_dev_extent,
304
chunk_offset, 64);
305
BTRFS_SETGET_FUNCS(dev_extent_length, struct btrfs_dev_extent, length, 64);
306
BTRFS_SETGET_STACK_FUNCS(stack_dev_extent_chunk_tree, struct btrfs_dev_extent,
307
chunk_tree, 64);
308
BTRFS_SETGET_STACK_FUNCS(stack_dev_extent_chunk_objectid, struct btrfs_dev_extent,
309
chunk_objectid, 64);
310
BTRFS_SETGET_STACK_FUNCS(stack_dev_extent_chunk_offset, struct btrfs_dev_extent,
311
chunk_offset, 64);
312
BTRFS_SETGET_STACK_FUNCS(stack_dev_extent_length, struct btrfs_dev_extent, length, 64);
313
314
BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 64);
315
BTRFS_SETGET_FUNCS(extent_generation, struct btrfs_extent_item, generation, 64);
316
BTRFS_SETGET_FUNCS(extent_flags, struct btrfs_extent_item, flags, 64);
317
318
BTRFS_SETGET_FUNCS(tree_block_level, struct btrfs_tree_block_info, level, 8);
319
320
static inline void btrfs_tree_block_key(const struct extent_buffer *eb,
321
struct btrfs_tree_block_info *item,
322
struct btrfs_disk_key *key)
323
{
324
read_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
325
}
326
327
static inline void btrfs_set_tree_block_key(const struct extent_buffer *eb,
328
struct btrfs_tree_block_info *item,
329
const struct btrfs_disk_key *key)
330
{
331
write_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
332
}
333
334
BTRFS_SETGET_FUNCS(extent_data_ref_root, struct btrfs_extent_data_ref, root, 64);
335
BTRFS_SETGET_FUNCS(extent_data_ref_objectid, struct btrfs_extent_data_ref,
336
objectid, 64);
337
BTRFS_SETGET_FUNCS(extent_data_ref_offset, struct btrfs_extent_data_ref,
338
offset, 64);
339
BTRFS_SETGET_FUNCS(extent_data_ref_count, struct btrfs_extent_data_ref, count, 32);
340
341
BTRFS_SETGET_FUNCS(shared_data_ref_count, struct btrfs_shared_data_ref, count, 32);
342
343
BTRFS_SETGET_FUNCS(extent_owner_ref_root_id, struct btrfs_extent_owner_ref,
344
root_id, 64);
345
346
BTRFS_SETGET_FUNCS(extent_inline_ref_type, struct btrfs_extent_inline_ref,
347
type, 8);
348
BTRFS_SETGET_FUNCS(extent_inline_ref_offset, struct btrfs_extent_inline_ref,
349
offset, 64);
350
351
static inline u32 btrfs_extent_inline_ref_size(int type)
352
{
353
if (type == BTRFS_TREE_BLOCK_REF_KEY ||
354
type == BTRFS_SHARED_BLOCK_REF_KEY)
355
return sizeof(struct btrfs_extent_inline_ref);
356
if (type == BTRFS_SHARED_DATA_REF_KEY)
357
return sizeof(struct btrfs_shared_data_ref) +
358
sizeof(struct btrfs_extent_inline_ref);
359
if (type == BTRFS_EXTENT_DATA_REF_KEY)
360
return sizeof(struct btrfs_extent_data_ref) +
361
offsetof(struct btrfs_extent_inline_ref, offset);
362
if (type == BTRFS_EXTENT_OWNER_REF_KEY)
363
return sizeof(struct btrfs_extent_inline_ref);
364
return 0;
365
}
366
367
/* struct btrfs_node */
368
BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64);
369
BTRFS_SETGET_FUNCS(key_generation, struct btrfs_key_ptr, generation, 64);
370
BTRFS_SETGET_STACK_FUNCS(stack_key_blockptr, struct btrfs_key_ptr, blockptr, 64);
371
BTRFS_SETGET_STACK_FUNCS(stack_key_generation, struct btrfs_key_ptr,
372
generation, 64);
373
374
static inline u64 btrfs_node_blockptr(const struct extent_buffer *eb, int nr)
375
{
376
unsigned long ptr;
377
378
ptr = offsetof(struct btrfs_node, ptrs) +
379
sizeof(struct btrfs_key_ptr) * nr;
380
return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr);
381
}
382
383
static inline void btrfs_set_node_blockptr(const struct extent_buffer *eb,
384
int nr, u64 val)
385
{
386
unsigned long ptr;
387
388
ptr = offsetof(struct btrfs_node, ptrs) +
389
sizeof(struct btrfs_key_ptr) * nr;
390
btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val);
391
}
392
393
static inline u64 btrfs_node_ptr_generation(const struct extent_buffer *eb, int nr)
394
{
395
unsigned long ptr;
396
397
ptr = offsetof(struct btrfs_node, ptrs) +
398
sizeof(struct btrfs_key_ptr) * nr;
399
return btrfs_key_generation(eb, (struct btrfs_key_ptr *)ptr);
400
}
401
402
static inline void btrfs_set_node_ptr_generation(const struct extent_buffer *eb,
403
int nr, u64 val)
404
{
405
unsigned long ptr;
406
407
ptr = offsetof(struct btrfs_node, ptrs) +
408
sizeof(struct btrfs_key_ptr) * nr;
409
btrfs_set_key_generation(eb, (struct btrfs_key_ptr *)ptr, val);
410
}
411
412
static inline unsigned long btrfs_node_key_ptr_offset(const struct extent_buffer *eb, int nr)
413
{
414
return offsetof(struct btrfs_node, ptrs) +
415
sizeof(struct btrfs_key_ptr) * nr;
416
}
417
418
void btrfs_node_key(const struct extent_buffer *eb,
419
struct btrfs_disk_key *disk_key, int nr);
420
421
static inline void btrfs_set_node_key(const struct extent_buffer *eb,
422
const struct btrfs_disk_key *disk_key, int nr)
423
{
424
unsigned long ptr;
425
426
ptr = btrfs_node_key_ptr_offset(eb, nr);
427
write_eb_member(eb, (struct btrfs_key_ptr *)ptr,
428
struct btrfs_key_ptr, key, disk_key);
429
}
430
431
/* struct btrfs_item */
432
BTRFS_SETGET_FUNCS(raw_item_offset, struct btrfs_item, offset, 32);
433
BTRFS_SETGET_FUNCS(raw_item_size, struct btrfs_item, size, 32);
434
BTRFS_SETGET_STACK_FUNCS(stack_item_offset, struct btrfs_item, offset, 32);
435
BTRFS_SETGET_STACK_FUNCS(stack_item_size, struct btrfs_item, size, 32);
436
437
static inline unsigned long btrfs_item_nr_offset(const struct extent_buffer *eb, int nr)
438
{
439
return offsetof(struct btrfs_leaf, items) +
440
sizeof(struct btrfs_item) * nr;
441
}
442
443
static inline struct btrfs_item *btrfs_item_nr(const struct extent_buffer *eb, int nr)
444
{
445
return (struct btrfs_item *)btrfs_item_nr_offset(eb, nr);
446
}
447
448
#define BTRFS_ITEM_SETGET_FUNCS(member) \
449
static inline u32 btrfs_item_##member(const struct extent_buffer *eb, int slot) \
450
{ \
451
return btrfs_raw_item_##member(eb, btrfs_item_nr(eb, slot)); \
452
} \
453
static inline void btrfs_set_item_##member(const struct extent_buffer *eb, \
454
int slot, u32 val) \
455
{ \
456
btrfs_set_raw_item_##member(eb, btrfs_item_nr(eb, slot), val); \
457
}
458
459
BTRFS_ITEM_SETGET_FUNCS(offset)
460
BTRFS_ITEM_SETGET_FUNCS(size);
461
462
static inline u32 btrfs_item_data_end(const struct extent_buffer *eb, int nr)
463
{
464
return btrfs_item_offset(eb, nr) + btrfs_item_size(eb, nr);
465
}
466
467
static inline void btrfs_item_key(const struct extent_buffer *eb,
468
struct btrfs_disk_key *disk_key, int nr)
469
{
470
struct btrfs_item *item = btrfs_item_nr(eb, nr);
471
472
read_eb_member(eb, item, struct btrfs_item, key, disk_key);
473
}
474
475
static inline void btrfs_set_item_key(struct extent_buffer *eb,
476
const struct btrfs_disk_key *disk_key, int nr)
477
{
478
struct btrfs_item *item = btrfs_item_nr(eb, nr);
479
480
write_eb_member(eb, item, struct btrfs_item, key, disk_key);
481
}
482
483
BTRFS_SETGET_FUNCS(dir_log_end, struct btrfs_dir_log_item, end, 64);
484
485
/* struct btrfs_root_ref */
486
BTRFS_SETGET_FUNCS(root_ref_dirid, struct btrfs_root_ref, dirid, 64);
487
BTRFS_SETGET_FUNCS(root_ref_sequence, struct btrfs_root_ref, sequence, 64);
488
BTRFS_SETGET_FUNCS(root_ref_name_len, struct btrfs_root_ref, name_len, 16);
489
BTRFS_SETGET_STACK_FUNCS(stack_root_ref_dirid, struct btrfs_root_ref, dirid, 64);
490
BTRFS_SETGET_STACK_FUNCS(stack_root_ref_sequence, struct btrfs_root_ref, sequence, 64);
491
BTRFS_SETGET_STACK_FUNCS(stack_root_ref_name_len, struct btrfs_root_ref, name_len, 16);
492
493
/* struct btrfs_dir_item */
494
BTRFS_SETGET_FUNCS(dir_data_len, struct btrfs_dir_item, data_len, 16);
495
BTRFS_SETGET_FUNCS(dir_flags, struct btrfs_dir_item, type, 8);
496
BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16);
497
BTRFS_SETGET_FUNCS(dir_transid, struct btrfs_dir_item, transid, 64);
498
BTRFS_SETGET_STACK_FUNCS(stack_dir_flags, struct btrfs_dir_item, type, 8);
499
BTRFS_SETGET_STACK_FUNCS(stack_dir_data_len, struct btrfs_dir_item, data_len, 16);
500
BTRFS_SETGET_STACK_FUNCS(stack_dir_name_len, struct btrfs_dir_item, name_len, 16);
501
BTRFS_SETGET_STACK_FUNCS(stack_dir_transid, struct btrfs_dir_item, transid, 64);
502
503
static inline u8 btrfs_dir_ftype(const struct extent_buffer *eb,
504
const struct btrfs_dir_item *item)
505
{
506
return btrfs_dir_flags_to_ftype(btrfs_dir_flags(eb, item));
507
}
508
509
static inline u8 btrfs_stack_dir_ftype(const struct btrfs_dir_item *item)
510
{
511
return btrfs_dir_flags_to_ftype(btrfs_stack_dir_flags(item));
512
}
513
514
static inline void btrfs_dir_item_key(const struct extent_buffer *eb,
515
const struct btrfs_dir_item *item,
516
struct btrfs_disk_key *key)
517
{
518
read_eb_member(eb, item, struct btrfs_dir_item, location, key);
519
}
520
521
static inline void btrfs_set_dir_item_key(struct extent_buffer *eb,
522
struct btrfs_dir_item *item,
523
const struct btrfs_disk_key *key)
524
{
525
write_eb_member(eb, item, struct btrfs_dir_item, location, key);
526
}
527
528
BTRFS_SETGET_FUNCS(free_space_entries, struct btrfs_free_space_header,
529
num_entries, 64);
530
BTRFS_SETGET_FUNCS(free_space_bitmaps, struct btrfs_free_space_header,
531
num_bitmaps, 64);
532
BTRFS_SETGET_FUNCS(free_space_generation, struct btrfs_free_space_header,
533
generation, 64);
534
535
static inline void btrfs_free_space_key(const struct extent_buffer *eb,
536
const struct btrfs_free_space_header *h,
537
struct btrfs_disk_key *key)
538
{
539
read_eb_member(eb, h, struct btrfs_free_space_header, location, key);
540
}
541
542
static inline void btrfs_set_free_space_key(struct extent_buffer *eb,
543
struct btrfs_free_space_header *h,
544
const struct btrfs_disk_key *key)
545
{
546
write_eb_member(eb, h, struct btrfs_free_space_header, location, key);
547
}
548
549
/* struct btrfs_disk_key */
550
BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key, objectid, 64);
551
BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64);
552
BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8);
553
554
#ifdef __LITTLE_ENDIAN
555
556
/*
557
* Optimized helpers for little-endian architectures where CPU and on-disk
558
* structures have the same endianness and we can skip conversions.
559
*/
560
561
static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu_key,
562
const struct btrfs_disk_key *disk_key)
563
{
564
memcpy(cpu_key, disk_key, sizeof(struct btrfs_key));
565
}
566
567
static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk_key,
568
const struct btrfs_key *cpu_key)
569
{
570
memcpy(disk_key, cpu_key, sizeof(struct btrfs_key));
571
}
572
573
static inline void btrfs_node_key_to_cpu(const struct extent_buffer *eb,
574
struct btrfs_key *cpu_key, int nr)
575
{
576
struct btrfs_disk_key *disk_key = (struct btrfs_disk_key *)cpu_key;
577
578
btrfs_node_key(eb, disk_key, nr);
579
}
580
581
static inline void btrfs_item_key_to_cpu(const struct extent_buffer *eb,
582
struct btrfs_key *cpu_key, int nr)
583
{
584
struct btrfs_disk_key *disk_key = (struct btrfs_disk_key *)cpu_key;
585
586
btrfs_item_key(eb, disk_key, nr);
587
}
588
589
static inline void btrfs_dir_item_key_to_cpu(const struct extent_buffer *eb,
590
const struct btrfs_dir_item *item,
591
struct btrfs_key *cpu_key)
592
{
593
struct btrfs_disk_key *disk_key = (struct btrfs_disk_key *)cpu_key;
594
595
btrfs_dir_item_key(eb, item, disk_key);
596
}
597
598
#else
599
600
static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
601
const struct btrfs_disk_key *disk)
602
{
603
cpu->offset = le64_to_cpu(disk->offset);
604
cpu->type = disk->type;
605
cpu->objectid = le64_to_cpu(disk->objectid);
606
}
607
608
static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
609
const struct btrfs_key *cpu)
610
{
611
disk->offset = cpu_to_le64(cpu->offset);
612
disk->type = cpu->type;
613
disk->objectid = cpu_to_le64(cpu->objectid);
614
}
615
616
static inline void btrfs_node_key_to_cpu(const struct extent_buffer *eb,
617
struct btrfs_key *key, int nr)
618
{
619
struct btrfs_disk_key disk_key;
620
621
btrfs_node_key(eb, &disk_key, nr);
622
btrfs_disk_key_to_cpu(key, &disk_key);
623
}
624
625
static inline void btrfs_item_key_to_cpu(const struct extent_buffer *eb,
626
struct btrfs_key *key, int nr)
627
{
628
struct btrfs_disk_key disk_key;
629
630
btrfs_item_key(eb, &disk_key, nr);
631
btrfs_disk_key_to_cpu(key, &disk_key);
632
}
633
634
static inline void btrfs_dir_item_key_to_cpu(const struct extent_buffer *eb,
635
const struct btrfs_dir_item *item,
636
struct btrfs_key *key)
637
{
638
struct btrfs_disk_key disk_key;
639
640
btrfs_dir_item_key(eb, item, &disk_key);
641
btrfs_disk_key_to_cpu(key, &disk_key);
642
}
643
644
#endif
645
646
/* struct btrfs_header */
647
BTRFS_SETGET_HEADER_FUNCS(header_bytenr, struct btrfs_header, bytenr, 64);
648
BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header, generation, 64);
649
BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64);
650
BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32);
651
BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 64);
652
BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8);
653
BTRFS_SETGET_STACK_FUNCS(stack_header_generation, struct btrfs_header,
654
generation, 64);
655
BTRFS_SETGET_STACK_FUNCS(stack_header_owner, struct btrfs_header, owner, 64);
656
BTRFS_SETGET_STACK_FUNCS(stack_header_nritems, struct btrfs_header, nritems, 32);
657
BTRFS_SETGET_STACK_FUNCS(stack_header_bytenr, struct btrfs_header, bytenr, 64);
658
659
static inline int btrfs_header_flag(const struct extent_buffer *eb, u64 flag)
660
{
661
return (btrfs_header_flags(eb) & flag) == flag;
662
}
663
664
static inline void btrfs_set_header_flag(struct extent_buffer *eb, u64 flag)
665
{
666
u64 flags = btrfs_header_flags(eb);
667
668
btrfs_set_header_flags(eb, flags | flag);
669
}
670
671
static inline void btrfs_clear_header_flag(struct extent_buffer *eb, u64 flag)
672
{
673
u64 flags = btrfs_header_flags(eb);
674
675
btrfs_set_header_flags(eb, flags & ~flag);
676
}
677
678
static inline int btrfs_header_backref_rev(const struct extent_buffer *eb)
679
{
680
u64 flags = btrfs_header_flags(eb);
681
682
return flags >> BTRFS_BACKREF_REV_SHIFT;
683
}
684
685
static inline void btrfs_set_header_backref_rev(struct extent_buffer *eb, int rev)
686
{
687
u64 flags = btrfs_header_flags(eb);
688
689
flags &= ~BTRFS_BACKREF_REV_MASK;
690
flags |= (u64)rev << BTRFS_BACKREF_REV_SHIFT;
691
btrfs_set_header_flags(eb, flags);
692
}
693
694
static inline int btrfs_is_leaf(const struct extent_buffer *eb)
695
{
696
return btrfs_header_level(eb) == 0;
697
}
698
699
/* struct btrfs_root_item */
700
BTRFS_SETGET_FUNCS(disk_root_generation, struct btrfs_root_item, generation, 64);
701
BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32);
702
BTRFS_SETGET_FUNCS(disk_root_bytenr, struct btrfs_root_item, bytenr, 64);
703
BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
704
705
BTRFS_SETGET_STACK_FUNCS(root_generation, struct btrfs_root_item, generation, 64);
706
BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
707
BTRFS_SETGET_STACK_FUNCS(root_drop_level, struct btrfs_root_item, drop_level, 8);
708
BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
709
BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
710
BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
711
BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 64);
712
BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
713
BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
714
BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
715
last_snapshot, 64);
716
BTRFS_SETGET_STACK_FUNCS(root_generation_v2, struct btrfs_root_item,
717
generation_v2, 64);
718
BTRFS_SETGET_STACK_FUNCS(root_ctransid, struct btrfs_root_item, ctransid, 64);
719
BTRFS_SETGET_STACK_FUNCS(root_otransid, struct btrfs_root_item, otransid, 64);
720
BTRFS_SETGET_STACK_FUNCS(root_stransid, struct btrfs_root_item, stransid, 64);
721
BTRFS_SETGET_STACK_FUNCS(root_rtransid, struct btrfs_root_item, rtransid, 64);
722
723
/* struct btrfs_root_backup */
724
BTRFS_SETGET_STACK_FUNCS(backup_tree_root, struct btrfs_root_backup,
725
tree_root, 64);
726
BTRFS_SETGET_STACK_FUNCS(backup_tree_root_gen, struct btrfs_root_backup,
727
tree_root_gen, 64);
728
BTRFS_SETGET_STACK_FUNCS(backup_tree_root_level, struct btrfs_root_backup,
729
tree_root_level, 8);
730
731
BTRFS_SETGET_STACK_FUNCS(backup_chunk_root, struct btrfs_root_backup,
732
chunk_root, 64);
733
BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_gen, struct btrfs_root_backup,
734
chunk_root_gen, 64);
735
BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_level, struct btrfs_root_backup,
736
chunk_root_level, 8);
737
738
BTRFS_SETGET_STACK_FUNCS(backup_extent_root, struct btrfs_root_backup,
739
extent_root, 64);
740
BTRFS_SETGET_STACK_FUNCS(backup_extent_root_gen, struct btrfs_root_backup,
741
extent_root_gen, 64);
742
BTRFS_SETGET_STACK_FUNCS(backup_extent_root_level, struct btrfs_root_backup,
743
extent_root_level, 8);
744
745
BTRFS_SETGET_STACK_FUNCS(backup_fs_root, struct btrfs_root_backup,
746
fs_root, 64);
747
BTRFS_SETGET_STACK_FUNCS(backup_fs_root_gen, struct btrfs_root_backup,
748
fs_root_gen, 64);
749
BTRFS_SETGET_STACK_FUNCS(backup_fs_root_level, struct btrfs_root_backup,
750
fs_root_level, 8);
751
752
BTRFS_SETGET_STACK_FUNCS(backup_dev_root, struct btrfs_root_backup,
753
dev_root, 64);
754
BTRFS_SETGET_STACK_FUNCS(backup_dev_root_gen, struct btrfs_root_backup,
755
dev_root_gen, 64);
756
BTRFS_SETGET_STACK_FUNCS(backup_dev_root_level, struct btrfs_root_backup,
757
dev_root_level, 8);
758
759
BTRFS_SETGET_STACK_FUNCS(backup_csum_root, struct btrfs_root_backup,
760
csum_root, 64);
761
BTRFS_SETGET_STACK_FUNCS(backup_csum_root_gen, struct btrfs_root_backup,
762
csum_root_gen, 64);
763
BTRFS_SETGET_STACK_FUNCS(backup_csum_root_level, struct btrfs_root_backup,
764
csum_root_level, 8);
765
BTRFS_SETGET_STACK_FUNCS(backup_total_bytes, struct btrfs_root_backup,
766
total_bytes, 64);
767
BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup,
768
bytes_used, 64);
769
BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup,
770
num_devices, 64);
771
772
/* struct btrfs_balance_item */
773
BTRFS_SETGET_FUNCS(balance_flags, struct btrfs_balance_item, flags, 64);
774
775
static inline void btrfs_balance_data(const struct extent_buffer *eb,
776
const struct btrfs_balance_item *bi,
777
struct btrfs_disk_balance_args *ba)
778
{
779
read_eb_member(eb, bi, struct btrfs_balance_item, data, ba);
780
}
781
782
static inline void btrfs_set_balance_data(struct extent_buffer *eb,
783
struct btrfs_balance_item *bi,
784
const struct btrfs_disk_balance_args *ba)
785
{
786
write_eb_member(eb, bi, struct btrfs_balance_item, data, ba);
787
}
788
789
static inline void btrfs_balance_meta(const struct extent_buffer *eb,
790
const struct btrfs_balance_item *bi,
791
struct btrfs_disk_balance_args *ba)
792
{
793
read_eb_member(eb, bi, struct btrfs_balance_item, meta, ba);
794
}
795
796
static inline void btrfs_set_balance_meta(struct extent_buffer *eb,
797
struct btrfs_balance_item *bi,
798
const struct btrfs_disk_balance_args *ba)
799
{
800
write_eb_member(eb, bi, struct btrfs_balance_item, meta, ba);
801
}
802
803
static inline void btrfs_balance_sys(const struct extent_buffer *eb,
804
const struct btrfs_balance_item *bi,
805
struct btrfs_disk_balance_args *ba)
806
{
807
read_eb_member(eb, bi, struct btrfs_balance_item, sys, ba);
808
}
809
810
static inline void btrfs_set_balance_sys(struct extent_buffer *eb,
811
struct btrfs_balance_item *bi,
812
const struct btrfs_disk_balance_args *ba)
813
{
814
write_eb_member(eb, bi, struct btrfs_balance_item, sys, ba);
815
}
816
817
/* struct btrfs_super_block */
818
BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
819
BTRFS_SETGET_STACK_FUNCS(super_flags, struct btrfs_super_block, flags, 64);
820
BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
821
generation, 64);
822
BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
823
BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
824
struct btrfs_super_block, sys_chunk_array_size, 32);
825
BTRFS_SETGET_STACK_FUNCS(super_chunk_root_generation,
826
struct btrfs_super_block, chunk_root_generation, 64);
827
BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
828
root_level, 8);
829
BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
830
chunk_root, 64);
831
BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
832
chunk_root_level, 8);
833
BTRFS_SETGET_STACK_FUNCS(super_log_root, struct btrfs_super_block, log_root, 64);
834
BTRFS_SETGET_STACK_FUNCS(super_log_root_level, struct btrfs_super_block,
835
log_root_level, 8);
836
BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
837
total_bytes, 64);
838
BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
839
bytes_used, 64);
840
BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
841
sectorsize, 32);
842
BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
843
nodesize, 32);
844
BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
845
stripesize, 32);
846
BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
847
root_dir_objectid, 64);
848
BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block,
849
num_devices, 64);
850
BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block,
851
compat_flags, 64);
852
BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block,
853
compat_ro_flags, 64);
854
BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block,
855
incompat_flags, 64);
856
BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block,
857
csum_type, 16);
858
BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
859
cache_generation, 64);
860
BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
861
BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
862
uuid_tree_generation, 64);
863
BTRFS_SETGET_STACK_FUNCS(super_nr_global_roots, struct btrfs_super_block,
864
nr_global_roots, 64);
865
866
/* struct btrfs_file_extent_item */
867
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_type, struct btrfs_file_extent_item,
868
type, 8);
869
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_bytenr,
870
struct btrfs_file_extent_item, disk_bytenr, 64);
871
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_offset,
872
struct btrfs_file_extent_item, offset, 64);
873
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_generation,
874
struct btrfs_file_extent_item, generation, 64);
875
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_num_bytes,
876
struct btrfs_file_extent_item, num_bytes, 64);
877
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_ram_bytes,
878
struct btrfs_file_extent_item, ram_bytes, 64);
879
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_num_bytes,
880
struct btrfs_file_extent_item, disk_num_bytes, 64);
881
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_compression,
882
struct btrfs_file_extent_item, compression, 8);
883
884
885
BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
886
BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
887
disk_bytenr, 64);
888
BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item,
889
generation, 64);
890
BTRFS_SETGET_FUNCS(file_extent_disk_num_bytes, struct btrfs_file_extent_item,
891
disk_num_bytes, 64);
892
BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item,
893
offset, 64);
894
BTRFS_SETGET_FUNCS(file_extent_num_bytes, struct btrfs_file_extent_item,
895
num_bytes, 64);
896
BTRFS_SETGET_FUNCS(file_extent_ram_bytes, struct btrfs_file_extent_item,
897
ram_bytes, 64);
898
BTRFS_SETGET_FUNCS(file_extent_compression, struct btrfs_file_extent_item,
899
compression, 8);
900
BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item,
901
encryption, 8);
902
BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item,
903
other_encoding, 16);
904
905
/* btrfs_qgroup_status_item */
906
BTRFS_SETGET_FUNCS(qgroup_status_generation, struct btrfs_qgroup_status_item,
907
generation, 64);
908
BTRFS_SETGET_FUNCS(qgroup_status_version, struct btrfs_qgroup_status_item,
909
version, 64);
910
BTRFS_SETGET_FUNCS(qgroup_status_flags, struct btrfs_qgroup_status_item,
911
flags, 64);
912
BTRFS_SETGET_FUNCS(qgroup_status_rescan, struct btrfs_qgroup_status_item,
913
rescan, 64);
914
BTRFS_SETGET_FUNCS(qgroup_status_enable_gen, struct btrfs_qgroup_status_item,
915
enable_gen, 64);
916
917
/* btrfs_qgroup_info_item */
918
BTRFS_SETGET_FUNCS(qgroup_info_generation, struct btrfs_qgroup_info_item,
919
generation, 64);
920
BTRFS_SETGET_FUNCS(qgroup_info_rfer, struct btrfs_qgroup_info_item, rfer, 64);
921
BTRFS_SETGET_FUNCS(qgroup_info_rfer_cmpr, struct btrfs_qgroup_info_item,
922
rfer_cmpr, 64);
923
BTRFS_SETGET_FUNCS(qgroup_info_excl, struct btrfs_qgroup_info_item, excl, 64);
924
BTRFS_SETGET_FUNCS(qgroup_info_excl_cmpr, struct btrfs_qgroup_info_item,
925
excl_cmpr, 64);
926
927
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_generation,
928
struct btrfs_qgroup_info_item, generation, 64);
929
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_rfer, struct btrfs_qgroup_info_item,
930
rfer, 64);
931
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_rfer_cmpr,
932
struct btrfs_qgroup_info_item, rfer_cmpr, 64);
933
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_excl, struct btrfs_qgroup_info_item,
934
excl, 64);
935
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_excl_cmpr,
936
struct btrfs_qgroup_info_item, excl_cmpr, 64);
937
938
/* btrfs_qgroup_limit_item */
939
BTRFS_SETGET_FUNCS(qgroup_limit_flags, struct btrfs_qgroup_limit_item, flags, 64);
940
BTRFS_SETGET_FUNCS(qgroup_limit_max_rfer, struct btrfs_qgroup_limit_item,
941
max_rfer, 64);
942
BTRFS_SETGET_FUNCS(qgroup_limit_max_excl, struct btrfs_qgroup_limit_item,
943
max_excl, 64);
944
BTRFS_SETGET_FUNCS(qgroup_limit_rsv_rfer, struct btrfs_qgroup_limit_item,
945
rsv_rfer, 64);
946
BTRFS_SETGET_FUNCS(qgroup_limit_rsv_excl, struct btrfs_qgroup_limit_item,
947
rsv_excl, 64);
948
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_flags,
949
struct btrfs_qgroup_limit_item, flags, 64);
950
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_max_rfer,
951
struct btrfs_qgroup_limit_item, max_rfer, 64);
952
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_max_excl,
953
struct btrfs_qgroup_limit_item, max_excl, 64);
954
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_rfer,
955
struct btrfs_qgroup_limit_item, rsv_rfer, 64);
956
BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_excl,
957
struct btrfs_qgroup_limit_item, rsv_excl, 64);
958
959
/* btrfs_dev_replace_item */
960
BTRFS_SETGET_FUNCS(dev_replace_src_devid,
961
struct btrfs_dev_replace_item, src_devid, 64);
962
BTRFS_SETGET_FUNCS(dev_replace_cont_reading_from_srcdev_mode,
963
struct btrfs_dev_replace_item, cont_reading_from_srcdev_mode,
964
64);
965
BTRFS_SETGET_FUNCS(dev_replace_replace_state, struct btrfs_dev_replace_item,
966
replace_state, 64);
967
BTRFS_SETGET_FUNCS(dev_replace_time_started, struct btrfs_dev_replace_item,
968
time_started, 64);
969
BTRFS_SETGET_FUNCS(dev_replace_time_stopped, struct btrfs_dev_replace_item,
970
time_stopped, 64);
971
BTRFS_SETGET_FUNCS(dev_replace_num_write_errors, struct btrfs_dev_replace_item,
972
num_write_errors, 64);
973
BTRFS_SETGET_FUNCS(dev_replace_num_uncorrectable_read_errors,
974
struct btrfs_dev_replace_item, num_uncorrectable_read_errors,
975
64);
976
BTRFS_SETGET_FUNCS(dev_replace_cursor_left, struct btrfs_dev_replace_item,
977
cursor_left, 64);
978
BTRFS_SETGET_FUNCS(dev_replace_cursor_right, struct btrfs_dev_replace_item,
979
cursor_right, 64);
980
981
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_src_devid,
982
struct btrfs_dev_replace_item, src_devid, 64);
983
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cont_reading_from_srcdev_mode,
984
struct btrfs_dev_replace_item,
985
cont_reading_from_srcdev_mode, 64);
986
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_replace_state,
987
struct btrfs_dev_replace_item, replace_state, 64);
988
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_time_started,
989
struct btrfs_dev_replace_item, time_started, 64);
990
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_time_stopped,
991
struct btrfs_dev_replace_item, time_stopped, 64);
992
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_num_write_errors,
993
struct btrfs_dev_replace_item, num_write_errors, 64);
994
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_num_uncorrectable_read_errors,
995
struct btrfs_dev_replace_item,
996
num_uncorrectable_read_errors, 64);
997
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cursor_left,
998
struct btrfs_dev_replace_item, cursor_left, 64);
999
BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cursor_right,
1000
struct btrfs_dev_replace_item, cursor_right, 64);
1001
1002
/* btrfs_verity_descriptor_item */
1003
BTRFS_SETGET_FUNCS(verity_descriptor_encryption, struct btrfs_verity_descriptor_item,
1004
encryption, 8);
1005
BTRFS_SETGET_FUNCS(verity_descriptor_size, struct btrfs_verity_descriptor_item,
1006
size, 64);
1007
BTRFS_SETGET_STACK_FUNCS(stack_verity_descriptor_encryption,
1008
struct btrfs_verity_descriptor_item, encryption, 8);
1009
BTRFS_SETGET_STACK_FUNCS(stack_verity_descriptor_size,
1010
struct btrfs_verity_descriptor_item, size, 64);
1011
1012
/* Cast into the data area of the leaf. */
1013
#define btrfs_item_ptr(leaf, slot, type) \
1014
((type *)(btrfs_item_nr_offset(leaf, 0) + btrfs_item_offset(leaf, slot)))
1015
1016
#define btrfs_item_ptr_offset(leaf, slot) \
1017
((unsigned long)(btrfs_item_nr_offset(leaf, 0) + btrfs_item_offset(leaf, slot)))
1018
1019
#endif
1020
1021