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 ---