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