Lines Matching +full:slot +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0
20 #include <linux/error-injection.h>
23 #include "tree-checker.h"
29 #include "file-item.h"
30 #include "inode-item.h"
31 #include "dir-item.h"
32 #include "extent-tree.h"
51 * Append generic "corrupt leaf/node root=%llu block=%llu slot=%d: " to @fmt.
56 static void generic_err(const struct extent_buffer *eb, int slot, in generic_err() argument
59 const struct btrfs_fs_info *fs_info = eb->fs_info; in generic_err()
68 dump_page(folio_page(eb->folios[0], 0), "eb page dump"); in generic_err()
70 "corrupt %s: root=%llu block=%llu slot=%d, %pV", in generic_err()
72 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, &vaf); in generic_err()
82 static void file_extent_err(const struct extent_buffer *eb, int slot, in file_extent_err() argument
85 const struct btrfs_fs_info *fs_info = eb->fs_info; in file_extent_err()
90 btrfs_item_key_to_cpu(eb, &key, slot); in file_extent_err()
96 dump_page(folio_page(eb->folios[0], 0), "eb page dump"); in file_extent_err()
98 "corrupt %s: root=%llu block=%llu slot=%d ino=%llu file_offset=%llu, %pV", in file_extent_err()
100 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in file_extent_err()
109 #define CHECK_FE_ALIGNED(leaf, slot, fi, name, alignment) \ argument
113 file_extent_err((leaf), (slot), \
129 end = ALIGN(key->offset + len, leaf->fs_info->sectorsize); in file_extent_end()
132 end = key->offset + len; in file_extent_end()
139 * key->objectid, which represents inode number
143 static void dir_item_err(const struct extent_buffer *eb, int slot, in dir_item_err() argument
146 const struct btrfs_fs_info *fs_info = eb->fs_info; in dir_item_err()
151 btrfs_item_key_to_cpu(eb, &key, slot); in dir_item_err()
157 dump_page(folio_page(eb->folios[0], 0), "eb page dump"); in dir_item_err()
159 "corrupt %s: root=%llu block=%llu slot=%d ino=%llu, %pV", in dir_item_err()
161 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in dir_item_err()
167 * This functions checks prev_key->objectid, to ensure current key and prev_key
176 struct btrfs_key *key, int slot, in check_prev_ino() argument
180 if (slot == 0) in check_prev_ino()
183 /* Only these key->types needs to be checked */ in check_prev_ino()
184 ASSERT(key->type == BTRFS_XATTR_ITEM_KEY || in check_prev_ino()
185 key->type == BTRFS_INODE_REF_KEY || in check_prev_ino()
186 key->type == BTRFS_DIR_INDEX_KEY || in check_prev_ino()
187 key->type == BTRFS_DIR_ITEM_KEY || in check_prev_ino()
188 key->type == BTRFS_EXTENT_DATA_KEY); in check_prev_ino()
197 if (key->objectid == prev_key->objectid) in check_prev_ino()
201 dir_item_err(leaf, slot, in check_prev_ino()
203 prev_key->objectid, key->objectid); in check_prev_ino()
207 struct btrfs_key *key, int slot, in check_extent_data_item() argument
210 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_extent_data_item()
212 u32 sectorsize = fs_info->sectorsize; in check_extent_data_item()
213 u32 item_size = btrfs_item_size(leaf, slot); in check_extent_data_item()
216 if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) { in check_extent_data_item()
217 file_extent_err(leaf, slot, in check_extent_data_item()
219 key->offset, sectorsize); in check_extent_data_item()
220 return -EUCLEAN; in check_extent_data_item()
224 * Previous key must have the same key->objectid (ino). in check_extent_data_item()
229 if (unlikely(!check_prev_ino(leaf, key, slot, prev_key))) in check_extent_data_item()
230 return -EUCLEAN; in check_extent_data_item()
232 fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item); in check_extent_data_item()
239 file_extent_err(leaf, slot, in check_extent_data_item()
240 "invalid item size, have %u expect [%zu, %u)", in check_extent_data_item()
243 return -EUCLEAN; in check_extent_data_item()
247 file_extent_err(leaf, slot, in check_extent_data_item()
250 BTRFS_NR_FILE_EXTENT_TYPES - 1); in check_extent_data_item()
251 return -EUCLEAN; in check_extent_data_item()
260 file_extent_err(leaf, slot, in check_extent_data_item()
263 BTRFS_NR_COMPRESS_TYPES - 1); in check_extent_data_item()
264 return -EUCLEAN; in check_extent_data_item()
267 file_extent_err(leaf, slot, in check_extent_data_item()
270 return -EUCLEAN; in check_extent_data_item()
274 if (unlikely(key->offset)) { in check_extent_data_item()
275 file_extent_err(leaf, slot, in check_extent_data_item()
277 key->offset); in check_extent_data_item()
278 return -EUCLEAN; in check_extent_data_item()
281 /* Compressed inline extent has no on-disk size, skip it */ in check_extent_data_item()
286 /* Uncompressed inline extent size must match item size */ in check_extent_data_item()
289 file_extent_err(leaf, slot, in check_extent_data_item()
293 return -EUCLEAN; in check_extent_data_item()
298 /* Regular or preallocated extent has fixed item size */ in check_extent_data_item()
300 file_extent_err(leaf, slot, in check_extent_data_item()
301 "invalid item size for reg/prealloc file extent, have %u expect %zu", in check_extent_data_item()
303 return -EUCLEAN; in check_extent_data_item()
305 if (unlikely(CHECK_FE_ALIGNED(leaf, slot, fi, ram_bytes, sectorsize) || in check_extent_data_item()
306 CHECK_FE_ALIGNED(leaf, slot, fi, disk_bytenr, sectorsize) || in check_extent_data_item()
307 CHECK_FE_ALIGNED(leaf, slot, fi, disk_num_bytes, sectorsize) || in check_extent_data_item()
308 CHECK_FE_ALIGNED(leaf, slot, fi, offset, sectorsize) || in check_extent_data_item()
309 CHECK_FE_ALIGNED(leaf, slot, fi, num_bytes, sectorsize))) in check_extent_data_item()
310 return -EUCLEAN; in check_extent_data_item()
314 key->offset, &extent_end))) { in check_extent_data_item()
315 file_extent_err(leaf, slot, in check_extent_data_item()
317 key->offset, in check_extent_data_item()
319 return -EUCLEAN; in check_extent_data_item()
326 if (slot > 0 && in check_extent_data_item()
327 prev_key->objectid == key->objectid && in check_extent_data_item()
328 prev_key->type == BTRFS_EXTENT_DATA_KEY) { in check_extent_data_item()
332 prev_fi = btrfs_item_ptr(leaf, slot - 1, in check_extent_data_item()
335 if (unlikely(prev_end > key->offset)) { in check_extent_data_item()
336 file_extent_err(leaf, slot - 1, in check_extent_data_item()
338 prev_end, key->offset); in check_extent_data_item()
339 return -EUCLEAN; in check_extent_data_item()
344 * For non-compressed data extents, ram_bytes should match its in check_extent_data_item()
355 file_extent_err(leaf, slot, in check_extent_data_item()
356 "mismatch ram_bytes (%llu) and disk_num_bytes (%llu) for non-compressed extent", in check_extent_data_item()
365 int slot, struct btrfs_key *prev_key) in check_csum_item() argument
367 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_csum_item()
368 u32 sectorsize = fs_info->sectorsize; in check_csum_item()
369 const u32 csumsize = fs_info->csum_size; in check_csum_item()
371 if (unlikely(key->objectid != BTRFS_EXTENT_CSUM_OBJECTID)) { in check_csum_item()
372 generic_err(leaf, slot, in check_csum_item()
374 key->objectid, BTRFS_EXTENT_CSUM_OBJECTID); in check_csum_item()
375 return -EUCLEAN; in check_csum_item()
377 if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) { in check_csum_item()
378 generic_err(leaf, slot, in check_csum_item()
380 key->offset, sectorsize); in check_csum_item()
381 return -EUCLEAN; in check_csum_item()
383 if (unlikely(!IS_ALIGNED(btrfs_item_size(leaf, slot), csumsize))) { in check_csum_item()
384 generic_err(leaf, slot, in check_csum_item()
385 "unaligned item size for csum item, have %u should be aligned to %u", in check_csum_item()
386 btrfs_item_size(leaf, slot), csumsize); in check_csum_item()
387 return -EUCLEAN; in check_csum_item()
389 if (slot > 0 && prev_key->type == BTRFS_EXTENT_CSUM_KEY) { in check_csum_item()
393 prev_item_size = btrfs_item_size(leaf, slot - 1); in check_csum_item()
395 prev_csum_end += prev_key->offset; in check_csum_item()
396 if (unlikely(prev_csum_end > key->offset)) { in check_csum_item()
397 generic_err(leaf, slot - 1, in check_csum_item()
399 prev_csum_end, key->offset); in check_csum_item()
400 return -EUCLEAN; in check_csum_item()
407 #define inode_item_err(eb, slot, fmt, ...) \ argument
408 dir_item_err(eb, slot, fmt, __VA_ARGS__)
411 int slot) in check_inode_key() argument
416 btrfs_item_key_to_cpu(leaf, &item_key, slot); in check_inode_key()
421 if (unlikely(key->objectid != 0 || key->type != 0 || in check_inode_key()
422 key->offset != 0)) in check_inode_key()
423 return -EUCLEAN; in check_inode_key()
427 if (unlikely((key->objectid < BTRFS_FIRST_FREE_OBJECTID || in check_inode_key()
428 key->objectid > BTRFS_LAST_FREE_OBJECTID) && in check_inode_key()
429 key->objectid != BTRFS_ROOT_TREE_DIR_OBJECTID && in check_inode_key()
430 key->objectid != BTRFS_FREE_INO_OBJECTID)) { in check_inode_key()
432 generic_err(leaf, slot, in check_inode_key()
434 key->objectid, BTRFS_ROOT_TREE_DIR_OBJECTID, in check_inode_key()
439 dir_item_err(leaf, slot, in check_inode_key()
441 key->objectid, BTRFS_ROOT_TREE_DIR_OBJECTID, in check_inode_key()
446 return -EUCLEAN; in check_inode_key()
448 if (unlikely(key->offset != 0)) { in check_inode_key()
450 inode_item_err(leaf, slot, in check_inode_key()
452 key->offset); in check_inode_key()
454 dir_item_err(leaf, slot, in check_inode_key()
456 key->offset); in check_inode_key()
457 return -EUCLEAN; in check_inode_key()
463 int slot) in check_root_key() argument
468 btrfs_item_key_to_cpu(leaf, &item_key, slot); in check_root_key()
477 if (unlikely(is_root_item && key->objectid == BTRFS_TREE_RELOC_OBJECTID && in check_root_key()
478 !is_fstree(key->offset))) { in check_root_key()
479 generic_err(leaf, slot, in check_root_key()
481 key->offset); in check_root_key()
482 return -EUCLEAN; in check_root_key()
486 if (unlikely(key->objectid == 0)) { in check_root_key()
488 generic_err(leaf, slot, "invalid root id 0"); in check_root_key()
490 dir_item_err(leaf, slot, in check_root_key()
492 return -EUCLEAN; in check_root_key()
495 /* DIR_ITEM/INDEX/INODE_REF is not allowed to point to non-fs trees */ in check_root_key()
496 if (unlikely(!is_fstree(key->objectid) && !is_root_item)) { in check_root_key()
497 dir_item_err(leaf, slot, in check_root_key()
499 key->objectid, BTRFS_FIRST_FREE_OBJECTID, in check_root_key()
501 return -EUCLEAN; in check_root_key()
505 * ROOT_ITEM with non-zero offset means this is a snapshot, created at in check_root_key()
507 * Furthermore, for location key in DIR_ITEM, its offset is always -1. in check_root_key()
509 * So here we only check offset for reloc tree whose key->offset must in check_root_key()
512 if (unlikely(key->objectid == BTRFS_TREE_RELOC_OBJECTID && in check_root_key()
513 key->offset == 0)) { in check_root_key()
514 generic_err(leaf, slot, "invalid root id 0 for reloc tree"); in check_root_key()
515 return -EUCLEAN; in check_root_key()
522 int slot) in check_dir_item() argument
524 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_dir_item()
526 u32 item_size = btrfs_item_size(leaf, slot); in check_dir_item()
529 if (unlikely(!check_prev_ino(leaf, key, slot, prev_key))) in check_dir_item()
530 return -EUCLEAN; in check_dir_item()
532 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); in check_dir_item()
545 dir_item_err(leaf, slot, in check_dir_item()
548 return -EUCLEAN; in check_dir_item()
554 ret = check_root_key(leaf, &location_key, slot); in check_dir_item()
559 ret = check_inode_key(leaf, &location_key, slot); in check_dir_item()
563 dir_item_err(leaf, slot, in check_dir_item()
567 return -EUCLEAN; in check_dir_item()
574 dir_item_err(leaf, slot, in check_dir_item()
577 return -EUCLEAN; in check_dir_item()
580 if (unlikely(key->type == BTRFS_XATTR_ITEM_KEY && in check_dir_item()
582 dir_item_err(leaf, slot, in check_dir_item()
585 return -EUCLEAN; in check_dir_item()
588 key->type != BTRFS_XATTR_ITEM_KEY)) { in check_dir_item()
589 dir_item_err(leaf, slot, in check_dir_item()
590 "xattr dir type found for non-XATTR key"); in check_dir_item()
591 return -EUCLEAN; in check_dir_item()
602 dir_item_err(leaf, slot, in check_dir_item()
605 return -EUCLEAN; in check_dir_item()
608 dir_item_err(leaf, slot, in check_dir_item()
612 return -EUCLEAN; in check_dir_item()
616 dir_item_err(leaf, slot, in check_dir_item()
619 return -EUCLEAN; in check_dir_item()
626 dir_item_err(leaf, slot, in check_dir_item()
629 return -EUCLEAN; in check_dir_item()
633 * Special check for XATTR/DIR_ITEM, as key->offset is name in check_dir_item()
636 if (key->type == BTRFS_DIR_ITEM_KEY || in check_dir_item()
637 key->type == BTRFS_XATTR_ITEM_KEY) { in check_dir_item()
643 if (unlikely(key->offset != name_hash)) { in check_dir_item()
644 dir_item_err(leaf, slot, in check_dir_item()
646 name_hash, key->offset); in check_dir_item()
647 return -EUCLEAN; in check_dir_item()
658 static void block_group_err(const struct extent_buffer *eb, int slot, in block_group_err() argument
661 const struct btrfs_fs_info *fs_info = eb->fs_info; in block_group_err()
666 btrfs_item_key_to_cpu(eb, &key, slot); in block_group_err()
672 dump_page(folio_page(eb->folios[0], 0), "eb page dump"); in block_group_err()
674 "corrupt %s: root=%llu block=%llu slot=%d bg_start=%llu bg_len=%llu, %pV", in block_group_err()
676 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in block_group_err()
682 struct btrfs_key *key, int slot) in check_block_group_item() argument
684 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_block_group_item()
686 u32 item_size = btrfs_item_size(leaf, slot); in check_block_group_item()
693 * handle it. We care more about the size. in check_block_group_item()
695 if (unlikely(key->offset == 0)) { in check_block_group_item()
696 block_group_err(leaf, slot, in check_block_group_item()
697 "invalid block group size 0"); in check_block_group_item()
698 return -EUCLEAN; in check_block_group_item()
702 block_group_err(leaf, slot, in check_block_group_item()
703 "invalid item size, have %u expect %zu", in check_block_group_item()
705 return -EUCLEAN; in check_block_group_item()
708 read_extent_buffer(leaf, &bgi, btrfs_item_ptr_offset(leaf, slot), in check_block_group_item()
718 if (unlikely(fs_info->nr_global_roots && in check_block_group_item()
719 chunk_objectid >= fs_info->nr_global_roots)) { in check_block_group_item()
720 block_group_err(leaf, slot, in check_block_group_item()
723 fs_info->nr_global_roots); in check_block_group_item()
724 return -EUCLEAN; in check_block_group_item()
727 block_group_err(leaf, slot, in check_block_group_item()
731 return -EUCLEAN; in check_block_group_item()
734 if (unlikely(btrfs_stack_block_group_used(&bgi) > key->offset)) { in check_block_group_item()
735 block_group_err(leaf, slot, in check_block_group_item()
737 btrfs_stack_block_group_used(&bgi), key->offset); in check_block_group_item()
738 return -EUCLEAN; in check_block_group_item()
743 block_group_err(leaf, slot, in check_block_group_item()
747 return -EUCLEAN; in check_block_group_item()
756 block_group_err(leaf, slot, in check_block_group_item()
762 return -EUCLEAN; in check_block_group_item()
778 int slot = -1; in chunk_err() local
782 * Get the slot number by iterating through all slots, this in chunk_err()
788 slot = i; in chunk_err()
803 "corrupt leaf: root=%llu block=%llu slot=%d chunk_start=%llu, %pV", in chunk_err()
804 BTRFS_CHUNK_TREE_OBJECTID, leaf->start, slot, in chunk_err()
812 * If @leaf is NULL, then @chunk must be an on-stack chunk item.
813 * (For superblock sys_chunk array, and fs_info->sectorsize is unreliable)
815 * Return -EUCLEAN if anything is corrupted.
858 return -EUCLEAN; in btrfs_check_chunk_valid()
864 return -EUCLEAN; in btrfs_check_chunk_valid()
870 return -EUCLEAN; in btrfs_check_chunk_valid()
876 return -EUCLEAN; in btrfs_check_chunk_valid()
882 return -EUCLEAN; in btrfs_check_chunk_valid()
887 return -EUCLEAN; in btrfs_check_chunk_valid()
893 return -EUCLEAN; in btrfs_check_chunk_valid()
899 return -EUCLEAN; in btrfs_check_chunk_valid()
902 * We artificially limit the chunk size, so that the number of stripes in btrfs_check_chunk_valid()
913 return -EUCLEAN; in btrfs_check_chunk_valid()
921 return -EUCLEAN; in btrfs_check_chunk_valid()
929 return -EUCLEAN; in btrfs_check_chunk_valid()
935 return -EUCLEAN; in btrfs_check_chunk_valid()
944 return -EUCLEAN; in btrfs_check_chunk_valid()
947 features = btrfs_super_incompat_flags(fs_info->super_copy); in btrfs_check_chunk_valid()
955 "mixed chunk type in non-mixed mode: 0x%llx", type); in btrfs_check_chunk_valid()
956 return -EUCLEAN; in btrfs_check_chunk_valid()
980 return -EUCLEAN; in btrfs_check_chunk_valid()
989 * The common btrfs_check_chunk_valid() doesn't check item size since it needs
994 struct btrfs_key *key, int slot) in check_leaf_chunk_item() argument
996 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_leaf_chunk_item()
999 if (unlikely(btrfs_item_size(leaf, slot) < sizeof(struct btrfs_chunk))) { in check_leaf_chunk_item()
1000 chunk_err(fs_info, leaf, chunk, key->offset, in check_leaf_chunk_item()
1001 "invalid chunk item size: have %u expect [%zu, %u)", in check_leaf_chunk_item()
1002 btrfs_item_size(leaf, slot), in check_leaf_chunk_item()
1005 return -EUCLEAN; in check_leaf_chunk_item()
1014 btrfs_item_size(leaf, slot))) { in check_leaf_chunk_item()
1015 chunk_err(fs_info, leaf, chunk, key->offset, in check_leaf_chunk_item()
1016 "invalid chunk item size: have %u expect %lu", in check_leaf_chunk_item()
1017 btrfs_item_size(leaf, slot), in check_leaf_chunk_item()
1019 return -EUCLEAN; in check_leaf_chunk_item()
1022 return btrfs_check_chunk_valid(fs_info, leaf, chunk, key->offset, in check_leaf_chunk_item()
1023 fs_info->sectorsize); in check_leaf_chunk_item()
1028 static void dev_item_err(const struct extent_buffer *eb, int slot, in dev_item_err() argument
1035 btrfs_item_key_to_cpu(eb, &key, slot); in dev_item_err()
1041 dump_page(folio_page(eb->folios[0], 0), "eb page dump"); in dev_item_err()
1042 btrfs_crit(eb->fs_info, in dev_item_err()
1043 "corrupt %s: root=%llu block=%llu slot=%d devid=%llu %pV", in dev_item_err()
1045 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in dev_item_err()
1051 struct btrfs_key *key, int slot) in check_dev_item() argument
1054 const u32 item_size = btrfs_item_size(leaf, slot); in check_dev_item()
1056 if (unlikely(key->objectid != BTRFS_DEV_ITEMS_OBJECTID)) { in check_dev_item()
1057 dev_item_err(leaf, slot, in check_dev_item()
1059 key->objectid, BTRFS_DEV_ITEMS_OBJECTID); in check_dev_item()
1060 return -EUCLEAN; in check_dev_item()
1064 dev_item_err(leaf, slot, "invalid item size: has %u expect %zu", in check_dev_item()
1066 return -EUCLEAN; in check_dev_item()
1069 ditem = btrfs_item_ptr(leaf, slot, struct btrfs_dev_item); in check_dev_item()
1070 if (unlikely(btrfs_device_id(leaf, ditem) != key->offset)) { in check_dev_item()
1071 dev_item_err(leaf, slot, in check_dev_item()
1073 key->offset, btrfs_device_id(leaf, ditem)); in check_dev_item()
1074 return -EUCLEAN; in check_dev_item()
1079 * it can be 0 for device removal. Device size check can only be done in check_dev_item()
1084 dev_item_err(leaf, slot, in check_dev_item()
1088 return -EUCLEAN; in check_dev_item()
1098 struct btrfs_key *key, int slot) in check_inode_item() argument
1100 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_inode_item()
1102 u64 super_gen = btrfs_super_generation(fs_info->super_copy); in check_inode_item()
1104 const u32 item_size = btrfs_item_size(leaf, slot); in check_inode_item()
1110 ret = check_inode_key(leaf, key, slot); in check_inode_item()
1115 generic_err(leaf, slot, "invalid item size: has %u expect %zu", in check_inode_item()
1117 return -EUCLEAN; in check_inode_item()
1120 iitem = btrfs_item_ptr(leaf, slot, struct btrfs_inode_item); in check_inode_item()
1124 inode_item_err(leaf, slot, in check_inode_item()
1128 return -EUCLEAN; in check_inode_item()
1132 inode_item_err(leaf, slot, in check_inode_item()
1135 return -EUCLEAN; in check_inode_item()
1139 * For size and nbytes it's better not to be too strict, as for dir in check_inode_item()
1140 * item its size/nbytes can easily get wrong, but doesn't affect in check_inode_item()
1145 inode_item_err(leaf, slot, in check_inode_item()
1148 return -EUCLEAN; in check_inode_item()
1158 inode_item_err(leaf, slot, in check_inode_item()
1161 return -EUCLEAN; in check_inode_item()
1165 inode_item_err(leaf, slot, in check_inode_item()
1168 return -EUCLEAN; in check_inode_item()
1172 inode_item_err(leaf, slot, in check_inode_item()
1174 return -EUCLEAN; in check_inode_item()
1176 if (unlikely(!sb_rdonly(fs_info->sb) && in check_inode_item()
1178 inode_item_err(leaf, slot, in check_inode_item()
1179 "unknown ro-compat flags detected on writeable mount: 0x%x", in check_inode_item()
1181 return -EUCLEAN; in check_inode_item()
1187 int slot) in check_root_item() argument
1189 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_root_item()
1195 ret = check_root_key(leaf, key, slot); in check_root_item()
1199 if (unlikely(btrfs_item_size(leaf, slot) != sizeof(ri) && in check_root_item()
1200 btrfs_item_size(leaf, slot) != in check_root_item()
1202 generic_err(leaf, slot, in check_root_item()
1203 "invalid root item size, have %u expect %zu or %u", in check_root_item()
1204 btrfs_item_size(leaf, slot), sizeof(ri), in check_root_item()
1206 return -EUCLEAN; in check_root_item()
1214 read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot), in check_root_item()
1215 btrfs_item_size(leaf, slot)); in check_root_item()
1219 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_root_item()
1220 generic_err(leaf, slot, in check_root_item()
1223 btrfs_super_generation(fs_info->super_copy) + 1); in check_root_item()
1224 return -EUCLEAN; in check_root_item()
1227 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_root_item()
1228 generic_err(leaf, slot, in check_root_item()
1231 btrfs_super_generation(fs_info->super_copy) + 1); in check_root_item()
1232 return -EUCLEAN; in check_root_item()
1235 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_root_item()
1236 generic_err(leaf, slot, in check_root_item()
1239 btrfs_super_generation(fs_info->super_copy) + 1); in check_root_item()
1240 return -EUCLEAN; in check_root_item()
1244 if (unlikely(!IS_ALIGNED(btrfs_root_bytenr(&ri), fs_info->sectorsize))) { in check_root_item()
1245 generic_err(leaf, slot, in check_root_item()
1247 btrfs_root_bytenr(&ri), fs_info->sectorsize); in check_root_item()
1248 return -EUCLEAN; in check_root_item()
1251 generic_err(leaf, slot, in check_root_item()
1253 btrfs_root_level(&ri), BTRFS_MAX_LEVEL - 1); in check_root_item()
1254 return -EUCLEAN; in check_root_item()
1257 generic_err(leaf, slot, in check_root_item()
1259 btrfs_root_drop_level(&ri), BTRFS_MAX_LEVEL - 1); in check_root_item()
1260 return -EUCLEAN; in check_root_item()
1265 generic_err(leaf, slot, in check_root_item()
1268 return -EUCLEAN; in check_root_item()
1275 static void extent_err(const struct extent_buffer *eb, int slot, in extent_err() argument
1284 btrfs_item_key_to_cpu(eb, &key, slot); in extent_err()
1289 len = eb->fs_info->nodesize; in extent_err()
1297 dump_page(folio_page(eb->folios[0], 0), "eb page dump"); in extent_err()
1298 btrfs_crit(eb->fs_info, in extent_err()
1299 "corrupt %s: block=%llu slot=%d extent bytenr=%llu len=%llu %pV", in extent_err()
1301 eb->start, slot, bytenr, len, &vaf); in extent_err()
1309 * - subvolume trees in is_valid_dref_root()
1310 * - data reloc tree in is_valid_dref_root()
1311 * - tree root in is_valid_dref_root()
1319 struct btrfs_key *key, int slot, in check_extent_item() argument
1322 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_extent_item()
1327 const u32 item_size = btrfs_item_size(leaf, slot); in check_extent_item()
1335 if (unlikely(key->type == BTRFS_METADATA_ITEM_KEY && in check_extent_item()
1337 generic_err(leaf, slot, in check_extent_item()
1339 return -EUCLEAN; in check_extent_item()
1341 /* key->objectid is the bytenr for both key types */ in check_extent_item()
1342 if (unlikely(!IS_ALIGNED(key->objectid, fs_info->sectorsize))) { in check_extent_item()
1343 generic_err(leaf, slot, in check_extent_item()
1345 key->objectid, fs_info->sectorsize); in check_extent_item()
1346 return -EUCLEAN; in check_extent_item()
1349 /* key->offset is tree level for METADATA_ITEM_KEY */ in check_extent_item()
1350 if (unlikely(key->type == BTRFS_METADATA_ITEM_KEY && in check_extent_item()
1351 key->offset >= BTRFS_MAX_LEVEL)) { in check_extent_item()
1352 extent_err(leaf, slot, in check_extent_item()
1354 key->offset, BTRFS_MAX_LEVEL - 1); in check_extent_item()
1355 return -EUCLEAN; in check_extent_item()
1379 * - All btrfs_extent_inline_ref::type should be in an ascending in check_extent_item()
1382 * - Within the same type, the items should follow a descending in check_extent_item()
1390 extent_err(leaf, slot, in check_extent_item()
1391 "invalid item size, have %u expect [%zu, %u)", in check_extent_item()
1394 return -EUCLEAN; in check_extent_item()
1396 end = item_size + btrfs_item_ptr_offset(leaf, slot); in check_extent_item()
1399 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item); in check_extent_item()
1404 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_extent_item()
1405 extent_err(leaf, slot, in check_extent_item()
1408 btrfs_super_generation(fs_info->super_copy) + 1); in check_extent_item()
1409 return -EUCLEAN; in check_extent_item()
1413 extent_err(leaf, slot, in check_extent_item()
1417 return -EUCLEAN; in check_extent_item()
1421 if (unlikely(key->type == BTRFS_EXTENT_ITEM_KEY && in check_extent_item()
1422 key->offset != fs_info->nodesize)) { in check_extent_item()
1423 extent_err(leaf, slot, in check_extent_item()
1425 key->offset, fs_info->nodesize); in check_extent_item()
1426 return -EUCLEAN; in check_extent_item()
1429 if (unlikely(key->type != BTRFS_EXTENT_ITEM_KEY)) { in check_extent_item()
1430 extent_err(leaf, slot, in check_extent_item()
1432 key->type, BTRFS_EXTENT_ITEM_KEY); in check_extent_item()
1433 return -EUCLEAN; in check_extent_item()
1435 if (unlikely(!IS_ALIGNED(key->offset, fs_info->sectorsize))) { in check_extent_item()
1436 extent_err(leaf, slot, in check_extent_item()
1438 key->offset, fs_info->sectorsize); in check_extent_item()
1439 return -EUCLEAN; in check_extent_item()
1442 extent_err(leaf, slot, in check_extent_item()
1444 return -EUCLEAN; in check_extent_item()
1450 if (is_tree_block && key->type != BTRFS_METADATA_ITEM_KEY) { in check_extent_item()
1455 extent_err(leaf, slot, in check_extent_item()
1458 BTRFS_MAX_LEVEL - 1); in check_extent_item()
1459 return -EUCLEAN; in check_extent_item()
1477 extent_err(leaf, slot, in check_extent_item()
1478 "inline ref item overflows extent item, ptr %lu iref size %zu end %lu", in check_extent_item()
1480 return -EUCLEAN; in check_extent_item()
1487 extent_err(leaf, slot, in check_extent_item()
1488 "inline ref item overflows extent item, ptr %lu iref size %u end %lu", in check_extent_item()
1490 return -EUCLEAN; in check_extent_item()
1501 fs_info->sectorsize))) { in check_extent_item()
1502 extent_err(leaf, slot, in check_extent_item()
1504 inline_offset, fs_info->sectorsize); in check_extent_item()
1505 return -EUCLEAN; in check_extent_item()
1514 dref = (struct btrfs_extent_data_ref *)(&iref->offset); in check_extent_item()
1523 extent_err(leaf, slot, in check_extent_item()
1526 return -EUCLEAN; in check_extent_item()
1530 extent_err(leaf, slot, in check_extent_item()
1533 return -EUCLEAN; in check_extent_item()
1536 fs_info->sectorsize))) { in check_extent_item()
1537 extent_err(leaf, slot, in check_extent_item()
1539 dref_offset, fs_info->sectorsize); in check_extent_item()
1540 return -EUCLEAN; in check_extent_item()
1543 extent_err(leaf, slot, in check_extent_item()
1544 "invalid data ref count, should have non-zero value"); in check_extent_item()
1545 return -EUCLEAN; in check_extent_item()
1553 fs_info->sectorsize))) { in check_extent_item()
1554 extent_err(leaf, slot, in check_extent_item()
1556 inline_offset, fs_info->sectorsize); in check_extent_item()
1557 return -EUCLEAN; in check_extent_item()
1560 extent_err(leaf, slot, in check_extent_item()
1561 "invalid shared data ref count, should have non-zero value"); in check_extent_item()
1562 return -EUCLEAN; in check_extent_item()
1570 extent_err(leaf, slot, "unknown inline ref type: %u", in check_extent_item()
1572 return -EUCLEAN; in check_extent_item()
1575 extent_err(leaf, slot, in check_extent_item()
1576 "inline ref out-of-order: has type %u, prev type %u", in check_extent_item()
1578 return -EUCLEAN; in check_extent_item()
1584 extent_err(leaf, slot, in check_extent_item()
1585 "inline ref out-of-order: has type %u offset %llu seq 0x%llx, prev type %u seq 0x%llx", in check_extent_item()
1588 return -EUCLEAN; in check_extent_item()
1596 extent_err(leaf, slot, in check_extent_item()
1597 "invalid extent item size, padding bytes found"); in check_extent_item()
1598 return -EUCLEAN; in check_extent_item()
1603 extent_err(leaf, slot, in check_extent_item()
1606 return -EUCLEAN; in check_extent_item()
1609 if ((prev_key->type == BTRFS_EXTENT_ITEM_KEY) || in check_extent_item()
1610 (prev_key->type == BTRFS_METADATA_ITEM_KEY)) { in check_extent_item()
1611 u64 prev_end = prev_key->objectid; in check_extent_item()
1613 if (prev_key->type == BTRFS_METADATA_ITEM_KEY) in check_extent_item()
1614 prev_end += fs_info->nodesize; in check_extent_item()
1616 prev_end += prev_key->offset; in check_extent_item()
1618 if (unlikely(prev_end > key->objectid)) { in check_extent_item()
1619 extent_err(leaf, slot, in check_extent_item()
1621 prev_key->objectid, prev_key->type, in check_extent_item()
1622 prev_key->offset, key->objectid, key->type, in check_extent_item()
1623 key->offset); in check_extent_item()
1624 return -EUCLEAN; in check_extent_item()
1632 struct btrfs_key *key, int slot) in check_simple_keyed_refs() argument
1636 if (key->type == BTRFS_SHARED_DATA_REF_KEY) { in check_simple_keyed_refs()
1639 sref = btrfs_item_ptr(leaf, slot, struct btrfs_shared_data_ref); in check_simple_keyed_refs()
1641 extent_err(leaf, slot, in check_simple_keyed_refs()
1642 "invalid shared data backref count, should have non-zero value"); in check_simple_keyed_refs()
1643 return -EUCLEAN; in check_simple_keyed_refs()
1649 if (unlikely(btrfs_item_size(leaf, slot) != expect_item_size)) { in check_simple_keyed_refs()
1650 generic_err(leaf, slot, in check_simple_keyed_refs()
1651 "invalid item size, have %u expect %u for key type %u", in check_simple_keyed_refs()
1652 btrfs_item_size(leaf, slot), in check_simple_keyed_refs()
1653 expect_item_size, key->type); in check_simple_keyed_refs()
1654 return -EUCLEAN; in check_simple_keyed_refs()
1656 if (unlikely(!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize))) { in check_simple_keyed_refs()
1657 generic_err(leaf, slot, in check_simple_keyed_refs()
1659 key->objectid, leaf->fs_info->sectorsize); in check_simple_keyed_refs()
1660 return -EUCLEAN; in check_simple_keyed_refs()
1662 if (unlikely(key->type != BTRFS_TREE_BLOCK_REF_KEY && in check_simple_keyed_refs()
1663 !IS_ALIGNED(key->offset, leaf->fs_info->sectorsize))) { in check_simple_keyed_refs()
1664 extent_err(leaf, slot, in check_simple_keyed_refs()
1666 key->offset, leaf->fs_info->sectorsize); in check_simple_keyed_refs()
1667 return -EUCLEAN; in check_simple_keyed_refs()
1673 struct btrfs_key *key, int slot) in check_extent_data_ref() argument
1676 unsigned long ptr = btrfs_item_ptr_offset(leaf, slot); in check_extent_data_ref()
1677 const unsigned long end = ptr + btrfs_item_size(leaf, slot); in check_extent_data_ref()
1679 if (unlikely(btrfs_item_size(leaf, slot) % sizeof(*dref) != 0)) { in check_extent_data_ref()
1680 generic_err(leaf, slot, in check_extent_data_ref()
1681 "invalid item size, have %u expect aligned to %zu for key type %u", in check_extent_data_ref()
1682 btrfs_item_size(leaf, slot), in check_extent_data_ref()
1683 sizeof(*dref), key->type); in check_extent_data_ref()
1684 return -EUCLEAN; in check_extent_data_ref()
1686 if (unlikely(!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize))) { in check_extent_data_ref()
1687 generic_err(leaf, slot, in check_extent_data_ref()
1689 key->objectid, leaf->fs_info->sectorsize); in check_extent_data_ref()
1690 return -EUCLEAN; in check_extent_data_ref()
1706 extent_err(leaf, slot, in check_extent_data_ref()
1709 return -EUCLEAN; in check_extent_data_ref()
1713 extent_err(leaf, slot, in check_extent_data_ref()
1716 return -EUCLEAN; in check_extent_data_ref()
1718 if (unlikely(!IS_ALIGNED(offset, leaf->fs_info->sectorsize))) { in check_extent_data_ref()
1719 extent_err(leaf, slot, in check_extent_data_ref()
1721 offset, leaf->fs_info->sectorsize); in check_extent_data_ref()
1722 return -EUCLEAN; in check_extent_data_ref()
1725 extent_err(leaf, slot, in check_extent_data_ref()
1726 "invalid extent data backref count, should have non-zero value"); in check_extent_data_ref()
1727 return -EUCLEAN; in check_extent_data_ref()
1733 #define inode_ref_err(eb, slot, fmt, args...) \ argument
1734 inode_item_err(eb, slot, fmt, ##args)
1737 int slot) in check_inode_ref() argument
1743 if (unlikely(!check_prev_ino(leaf, key, slot, prev_key))) in check_inode_ref()
1744 return -EUCLEAN; in check_inode_ref()
1746 if (unlikely(btrfs_item_size(leaf, slot) <= sizeof(*iref))) { in check_inode_ref()
1747 inode_ref_err(leaf, slot, in check_inode_ref()
1748 "invalid item size, have %u expect (%zu, %u)", in check_inode_ref()
1749 btrfs_item_size(leaf, slot), in check_inode_ref()
1750 sizeof(*iref), BTRFS_LEAF_DATA_SIZE(leaf->fs_info)); in check_inode_ref()
1751 return -EUCLEAN; in check_inode_ref()
1754 ptr = btrfs_item_ptr_offset(leaf, slot); in check_inode_ref()
1755 end = ptr + btrfs_item_size(leaf, slot); in check_inode_ref()
1760 inode_ref_err(leaf, slot, in check_inode_ref()
1763 return -EUCLEAN; in check_inode_ref()
1769 inode_ref_err(leaf, slot, in check_inode_ref()
1772 return -EUCLEAN; in check_inode_ref()
1786 const struct btrfs_key *key, int slot) in check_raid_stripe_extent() argument
1788 if (unlikely(!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize))) { in check_raid_stripe_extent()
1789 generic_err(leaf, slot, in check_raid_stripe_extent()
1791 key->objectid, leaf->fs_info->sectorsize); in check_raid_stripe_extent()
1792 return -EUCLEAN; in check_raid_stripe_extent()
1795 if (unlikely(!btrfs_fs_incompat(leaf->fs_info, RAID_STRIPE_TREE))) { in check_raid_stripe_extent()
1796 generic_err(leaf, slot, in check_raid_stripe_extent()
1798 return -EUCLEAN; in check_raid_stripe_extent()
1806 int slot, in check_dev_extent_item() argument
1810 const u32 sectorsize = leaf->fs_info->sectorsize; in check_dev_extent_item()
1812 de = btrfs_item_ptr(leaf, slot, struct btrfs_dev_extent); in check_dev_extent_item()
1816 generic_err(leaf, slot, in check_dev_extent_item()
1820 return -EUCLEAN; in check_dev_extent_item()
1824 generic_err(leaf, slot, in check_dev_extent_item()
1828 return -EUCLEAN; in check_dev_extent_item()
1831 if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) { in check_dev_extent_item()
1832 generic_err(leaf, slot, in check_dev_extent_item()
1834 key->offset, sectorsize); in check_dev_extent_item()
1835 return -EUCLEAN; in check_dev_extent_item()
1839 generic_err(leaf, slot, in check_dev_extent_item()
1843 return -EUCLEAN; in check_dev_extent_item()
1847 generic_err(leaf, slot, in check_dev_extent_item()
1850 return -EUCLEAN; in check_dev_extent_item()
1853 if (slot && prev_key->objectid == key->objectid && in check_dev_extent_item()
1854 prev_key->type == key->type) { in check_dev_extent_item()
1858 prev_de = btrfs_item_ptr(leaf, slot - 1, struct btrfs_dev_extent); in check_dev_extent_item()
1860 if (unlikely(prev_key->offset + prev_len > key->offset)) { in check_dev_extent_item()
1861 generic_err(leaf, slot, in check_dev_extent_item()
1863 prev_key->objectid, prev_len, key->offset); in check_dev_extent_item()
1864 return -EUCLEAN; in check_dev_extent_item()
1871 * Common point to switch the item-specific validation.
1875 int slot, in check_leaf_item() argument
1881 switch (key->type) { in check_leaf_item()
1883 ret = check_extent_data_item(leaf, key, slot, prev_key); in check_leaf_item()
1886 ret = check_csum_item(leaf, key, slot, prev_key); in check_leaf_item()
1891 ret = check_dir_item(leaf, key, prev_key, slot); in check_leaf_item()
1894 ret = check_inode_ref(leaf, key, prev_key, slot); in check_leaf_item()
1897 ret = check_block_group_item(leaf, key, slot); in check_leaf_item()
1900 chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk); in check_leaf_item()
1901 ret = check_leaf_chunk_item(leaf, chunk, key, slot); in check_leaf_item()
1904 ret = check_dev_item(leaf, key, slot); in check_leaf_item()
1907 ret = check_dev_extent_item(leaf, key, slot, prev_key); in check_leaf_item()
1910 ret = check_inode_item(leaf, key, slot); in check_leaf_item()
1913 ret = check_root_item(leaf, key, slot); in check_leaf_item()
1917 ret = check_extent_item(leaf, key, slot, prev_key); in check_leaf_item()
1922 ret = check_simple_keyed_refs(leaf, key, slot); in check_leaf_item()
1925 ret = check_extent_data_ref(leaf, key, slot); in check_leaf_item()
1928 ret = check_raid_stripe_extent(leaf, key, slot); in check_leaf_item()
1939 struct btrfs_fs_info *fs_info = leaf->fs_info; in __btrfs_check_leaf()
1944 int slot; in __btrfs_check_leaf() local
2010 * 2) item offset and size in __btrfs_check_leaf()
2016 for (slot = 0; slot < nritems; slot++) { in __btrfs_check_leaf()
2021 btrfs_item_key_to_cpu(leaf, &key, slot); in __btrfs_check_leaf()
2025 generic_err(leaf, slot, in __btrfs_check_leaf()
2033 item_data_end = (u64)btrfs_item_offset(leaf, slot) + in __btrfs_check_leaf()
2034 btrfs_item_size(leaf, slot); in __btrfs_check_leaf()
2040 if (slot == 0) in __btrfs_check_leaf()
2044 slot - 1); in __btrfs_check_leaf()
2046 generic_err(leaf, slot, in __btrfs_check_leaf()
2058 generic_err(leaf, slot, in __btrfs_check_leaf()
2059 "slot end outside of leaf, have %llu expect range [0, %u]", in __btrfs_check_leaf()
2065 if (unlikely(btrfs_item_ptr_offset(leaf, slot) < in __btrfs_check_leaf()
2066 btrfs_item_nr_offset(leaf, slot) + sizeof(struct btrfs_item))) { in __btrfs_check_leaf()
2067 generic_err(leaf, slot, in __btrfs_check_leaf()
2068 "slot overlaps with its data, item end %lu data start %lu", in __btrfs_check_leaf()
2069 btrfs_item_nr_offset(leaf, slot) + in __btrfs_check_leaf()
2071 btrfs_item_ptr_offset(leaf, slot)); in __btrfs_check_leaf()
2075 /* Check if the item size and content meet other criteria. */ in __btrfs_check_leaf()
2076 ret = check_leaf_item(leaf, &key, slot, &prev_key); in __btrfs_check_leaf()
2094 return -EUCLEAN; in btrfs_check_leaf()
2101 struct btrfs_fs_info *fs_info = node->fs_info; in __btrfs_check_node()
2104 int slot; in __btrfs_check_node() local
2116 level, BTRFS_MAX_LEVEL - 1); in __btrfs_check_node()
2122 btrfs_header_owner(node), node->start, in __btrfs_check_node()
2128 for (slot = 0; slot < nr - 1; slot++) { in __btrfs_check_node()
2129 bytenr = btrfs_node_blockptr(node, slot); in __btrfs_check_node()
2130 btrfs_node_key_to_cpu(node, &key, slot); in __btrfs_check_node()
2131 btrfs_node_key_to_cpu(node, &next_key, slot + 1); in __btrfs_check_node()
2134 generic_err(node, slot, in __btrfs_check_node()
2138 if (unlikely(!IS_ALIGNED(bytenr, fs_info->sectorsize))) { in __btrfs_check_node()
2139 generic_err(node, slot, in __btrfs_check_node()
2141 bytenr, fs_info->sectorsize); in __btrfs_check_node()
2146 generic_err(node, slot, in __btrfs_check_node()
2163 return -EUCLEAN; in btrfs_check_node()
2177 if (btrfs_is_testing(eb->fs_info)) in btrfs_check_eb_owner()
2196 /* For non-subvolume trees, the eb owner should match root owner */ in btrfs_check_eb_owner()
2198 btrfs_crit(eb->fs_info, in btrfs_check_eb_owner()
2203 return -EUCLEAN; in btrfs_check_eb_owner()
2213 btrfs_crit(eb->fs_info, in btrfs_check_eb_owner()
2218 return -EUCLEAN; in btrfs_check_eb_owner()
2226 struct btrfs_fs_info *fs_info = eb->fs_info; in btrfs_verify_level_key()
2232 if (found_level != check->level) { in btrfs_verify_level_key()
2237 eb->start, check->level, found_level); in btrfs_verify_level_key()
2238 return -EIO; in btrfs_verify_level_key()
2241 if (!check->has_first_key) in btrfs_verify_level_key()
2248 * generation <= fs_info->last_trans_committed. in btrfs_verify_level_key()
2257 eb->start); in btrfs_verify_level_key()
2259 return -EUCLEAN; in btrfs_verify_level_key()
2266 ret = btrfs_comp_cpu_keys(&check->first_key, &found_key); in btrfs_verify_level_key()
2273 eb->start, check->transid, check->first_key.objectid, in btrfs_verify_level_key()
2274 check->first_key.type, check->first_key.offset, in btrfs_verify_level_key()