tree-checker.c (db6da59cf27b5661ced03754ae0550f8914eda9e) | tree-checker.c (85d8a826c7cde17f9cca9c4debecb4538bdb6573) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) Qu Wenruo 2017. All rights reserved. 4 */ 5 6/* 7 * The module is used to catch unexpected/corrupted tree block data. 8 * Such behavior can be caused either by a fuzzed image or bugs. --- 1660 unchanged lines hidden (view full) --- 1669 break; 1670 case BTRFS_EXTENT_DATA_REF_KEY: 1671 ret = check_extent_data_ref(leaf, key, slot); 1672 break; 1673 } 1674 return ret; 1675} 1676 | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) Qu Wenruo 2017. All rights reserved. 4 */ 5 6/* 7 * The module is used to catch unexpected/corrupted tree block data. 8 * Such behavior can be caused either by a fuzzed image or bugs. --- 1660 unchanged lines hidden (view full) --- 1669 break; 1670 case BTRFS_EXTENT_DATA_REF_KEY: 1671 ret = check_extent_data_ref(leaf, key, slot); 1672 break; 1673 } 1674 return ret; 1675} 1676 |
1677static int check_leaf(struct extent_buffer *leaf, bool check_item_data) | 1677int btrfs_check_leaf(struct extent_buffer *leaf) |
1678{ 1679 struct btrfs_fs_info *fs_info = leaf->fs_info; 1680 /* No valid key type is 0, so all key should be larger than this key */ 1681 struct btrfs_key prev_key = {0, 0, 0}; 1682 struct btrfs_key key; 1683 u32 nritems = btrfs_header_nritems(leaf); 1684 int slot; 1685 --- 116 unchanged lines hidden (view full) --- 1802 generic_err(leaf, slot, 1803 "slot overlaps with its data, item end %lu data start %lu", 1804 btrfs_item_nr_offset(leaf, slot) + 1805 sizeof(struct btrfs_item), 1806 btrfs_item_ptr_offset(leaf, slot)); 1807 return -EUCLEAN; 1808 } 1809 | 1678{ 1679 struct btrfs_fs_info *fs_info = leaf->fs_info; 1680 /* No valid key type is 0, so all key should be larger than this key */ 1681 struct btrfs_key prev_key = {0, 0, 0}; 1682 struct btrfs_key key; 1683 u32 nritems = btrfs_header_nritems(leaf); 1684 int slot; 1685 --- 116 unchanged lines hidden (view full) --- 1802 generic_err(leaf, slot, 1803 "slot overlaps with its data, item end %lu data start %lu", 1804 btrfs_item_nr_offset(leaf, slot) + 1805 sizeof(struct btrfs_item), 1806 btrfs_item_ptr_offset(leaf, slot)); 1807 return -EUCLEAN; 1808 } 1809 |
1810 if (check_item_data) { | 1810 /* 1811 * We only want to do this if WRITTEN is set, otherwise the leaf 1812 * may be in some intermediate state and won't appear valid. 1813 */ 1814 if (btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_WRITTEN)) { |
1811 /* 1812 * Check if the item size and content meet other 1813 * criteria 1814 */ 1815 ret = check_leaf_item(leaf, &key, slot, &prev_key); 1816 if (unlikely(ret < 0)) 1817 return ret; 1818 } 1819 1820 prev_key.objectid = key.objectid; 1821 prev_key.type = key.type; 1822 prev_key.offset = key.offset; 1823 } 1824 1825 return 0; 1826} | 1815 /* 1816 * Check if the item size and content meet other 1817 * criteria 1818 */ 1819 ret = check_leaf_item(leaf, &key, slot, &prev_key); 1820 if (unlikely(ret < 0)) 1821 return ret; 1822 } 1823 1824 prev_key.objectid = key.objectid; 1825 prev_key.type = key.type; 1826 prev_key.offset = key.offset; 1827 } 1828 1829 return 0; 1830} |
1831ALLOW_ERROR_INJECTION(btrfs_check_leaf, ERRNO); |
|
1827 | 1832 |
1828int btrfs_check_leaf_full(struct extent_buffer *leaf) 1829{ 1830 return check_leaf(leaf, true); 1831} 1832ALLOW_ERROR_INJECTION(btrfs_check_leaf_full, ERRNO); 1833 1834int btrfs_check_leaf_relaxed(struct extent_buffer *leaf) 1835{ 1836 return check_leaf(leaf, false); 1837} 1838 | |
1839int btrfs_check_node(struct extent_buffer *node) 1840{ 1841 struct btrfs_fs_info *fs_info = node->fs_info; 1842 unsigned long nr = btrfs_header_nritems(node); 1843 struct btrfs_key key, next_key; 1844 int slot; 1845 int level = btrfs_header_level(node); 1846 u64 bytenr; --- 105 unchanged lines hidden --- | 1833int btrfs_check_node(struct extent_buffer *node) 1834{ 1835 struct btrfs_fs_info *fs_info = node->fs_info; 1836 unsigned long nr = btrfs_header_nritems(node); 1837 struct btrfs_key key, next_key; 1838 int slot; 1839 int level = btrfs_header_level(node); 1840 u64 bytenr; --- 105 unchanged lines hidden --- |