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