• Home
  • Raw
  • Download

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"
24 #include "disk-io.h"
30 #include "file-item.h"
31 #include "inode-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()
69 "corrupt %s: root=%llu block=%llu slot=%d, %pV", in generic_err()
71 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, &vaf); in generic_err()
81 static void file_extent_err(const struct extent_buffer *eb, int slot, in file_extent_err() argument
84 const struct btrfs_fs_info *fs_info = eb->fs_info; in file_extent_err()
89 btrfs_item_key_to_cpu(eb, &key, slot); in file_extent_err()
96 "corrupt %s: root=%llu block=%llu slot=%d ino=%llu file_offset=%llu, %pV", in file_extent_err()
98 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in file_extent_err()
107 #define CHECK_FE_ALIGNED(leaf, slot, fi, name, alignment) \ argument
111 file_extent_err((leaf), (slot), \
127 end = ALIGN(key->offset + len, leaf->fs_info->sectorsize); in file_extent_end()
130 end = key->offset + len; in file_extent_end()
137 * key->objectid, which represents inode number
141 static void dir_item_err(const struct extent_buffer *eb, int slot, in dir_item_err() argument
144 const struct btrfs_fs_info *fs_info = eb->fs_info; in dir_item_err()
149 btrfs_item_key_to_cpu(eb, &key, slot); in dir_item_err()
156 "corrupt %s: root=%llu block=%llu slot=%d ino=%llu, %pV", in dir_item_err()
158 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in dir_item_err()
164 * This functions checks prev_key->objectid, to ensure current key and prev_key
173 struct btrfs_key *key, int slot, in check_prev_ino() argument
177 if (slot == 0) in check_prev_ino()
180 /* Only these key->types needs to be checked */ in check_prev_ino()
181 ASSERT(key->type == BTRFS_XATTR_ITEM_KEY || in check_prev_ino()
182 key->type == BTRFS_INODE_REF_KEY || in check_prev_ino()
183 key->type == BTRFS_DIR_INDEX_KEY || in check_prev_ino()
184 key->type == BTRFS_DIR_ITEM_KEY || in check_prev_ino()
185 key->type == BTRFS_EXTENT_DATA_KEY); in check_prev_ino()
194 if (key->objectid == prev_key->objectid) in check_prev_ino()
198 dir_item_err(leaf, slot, in check_prev_ino()
200 prev_key->objectid, key->objectid); in check_prev_ino()
204 struct btrfs_key *key, int slot, in check_extent_data_item() argument
207 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_extent_data_item()
209 u32 sectorsize = fs_info->sectorsize; in check_extent_data_item()
210 u32 item_size = btrfs_item_size(leaf, slot); in check_extent_data_item()
213 if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) { in check_extent_data_item()
214 file_extent_err(leaf, slot, in check_extent_data_item()
216 key->offset, sectorsize); in check_extent_data_item()
217 return -EUCLEAN; in check_extent_data_item()
221 * Previous key must have the same key->objectid (ino). in check_extent_data_item()
226 if (unlikely(!check_prev_ino(leaf, key, slot, prev_key))) in check_extent_data_item()
227 return -EUCLEAN; in check_extent_data_item()
229 fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item); in check_extent_data_item()
236 file_extent_err(leaf, slot, in check_extent_data_item()
237 "invalid item size, have %u expect [%zu, %u)", in check_extent_data_item()
240 return -EUCLEAN; in check_extent_data_item()
244 file_extent_err(leaf, slot, in check_extent_data_item()
247 BTRFS_NR_FILE_EXTENT_TYPES - 1); in check_extent_data_item()
248 return -EUCLEAN; in check_extent_data_item()
257 file_extent_err(leaf, slot, in check_extent_data_item()
260 BTRFS_NR_COMPRESS_TYPES - 1); in check_extent_data_item()
261 return -EUCLEAN; in check_extent_data_item()
264 file_extent_err(leaf, slot, in check_extent_data_item()
267 return -EUCLEAN; in check_extent_data_item()
271 if (unlikely(key->offset)) { in check_extent_data_item()
272 file_extent_err(leaf, slot, in check_extent_data_item()
274 key->offset); in check_extent_data_item()
275 return -EUCLEAN; in check_extent_data_item()
278 /* Compressed inline extent has no on-disk size, skip it */ in check_extent_data_item()
283 /* Uncompressed inline extent size must match item size */ in check_extent_data_item()
286 file_extent_err(leaf, slot, in check_extent_data_item()
290 return -EUCLEAN; in check_extent_data_item()
295 /* Regular or preallocated extent has fixed item size */ in check_extent_data_item()
297 file_extent_err(leaf, slot, in check_extent_data_item()
298 "invalid item size for reg/prealloc file extent, have %u expect %zu", in check_extent_data_item()
300 return -EUCLEAN; in check_extent_data_item()
302 if (unlikely(CHECK_FE_ALIGNED(leaf, slot, fi, ram_bytes, sectorsize) || in check_extent_data_item()
303 CHECK_FE_ALIGNED(leaf, slot, fi, disk_bytenr, sectorsize) || in check_extent_data_item()
304 CHECK_FE_ALIGNED(leaf, slot, fi, disk_num_bytes, sectorsize) || in check_extent_data_item()
305 CHECK_FE_ALIGNED(leaf, slot, fi, offset, sectorsize) || in check_extent_data_item()
306 CHECK_FE_ALIGNED(leaf, slot, fi, num_bytes, sectorsize))) in check_extent_data_item()
307 return -EUCLEAN; in check_extent_data_item()
311 key->offset, &extent_end))) { in check_extent_data_item()
312 file_extent_err(leaf, slot, in check_extent_data_item()
314 key->offset, in check_extent_data_item()
316 return -EUCLEAN; in check_extent_data_item()
323 if (slot > 0 && in check_extent_data_item()
324 prev_key->objectid == key->objectid && in check_extent_data_item()
325 prev_key->type == BTRFS_EXTENT_DATA_KEY) { in check_extent_data_item()
329 prev_fi = btrfs_item_ptr(leaf, slot - 1, in check_extent_data_item()
332 if (unlikely(prev_end > key->offset)) { in check_extent_data_item()
333 file_extent_err(leaf, slot - 1, in check_extent_data_item()
335 prev_end, key->offset); in check_extent_data_item()
336 return -EUCLEAN; in check_extent_data_item()
344 int slot, struct btrfs_key *prev_key) in check_csum_item() argument
346 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_csum_item()
347 u32 sectorsize = fs_info->sectorsize; in check_csum_item()
348 const u32 csumsize = fs_info->csum_size; in check_csum_item()
350 if (unlikely(key->objectid != BTRFS_EXTENT_CSUM_OBJECTID)) { in check_csum_item()
351 generic_err(leaf, slot, in check_csum_item()
353 key->objectid, BTRFS_EXTENT_CSUM_OBJECTID); in check_csum_item()
354 return -EUCLEAN; in check_csum_item()
356 if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) { in check_csum_item()
357 generic_err(leaf, slot, in check_csum_item()
359 key->offset, sectorsize); in check_csum_item()
360 return -EUCLEAN; in check_csum_item()
362 if (unlikely(!IS_ALIGNED(btrfs_item_size(leaf, slot), csumsize))) { in check_csum_item()
363 generic_err(leaf, slot, in check_csum_item()
364 "unaligned item size for csum item, have %u should be aligned to %u", in check_csum_item()
365 btrfs_item_size(leaf, slot), csumsize); in check_csum_item()
366 return -EUCLEAN; in check_csum_item()
368 if (slot > 0 && prev_key->type == BTRFS_EXTENT_CSUM_KEY) { in check_csum_item()
372 prev_item_size = btrfs_item_size(leaf, slot - 1); in check_csum_item()
374 prev_csum_end += prev_key->offset; in check_csum_item()
375 if (unlikely(prev_csum_end > key->offset)) { in check_csum_item()
376 generic_err(leaf, slot - 1, in check_csum_item()
378 prev_csum_end, key->offset); in check_csum_item()
379 return -EUCLEAN; in check_csum_item()
386 #define inode_item_err(eb, slot, fmt, ...) \ argument
387 dir_item_err(eb, slot, fmt, __VA_ARGS__)
390 int slot) in check_inode_key() argument
395 btrfs_item_key_to_cpu(leaf, &item_key, slot); in check_inode_key()
400 if (unlikely(key->objectid != 0 || key->type != 0 || in check_inode_key()
401 key->offset != 0)) in check_inode_key()
402 return -EUCLEAN; in check_inode_key()
406 if (unlikely((key->objectid < BTRFS_FIRST_FREE_OBJECTID || in check_inode_key()
407 key->objectid > BTRFS_LAST_FREE_OBJECTID) && in check_inode_key()
408 key->objectid != BTRFS_ROOT_TREE_DIR_OBJECTID && in check_inode_key()
409 key->objectid != BTRFS_FREE_INO_OBJECTID)) { in check_inode_key()
411 generic_err(leaf, slot, in check_inode_key()
413 key->objectid, BTRFS_ROOT_TREE_DIR_OBJECTID, in check_inode_key()
418 dir_item_err(leaf, slot, in check_inode_key()
420 key->objectid, BTRFS_ROOT_TREE_DIR_OBJECTID, in check_inode_key()
425 return -EUCLEAN; in check_inode_key()
427 if (unlikely(key->offset != 0)) { in check_inode_key()
429 inode_item_err(leaf, slot, in check_inode_key()
431 key->offset); in check_inode_key()
433 dir_item_err(leaf, slot, in check_inode_key()
435 key->offset); in check_inode_key()
436 return -EUCLEAN; in check_inode_key()
442 int slot) in check_root_key() argument
447 btrfs_item_key_to_cpu(leaf, &item_key, slot); in check_root_key()
456 if (unlikely(is_root_item && key->objectid == BTRFS_TREE_RELOC_OBJECTID && in check_root_key()
457 !is_fstree(key->offset))) { in check_root_key()
458 generic_err(leaf, slot, in check_root_key()
460 key->offset); in check_root_key()
461 return -EUCLEAN; in check_root_key()
465 if (unlikely(key->objectid == 0)) { in check_root_key()
467 generic_err(leaf, slot, "invalid root id 0"); in check_root_key()
469 dir_item_err(leaf, slot, in check_root_key()
471 return -EUCLEAN; in check_root_key()
474 /* DIR_ITEM/INDEX/INODE_REF is not allowed to point to non-fs trees */ in check_root_key()
475 if (unlikely(!is_fstree(key->objectid) && !is_root_item)) { in check_root_key()
476 dir_item_err(leaf, slot, in check_root_key()
478 key->objectid, BTRFS_FIRST_FREE_OBJECTID, in check_root_key()
480 return -EUCLEAN; in check_root_key()
484 * ROOT_ITEM with non-zero offset means this is a snapshot, created at in check_root_key()
486 * Furthermore, for location key in DIR_ITEM, its offset is always -1. in check_root_key()
488 * So here we only check offset for reloc tree whose key->offset must in check_root_key()
491 if (unlikely(key->objectid == BTRFS_TREE_RELOC_OBJECTID && in check_root_key()
492 key->offset == 0)) { in check_root_key()
493 generic_err(leaf, slot, "invalid root id 0 for reloc tree"); in check_root_key()
494 return -EUCLEAN; in check_root_key()
501 int slot) in check_dir_item() argument
503 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_dir_item()
505 u32 item_size = btrfs_item_size(leaf, slot); in check_dir_item()
508 if (unlikely(!check_prev_ino(leaf, key, slot, prev_key))) in check_dir_item()
509 return -EUCLEAN; in check_dir_item()
511 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); in check_dir_item()
524 dir_item_err(leaf, slot, in check_dir_item()
527 return -EUCLEAN; in check_dir_item()
533 ret = check_root_key(leaf, &location_key, slot); in check_dir_item()
538 ret = check_inode_key(leaf, &location_key, slot); in check_dir_item()
542 dir_item_err(leaf, slot, in check_dir_item()
546 return -EUCLEAN; in check_dir_item()
553 dir_item_err(leaf, slot, in check_dir_item()
556 return -EUCLEAN; in check_dir_item()
559 if (unlikely(key->type == BTRFS_XATTR_ITEM_KEY && in check_dir_item()
561 dir_item_err(leaf, slot, in check_dir_item()
564 return -EUCLEAN; in check_dir_item()
567 key->type != BTRFS_XATTR_ITEM_KEY)) { in check_dir_item()
568 dir_item_err(leaf, slot, in check_dir_item()
569 "xattr dir type found for non-XATTR key"); in check_dir_item()
570 return -EUCLEAN; in check_dir_item()
581 dir_item_err(leaf, slot, in check_dir_item()
584 return -EUCLEAN; in check_dir_item()
587 dir_item_err(leaf, slot, in check_dir_item()
591 return -EUCLEAN; in check_dir_item()
595 dir_item_err(leaf, slot, in check_dir_item()
598 return -EUCLEAN; in check_dir_item()
605 dir_item_err(leaf, slot, in check_dir_item()
608 return -EUCLEAN; in check_dir_item()
612 * Special check for XATTR/DIR_ITEM, as key->offset is name in check_dir_item()
615 if (key->type == BTRFS_DIR_ITEM_KEY || in check_dir_item()
616 key->type == BTRFS_XATTR_ITEM_KEY) { in check_dir_item()
622 if (unlikely(key->offset != name_hash)) { in check_dir_item()
623 dir_item_err(leaf, slot, in check_dir_item()
625 name_hash, key->offset); in check_dir_item()
626 return -EUCLEAN; in check_dir_item()
637 static void block_group_err(const struct extent_buffer *eb, int slot, in block_group_err() argument
640 const struct btrfs_fs_info *fs_info = eb->fs_info; in block_group_err()
645 btrfs_item_key_to_cpu(eb, &key, slot); in block_group_err()
652 "corrupt %s: root=%llu block=%llu slot=%d bg_start=%llu bg_len=%llu, %pV", in block_group_err()
654 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in block_group_err()
660 struct btrfs_key *key, int slot) in check_block_group_item() argument
662 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_block_group_item()
664 u32 item_size = btrfs_item_size(leaf, slot); in check_block_group_item()
671 * handle it. We care more about the size. in check_block_group_item()
673 if (unlikely(key->offset == 0)) { in check_block_group_item()
674 block_group_err(leaf, slot, in check_block_group_item()
675 "invalid block group size 0"); in check_block_group_item()
676 return -EUCLEAN; in check_block_group_item()
680 block_group_err(leaf, slot, in check_block_group_item()
681 "invalid item size, have %u expect %zu", in check_block_group_item()
683 return -EUCLEAN; in check_block_group_item()
686 read_extent_buffer(leaf, &bgi, btrfs_item_ptr_offset(leaf, slot), in check_block_group_item()
696 if (unlikely(fs_info->nr_global_roots && in check_block_group_item()
697 chunk_objectid >= fs_info->nr_global_roots)) { in check_block_group_item()
698 block_group_err(leaf, slot, in check_block_group_item()
701 fs_info->nr_global_roots); in check_block_group_item()
702 return -EUCLEAN; in check_block_group_item()
705 block_group_err(leaf, slot, in check_block_group_item()
709 return -EUCLEAN; in check_block_group_item()
712 if (unlikely(btrfs_stack_block_group_used(&bgi) > key->offset)) { in check_block_group_item()
713 block_group_err(leaf, slot, in check_block_group_item()
715 btrfs_stack_block_group_used(&bgi), key->offset); in check_block_group_item()
716 return -EUCLEAN; in check_block_group_item()
721 block_group_err(leaf, slot, in check_block_group_item()
725 return -EUCLEAN; in check_block_group_item()
734 block_group_err(leaf, slot, in check_block_group_item()
740 return -EUCLEAN; in check_block_group_item()
751 const struct btrfs_fs_info *fs_info = leaf->fs_info; in chunk_err()
756 int slot = -1; in chunk_err() local
759 is_sb = (leaf->start == BTRFS_SUPER_INFO_OFFSET); in chunk_err()
763 * Get the slot number by iterating through all slots, this in chunk_err()
769 slot = i; in chunk_err()
784 "corrupt leaf: root=%llu block=%llu slot=%d chunk_start=%llu, %pV", in chunk_err()
785 BTRFS_CHUNK_TREE_OBJECTID, leaf->start, slot, in chunk_err()
793 * Return -EUCLEAN if anything is corrupted.
799 struct btrfs_fs_info *fs_info = leaf->fs_info; in btrfs_check_chunk_valid()
824 return -EUCLEAN; in btrfs_check_chunk_valid()
830 return -EUCLEAN; in btrfs_check_chunk_valid()
836 return -EUCLEAN; in btrfs_check_chunk_valid()
838 if (unlikely(!IS_ALIGNED(logical, fs_info->sectorsize))) { in btrfs_check_chunk_valid()
841 logical, fs_info->sectorsize); in btrfs_check_chunk_valid()
842 return -EUCLEAN; in btrfs_check_chunk_valid()
844 if (unlikely(btrfs_chunk_sector_size(leaf, chunk) != fs_info->sectorsize)) { in btrfs_check_chunk_valid()
848 fs_info->sectorsize); in btrfs_check_chunk_valid()
849 return -EUCLEAN; in btrfs_check_chunk_valid()
851 if (unlikely(!length || !IS_ALIGNED(length, fs_info->sectorsize))) { in btrfs_check_chunk_valid()
854 return -EUCLEAN; in btrfs_check_chunk_valid()
860 return -EUCLEAN; in btrfs_check_chunk_valid()
866 return -EUCLEAN; in btrfs_check_chunk_valid()
869 * We artificially limit the chunk size, so that the number of stripes in btrfs_check_chunk_valid()
880 return -EUCLEAN; in btrfs_check_chunk_valid()
889 return -EUCLEAN; in btrfs_check_chunk_valid()
897 return -EUCLEAN; in btrfs_check_chunk_valid()
903 return -EUCLEAN; in btrfs_check_chunk_valid()
912 return -EUCLEAN; in btrfs_check_chunk_valid()
915 features = btrfs_super_incompat_flags(fs_info->super_copy); in btrfs_check_chunk_valid()
923 "mixed chunk type in non-mixed mode: 0x%llx", type); in btrfs_check_chunk_valid()
924 return -EUCLEAN; in btrfs_check_chunk_valid()
948 return -EUCLEAN; in btrfs_check_chunk_valid()
957 * The common btrfs_check_chunk_valid() doesn't check item size since it needs
962 struct btrfs_key *key, int slot) in check_leaf_chunk_item() argument
966 if (unlikely(btrfs_item_size(leaf, slot) < sizeof(struct btrfs_chunk))) { in check_leaf_chunk_item()
967 chunk_err(leaf, chunk, key->offset, in check_leaf_chunk_item()
968 "invalid chunk item size: have %u expect [%zu, %u)", in check_leaf_chunk_item()
969 btrfs_item_size(leaf, slot), in check_leaf_chunk_item()
971 BTRFS_LEAF_DATA_SIZE(leaf->fs_info)); in check_leaf_chunk_item()
972 return -EUCLEAN; in check_leaf_chunk_item()
981 btrfs_item_size(leaf, slot))) { in check_leaf_chunk_item()
982 chunk_err(leaf, chunk, key->offset, in check_leaf_chunk_item()
983 "invalid chunk item size: have %u expect %lu", in check_leaf_chunk_item()
984 btrfs_item_size(leaf, slot), in check_leaf_chunk_item()
986 return -EUCLEAN; in check_leaf_chunk_item()
989 return btrfs_check_chunk_valid(leaf, chunk, key->offset); in check_leaf_chunk_item()
994 static void dev_item_err(const struct extent_buffer *eb, int slot, in dev_item_err() argument
1001 btrfs_item_key_to_cpu(eb, &key, slot); in dev_item_err()
1007 btrfs_crit(eb->fs_info, in dev_item_err()
1008 "corrupt %s: root=%llu block=%llu slot=%d devid=%llu %pV", in dev_item_err()
1010 btrfs_header_owner(eb), btrfs_header_bytenr(eb), slot, in dev_item_err()
1016 struct btrfs_key *key, int slot) in check_dev_item() argument
1019 const u32 item_size = btrfs_item_size(leaf, slot); in check_dev_item()
1021 if (unlikely(key->objectid != BTRFS_DEV_ITEMS_OBJECTID)) { in check_dev_item()
1022 dev_item_err(leaf, slot, in check_dev_item()
1024 key->objectid, BTRFS_DEV_ITEMS_OBJECTID); in check_dev_item()
1025 return -EUCLEAN; in check_dev_item()
1029 dev_item_err(leaf, slot, "invalid item size: has %u expect %zu", in check_dev_item()
1031 return -EUCLEAN; in check_dev_item()
1034 ditem = btrfs_item_ptr(leaf, slot, struct btrfs_dev_item); in check_dev_item()
1035 if (unlikely(btrfs_device_id(leaf, ditem) != key->offset)) { in check_dev_item()
1036 dev_item_err(leaf, slot, in check_dev_item()
1038 key->offset, btrfs_device_id(leaf, ditem)); in check_dev_item()
1039 return -EUCLEAN; in check_dev_item()
1044 * it can be 0 for device removal. Device size check can only be done in check_dev_item()
1049 dev_item_err(leaf, slot, in check_dev_item()
1053 return -EUCLEAN; in check_dev_item()
1063 struct btrfs_key *key, int slot) in check_inode_item() argument
1065 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_inode_item()
1067 u64 super_gen = btrfs_super_generation(fs_info->super_copy); in check_inode_item()
1069 const u32 item_size = btrfs_item_size(leaf, slot); in check_inode_item()
1075 ret = check_inode_key(leaf, key, slot); in check_inode_item()
1080 generic_err(leaf, slot, "invalid item size: has %u expect %zu", in check_inode_item()
1082 return -EUCLEAN; in check_inode_item()
1085 iitem = btrfs_item_ptr(leaf, slot, struct btrfs_inode_item); in check_inode_item()
1089 inode_item_err(leaf, slot, in check_inode_item()
1093 return -EUCLEAN; in check_inode_item()
1097 inode_item_err(leaf, slot, in check_inode_item()
1100 return -EUCLEAN; in check_inode_item()
1104 * For size and nbytes it's better not to be too strict, as for dir in check_inode_item()
1105 * item its size/nbytes can easily get wrong, but doesn't affect in check_inode_item()
1110 inode_item_err(leaf, slot, in check_inode_item()
1113 return -EUCLEAN; in check_inode_item()
1123 inode_item_err(leaf, slot, in check_inode_item()
1126 return -EUCLEAN; in check_inode_item()
1130 inode_item_err(leaf, slot, in check_inode_item()
1133 return -EUCLEAN; in check_inode_item()
1137 inode_item_err(leaf, slot, in check_inode_item()
1139 return -EUCLEAN; in check_inode_item()
1141 if (unlikely(!sb_rdonly(fs_info->sb) && in check_inode_item()
1143 inode_item_err(leaf, slot, in check_inode_item()
1144 "unknown ro-compat flags detected on writeable mount: 0x%x", in check_inode_item()
1146 return -EUCLEAN; in check_inode_item()
1152 int slot) in check_root_item() argument
1154 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_root_item()
1160 ret = check_root_key(leaf, key, slot); in check_root_item()
1164 if (unlikely(btrfs_item_size(leaf, slot) != sizeof(ri) && in check_root_item()
1165 btrfs_item_size(leaf, slot) != in check_root_item()
1167 generic_err(leaf, slot, in check_root_item()
1168 "invalid root item size, have %u expect %zu or %u", in check_root_item()
1169 btrfs_item_size(leaf, slot), sizeof(ri), in check_root_item()
1171 return -EUCLEAN; in check_root_item()
1179 read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot), in check_root_item()
1180 btrfs_item_size(leaf, slot)); in check_root_item()
1184 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_root_item()
1185 generic_err(leaf, slot, in check_root_item()
1188 btrfs_super_generation(fs_info->super_copy) + 1); in check_root_item()
1189 return -EUCLEAN; in check_root_item()
1192 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_root_item()
1193 generic_err(leaf, slot, in check_root_item()
1196 btrfs_super_generation(fs_info->super_copy) + 1); in check_root_item()
1197 return -EUCLEAN; in check_root_item()
1200 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_root_item()
1201 generic_err(leaf, slot, in check_root_item()
1204 btrfs_super_generation(fs_info->super_copy) + 1); in check_root_item()
1205 return -EUCLEAN; in check_root_item()
1209 if (unlikely(!IS_ALIGNED(btrfs_root_bytenr(&ri), fs_info->sectorsize))) { in check_root_item()
1210 generic_err(leaf, slot, in check_root_item()
1212 btrfs_root_bytenr(&ri), fs_info->sectorsize); in check_root_item()
1213 return -EUCLEAN; in check_root_item()
1216 generic_err(leaf, slot, in check_root_item()
1218 btrfs_root_level(&ri), BTRFS_MAX_LEVEL - 1); in check_root_item()
1219 return -EUCLEAN; in check_root_item()
1222 generic_err(leaf, slot, in check_root_item()
1224 btrfs_root_drop_level(&ri), BTRFS_MAX_LEVEL - 1); in check_root_item()
1225 return -EUCLEAN; in check_root_item()
1230 generic_err(leaf, slot, in check_root_item()
1233 return -EUCLEAN; in check_root_item()
1240 static void extent_err(const struct extent_buffer *eb, int slot, in extent_err() argument
1249 btrfs_item_key_to_cpu(eb, &key, slot); in extent_err()
1254 len = eb->fs_info->nodesize; in extent_err()
1262 btrfs_crit(eb->fs_info, in extent_err()
1263 "corrupt %s: block=%llu slot=%d extent bytenr=%llu len=%llu %pV", in extent_err()
1265 eb->start, slot, bytenr, len, &vaf); in extent_err()
1273 * - subvolume trees in is_valid_dref_root()
1274 * - data reloc tree in is_valid_dref_root()
1275 * - tree root in is_valid_dref_root()
1283 struct btrfs_key *key, int slot, in check_extent_item() argument
1286 struct btrfs_fs_info *fs_info = leaf->fs_info; in check_extent_item()
1291 const u32 item_size = btrfs_item_size(leaf, slot); in check_extent_item()
1299 if (unlikely(key->type == BTRFS_METADATA_ITEM_KEY && in check_extent_item()
1301 generic_err(leaf, slot, in check_extent_item()
1303 return -EUCLEAN; in check_extent_item()
1305 /* key->objectid is the bytenr for both key types */ in check_extent_item()
1306 if (unlikely(!IS_ALIGNED(key->objectid, fs_info->sectorsize))) { in check_extent_item()
1307 generic_err(leaf, slot, in check_extent_item()
1309 key->objectid, fs_info->sectorsize); in check_extent_item()
1310 return -EUCLEAN; in check_extent_item()
1313 /* key->offset is tree level for METADATA_ITEM_KEY */ in check_extent_item()
1314 if (unlikely(key->type == BTRFS_METADATA_ITEM_KEY && in check_extent_item()
1315 key->offset >= BTRFS_MAX_LEVEL)) { in check_extent_item()
1316 extent_err(leaf, slot, in check_extent_item()
1318 key->offset, BTRFS_MAX_LEVEL - 1); in check_extent_item()
1319 return -EUCLEAN; in check_extent_item()
1343 * - All btrfs_extent_inline_ref::type should be in an ascending in check_extent_item()
1346 * - Within the same type, the items should follow a descending in check_extent_item()
1354 extent_err(leaf, slot, in check_extent_item()
1355 "invalid item size, have %u expect [%zu, %u)", in check_extent_item()
1358 return -EUCLEAN; in check_extent_item()
1360 end = item_size + btrfs_item_ptr_offset(leaf, slot); in check_extent_item()
1363 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item); in check_extent_item()
1368 btrfs_super_generation(fs_info->super_copy) + 1)) { in check_extent_item()
1369 extent_err(leaf, slot, in check_extent_item()
1372 btrfs_super_generation(fs_info->super_copy) + 1); in check_extent_item()
1373 return -EUCLEAN; in check_extent_item()
1377 extent_err(leaf, slot, in check_extent_item()
1381 return -EUCLEAN; in check_extent_item()
1385 if (unlikely(key->type == BTRFS_EXTENT_ITEM_KEY && in check_extent_item()
1386 key->offset != fs_info->nodesize)) { in check_extent_item()
1387 extent_err(leaf, slot, in check_extent_item()
1389 key->offset, fs_info->nodesize); in check_extent_item()
1390 return -EUCLEAN; in check_extent_item()
1393 if (unlikely(key->type != BTRFS_EXTENT_ITEM_KEY)) { in check_extent_item()
1394 extent_err(leaf, slot, in check_extent_item()
1396 key->type, BTRFS_EXTENT_ITEM_KEY); in check_extent_item()
1397 return -EUCLEAN; in check_extent_item()
1399 if (unlikely(!IS_ALIGNED(key->offset, fs_info->sectorsize))) { in check_extent_item()
1400 extent_err(leaf, slot, in check_extent_item()
1402 key->offset, fs_info->sectorsize); in check_extent_item()
1403 return -EUCLEAN; in check_extent_item()
1406 extent_err(leaf, slot, in check_extent_item()
1408 return -EUCLEAN; in check_extent_item()
1414 if (is_tree_block && key->type != BTRFS_METADATA_ITEM_KEY) { in check_extent_item()
1419 extent_err(leaf, slot, in check_extent_item()
1422 BTRFS_MAX_LEVEL - 1); in check_extent_item()
1423 return -EUCLEAN; in check_extent_item()
1441 extent_err(leaf, slot, in check_extent_item()
1442 "inline ref item overflows extent item, ptr %lu iref size %zu end %lu", in check_extent_item()
1444 return -EUCLEAN; in check_extent_item()
1451 extent_err(leaf, slot, in check_extent_item()
1452 "inline ref item overflows extent item, ptr %lu iref size %u end %lu", in check_extent_item()
1454 return -EUCLEAN; in check_extent_item()
1465 fs_info->sectorsize))) { in check_extent_item()
1466 extent_err(leaf, slot, in check_extent_item()
1468 inline_offset, fs_info->sectorsize); in check_extent_item()
1469 return -EUCLEAN; in check_extent_item()
1478 dref = (struct btrfs_extent_data_ref *)(&iref->offset); in check_extent_item()
1487 extent_err(leaf, slot, in check_extent_item()
1490 return -EUCLEAN; in check_extent_item()
1494 extent_err(leaf, slot, in check_extent_item()
1497 return -EUCLEAN; in check_extent_item()
1500 fs_info->sectorsize))) { in check_extent_item()
1501 extent_err(leaf, slot, in check_extent_item()
1503 dref_offset, fs_info->sectorsize); in check_extent_item()
1504 return -EUCLEAN; in check_extent_item()
1507 extent_err(leaf, slot, in check_extent_item()
1508 "invalid data ref count, should have non-zero value"); in check_extent_item()
1509 return -EUCLEAN; in check_extent_item()
1517 fs_info->sectorsize))) { in check_extent_item()
1518 extent_err(leaf, slot, in check_extent_item()
1520 inline_offset, fs_info->sectorsize); in check_extent_item()
1521 return -EUCLEAN; in check_extent_item()
1524 extent_err(leaf, slot, in check_extent_item()
1525 "invalid shared data ref count, should have non-zero value"); in check_extent_item()
1526 return -EUCLEAN; in check_extent_item()
1531 extent_err(leaf, slot, "unknown inline ref type: %u", in check_extent_item()
1533 return -EUCLEAN; in check_extent_item()
1536 extent_err(leaf, slot, in check_extent_item()
1537 "inline ref out-of-order: has type %u, prev type %u", in check_extent_item()
1539 return -EUCLEAN; in check_extent_item()
1545 extent_err(leaf, slot, in check_extent_item()
1546 "inline ref out-of-order: has type %u offset %llu seq 0x%llx, prev type %u seq 0x%llx", in check_extent_item()
1549 return -EUCLEAN; in check_extent_item()
1557 extent_err(leaf, slot, in check_extent_item()
1558 "invalid extent item size, padding bytes found"); in check_extent_item()
1559 return -EUCLEAN; in check_extent_item()
1564 extent_err(leaf, slot, in check_extent_item()
1567 return -EUCLEAN; in check_extent_item()
1570 if ((prev_key->type == BTRFS_EXTENT_ITEM_KEY) || in check_extent_item()
1571 (prev_key->type == BTRFS_METADATA_ITEM_KEY)) { in check_extent_item()
1572 u64 prev_end = prev_key->objectid; in check_extent_item()
1574 if (prev_key->type == BTRFS_METADATA_ITEM_KEY) in check_extent_item()
1575 prev_end += fs_info->nodesize; in check_extent_item()
1577 prev_end += prev_key->offset; in check_extent_item()
1579 if (unlikely(prev_end > key->objectid)) { in check_extent_item()
1580 extent_err(leaf, slot, in check_extent_item()
1582 prev_key->objectid, prev_key->type, in check_extent_item()
1583 prev_key->offset, key->objectid, key->type, in check_extent_item()
1584 key->offset); in check_extent_item()
1585 return -EUCLEAN; in check_extent_item()
1593 struct btrfs_key *key, int slot) in check_simple_keyed_refs() argument
1597 if (key->type == BTRFS_SHARED_DATA_REF_KEY) { in check_simple_keyed_refs()
1600 sref = btrfs_item_ptr(leaf, slot, struct btrfs_shared_data_ref); in check_simple_keyed_refs()
1602 extent_err(leaf, slot, in check_simple_keyed_refs()
1603 "invalid shared data backref count, should have non-zero value"); in check_simple_keyed_refs()
1604 return -EUCLEAN; in check_simple_keyed_refs()
1610 if (unlikely(btrfs_item_size(leaf, slot) != expect_item_size)) { in check_simple_keyed_refs()
1611 generic_err(leaf, slot, in check_simple_keyed_refs()
1612 "invalid item size, have %u expect %u for key type %u", in check_simple_keyed_refs()
1613 btrfs_item_size(leaf, slot), in check_simple_keyed_refs()
1614 expect_item_size, key->type); in check_simple_keyed_refs()
1615 return -EUCLEAN; in check_simple_keyed_refs()
1617 if (unlikely(!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize))) { in check_simple_keyed_refs()
1618 generic_err(leaf, slot, in check_simple_keyed_refs()
1620 key->objectid, leaf->fs_info->sectorsize); in check_simple_keyed_refs()
1621 return -EUCLEAN; in check_simple_keyed_refs()
1623 if (unlikely(key->type != BTRFS_TREE_BLOCK_REF_KEY && in check_simple_keyed_refs()
1624 !IS_ALIGNED(key->offset, leaf->fs_info->sectorsize))) { in check_simple_keyed_refs()
1625 extent_err(leaf, slot, in check_simple_keyed_refs()
1627 key->offset, leaf->fs_info->sectorsize); in check_simple_keyed_refs()
1628 return -EUCLEAN; in check_simple_keyed_refs()
1634 struct btrfs_key *key, int slot) in check_extent_data_ref() argument
1637 unsigned long ptr = btrfs_item_ptr_offset(leaf, slot); in check_extent_data_ref()
1638 const unsigned long end = ptr + btrfs_item_size(leaf, slot); in check_extent_data_ref()
1640 if (unlikely(btrfs_item_size(leaf, slot) % sizeof(*dref) != 0)) { in check_extent_data_ref()
1641 generic_err(leaf, slot, in check_extent_data_ref()
1642 "invalid item size, have %u expect aligned to %zu for key type %u", in check_extent_data_ref()
1643 btrfs_item_size(leaf, slot), in check_extent_data_ref()
1644 sizeof(*dref), key->type); in check_extent_data_ref()
1645 return -EUCLEAN; in check_extent_data_ref()
1647 if (unlikely(!IS_ALIGNED(key->objectid, leaf->fs_info->sectorsize))) { in check_extent_data_ref()
1648 generic_err(leaf, slot, in check_extent_data_ref()
1650 key->objectid, leaf->fs_info->sectorsize); in check_extent_data_ref()
1651 return -EUCLEAN; in check_extent_data_ref()
1667 extent_err(leaf, slot, in check_extent_data_ref()
1670 return -EUCLEAN; in check_extent_data_ref()
1674 extent_err(leaf, slot, in check_extent_data_ref()
1677 return -EUCLEAN; in check_extent_data_ref()
1679 if (unlikely(!IS_ALIGNED(offset, leaf->fs_info->sectorsize))) { in check_extent_data_ref()
1680 extent_err(leaf, slot, in check_extent_data_ref()
1682 offset, leaf->fs_info->sectorsize); in check_extent_data_ref()
1683 return -EUCLEAN; in check_extent_data_ref()
1686 extent_err(leaf, slot, in check_extent_data_ref()
1687 "invalid extent data backref count, should have non-zero value"); in check_extent_data_ref()
1688 return -EUCLEAN; in check_extent_data_ref()
1694 #define inode_ref_err(eb, slot, fmt, args...) \ argument
1695 inode_item_err(eb, slot, fmt, ##args)
1698 int slot) in check_inode_ref() argument
1704 if (unlikely(!check_prev_ino(leaf, key, slot, prev_key))) in check_inode_ref()
1705 return -EUCLEAN; in check_inode_ref()
1707 if (unlikely(btrfs_item_size(leaf, slot) <= sizeof(*iref))) { in check_inode_ref()
1708 inode_ref_err(leaf, slot, in check_inode_ref()
1709 "invalid item size, have %u expect (%zu, %u)", in check_inode_ref()
1710 btrfs_item_size(leaf, slot), in check_inode_ref()
1711 sizeof(*iref), BTRFS_LEAF_DATA_SIZE(leaf->fs_info)); in check_inode_ref()
1712 return -EUCLEAN; in check_inode_ref()
1715 ptr = btrfs_item_ptr_offset(leaf, slot); in check_inode_ref()
1716 end = ptr + btrfs_item_size(leaf, slot); in check_inode_ref()
1721 inode_ref_err(leaf, slot, in check_inode_ref()
1724 return -EUCLEAN; in check_inode_ref()
1730 inode_ref_err(leaf, slot, in check_inode_ref()
1733 return -EUCLEAN; in check_inode_ref()
1748 int slot, in check_dev_extent_item() argument
1752 const u32 sectorsize = leaf->fs_info->sectorsize; in check_dev_extent_item()
1754 de = btrfs_item_ptr(leaf, slot, struct btrfs_dev_extent); in check_dev_extent_item()
1758 generic_err(leaf, slot, in check_dev_extent_item()
1762 return -EUCLEAN; in check_dev_extent_item()
1766 generic_err(leaf, slot, in check_dev_extent_item()
1770 return -EUCLEAN; in check_dev_extent_item()
1773 if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) { in check_dev_extent_item()
1774 generic_err(leaf, slot, in check_dev_extent_item()
1776 key->offset, sectorsize); in check_dev_extent_item()
1777 return -EUCLEAN; in check_dev_extent_item()
1781 generic_err(leaf, slot, in check_dev_extent_item()
1785 return -EUCLEAN; in check_dev_extent_item()
1789 generic_err(leaf, slot, in check_dev_extent_item()
1792 return -EUCLEAN; in check_dev_extent_item()
1795 if (slot && prev_key->objectid == key->objectid && in check_dev_extent_item()
1796 prev_key->type == key->type) { in check_dev_extent_item()
1800 prev_de = btrfs_item_ptr(leaf, slot - 1, struct btrfs_dev_extent); in check_dev_extent_item()
1802 if (unlikely(prev_key->offset + prev_len > key->offset)) { in check_dev_extent_item()
1803 generic_err(leaf, slot, in check_dev_extent_item()
1805 prev_key->objectid, prev_len, key->offset); in check_dev_extent_item()
1806 return -EUCLEAN; in check_dev_extent_item()
1813 * Common point to switch the item-specific validation.
1817 int slot, in check_leaf_item() argument
1823 switch (key->type) { in check_leaf_item()
1825 ret = check_extent_data_item(leaf, key, slot, prev_key); in check_leaf_item()
1828 ret = check_csum_item(leaf, key, slot, prev_key); in check_leaf_item()
1833 ret = check_dir_item(leaf, key, prev_key, slot); in check_leaf_item()
1836 ret = check_inode_ref(leaf, key, prev_key, slot); in check_leaf_item()
1839 ret = check_block_group_item(leaf, key, slot); in check_leaf_item()
1842 chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk); in check_leaf_item()
1843 ret = check_leaf_chunk_item(leaf, chunk, key, slot); in check_leaf_item()
1846 ret = check_dev_item(leaf, key, slot); in check_leaf_item()
1849 ret = check_dev_extent_item(leaf, key, slot, prev_key); in check_leaf_item()
1852 ret = check_inode_item(leaf, key, slot); in check_leaf_item()
1855 ret = check_root_item(leaf, key, slot); in check_leaf_item()
1859 ret = check_extent_item(leaf, key, slot, prev_key); in check_leaf_item()
1864 ret = check_simple_keyed_refs(leaf, key, slot); in check_leaf_item()
1867 ret = check_extent_data_ref(leaf, key, slot); in check_leaf_item()
1878 struct btrfs_fs_info *fs_info = leaf->fs_info; in __btrfs_check_leaf()
1883 int slot; in __btrfs_check_leaf() local
1949 * 2) item offset and size in __btrfs_check_leaf()
1955 for (slot = 0; slot < nritems; slot++) { in __btrfs_check_leaf()
1960 btrfs_item_key_to_cpu(leaf, &key, slot); in __btrfs_check_leaf()
1964 generic_err(leaf, slot, in __btrfs_check_leaf()
1972 item_data_end = (u64)btrfs_item_offset(leaf, slot) + in __btrfs_check_leaf()
1973 btrfs_item_size(leaf, slot); in __btrfs_check_leaf()
1979 if (slot == 0) in __btrfs_check_leaf()
1983 slot - 1); in __btrfs_check_leaf()
1985 generic_err(leaf, slot, in __btrfs_check_leaf()
1997 generic_err(leaf, slot, in __btrfs_check_leaf()
1998 "slot end outside of leaf, have %llu expect range [0, %u]", in __btrfs_check_leaf()
2004 if (unlikely(btrfs_item_ptr_offset(leaf, slot) < in __btrfs_check_leaf()
2005 btrfs_item_nr_offset(leaf, slot) + sizeof(struct btrfs_item))) { in __btrfs_check_leaf()
2006 generic_err(leaf, slot, in __btrfs_check_leaf()
2007 "slot overlaps with its data, item end %lu data start %lu", in __btrfs_check_leaf()
2008 btrfs_item_nr_offset(leaf, slot) + in __btrfs_check_leaf()
2010 btrfs_item_ptr_offset(leaf, slot)); in __btrfs_check_leaf()
2014 /* Check if the item size and content meet other criteria. */ in __btrfs_check_leaf()
2015 ret = check_leaf_item(leaf, &key, slot, &prev_key); in __btrfs_check_leaf()
2033 return -EUCLEAN; in btrfs_check_leaf()
2040 struct btrfs_fs_info *fs_info = node->fs_info; in __btrfs_check_node()
2043 int slot; in __btrfs_check_node() local
2055 level, BTRFS_MAX_LEVEL - 1); in __btrfs_check_node()
2061 btrfs_header_owner(node), node->start, in __btrfs_check_node()
2067 for (slot = 0; slot < nr - 1; slot++) { in __btrfs_check_node()
2068 bytenr = btrfs_node_blockptr(node, slot); in __btrfs_check_node()
2069 btrfs_node_key_to_cpu(node, &key, slot); in __btrfs_check_node()
2070 btrfs_node_key_to_cpu(node, &next_key, slot + 1); in __btrfs_check_node()
2073 generic_err(node, slot, in __btrfs_check_node()
2077 if (unlikely(!IS_ALIGNED(bytenr, fs_info->sectorsize))) { in __btrfs_check_node()
2078 generic_err(node, slot, in __btrfs_check_node()
2080 bytenr, fs_info->sectorsize); in __btrfs_check_node()
2085 generic_err(node, slot, in __btrfs_check_node()
2102 return -EUCLEAN; in btrfs_check_node()
2116 if (test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &eb->fs_info->fs_state)) in btrfs_check_eb_owner()
2135 /* For non-subvolume trees, the eb owner should match root owner */ in btrfs_check_eb_owner()
2137 btrfs_crit(eb->fs_info, in btrfs_check_eb_owner()
2142 return -EUCLEAN; in btrfs_check_eb_owner()
2152 btrfs_crit(eb->fs_info, in btrfs_check_eb_owner()
2157 return -EUCLEAN; in btrfs_check_eb_owner()
2165 struct btrfs_fs_info *fs_info = eb->fs_info; in btrfs_verify_level_key()
2176 eb->start, level, found_level); in btrfs_verify_level_key()
2177 return -EIO; in btrfs_verify_level_key()
2187 * generation <= fs_info->last_trans_committed. in btrfs_verify_level_key()
2189 if (btrfs_header_generation(eb) > fs_info->last_trans_committed) in btrfs_verify_level_key()
2196 eb->start); in btrfs_verify_level_key()
2198 return -EUCLEAN; in btrfs_verify_level_key()
2212 eb->start, parent_transid, first_key->objectid, in btrfs_verify_level_key()
2213 first_key->type, first_key->offset, in btrfs_verify_level_key()