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