162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) Qu Wenruo 2017. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef BTRFS_TREE_CHECKER_H 762306a36Sopenharmony_ci#define BTRFS_TREE_CHECKER_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <uapi/linux/btrfs_tree.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct extent_buffer; 1262306a36Sopenharmony_cistruct btrfs_chunk; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* All the extra info needed to verify the parentness of a tree block. */ 1562306a36Sopenharmony_cistruct btrfs_tree_parent_check { 1662306a36Sopenharmony_ci /* 1762306a36Sopenharmony_ci * The owner check against the tree block. 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * Can be 0 to skip the owner check. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci u64 owner_root; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci /* 2462306a36Sopenharmony_ci * Expected transid, can be 0 to skip the check, but such skip 2562306a36Sopenharmony_ci * should only be utlized for backref walk related code. 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci u64 transid; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci /* 3062306a36Sopenharmony_ci * The expected first key. 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci * This check can be skipped if @has_first_key is false, such skip 3362306a36Sopenharmony_ci * can happen for case where we don't have the parent node key, 3462306a36Sopenharmony_ci * e.g. reading the tree root, doing backref walk. 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci struct btrfs_key first_key; 3762306a36Sopenharmony_ci bool has_first_key; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci /* The expected level. Should always be set. */ 4062306a36Sopenharmony_ci u8 level; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cienum btrfs_tree_block_status { 4462306a36Sopenharmony_ci BTRFS_TREE_BLOCK_CLEAN, 4562306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_NRITEMS, 4662306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_PARENT_KEY, 4762306a36Sopenharmony_ci BTRFS_TREE_BLOCK_BAD_KEY_ORDER, 4862306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_LEVEL, 4962306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_FREE_SPACE, 5062306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_OFFSETS, 5162306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_BLOCKPTR, 5262306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_ITEM, 5362306a36Sopenharmony_ci BTRFS_TREE_BLOCK_INVALID_OWNER, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* 5762306a36Sopenharmony_ci * Exported simply for btrfs-progs which wants to have the 5862306a36Sopenharmony_ci * btrfs_tree_block_status return codes. 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_cienum btrfs_tree_block_status __btrfs_check_leaf(struct extent_buffer *leaf); 6162306a36Sopenharmony_cienum btrfs_tree_block_status __btrfs_check_node(struct extent_buffer *node); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciint btrfs_check_leaf(struct extent_buffer *leaf); 6462306a36Sopenharmony_ciint btrfs_check_node(struct extent_buffer *node); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciint btrfs_check_chunk_valid(struct extent_buffer *leaf, 6762306a36Sopenharmony_ci struct btrfs_chunk *chunk, u64 logical); 6862306a36Sopenharmony_ciint btrfs_check_eb_owner(const struct extent_buffer *eb, u64 root_owner); 6962306a36Sopenharmony_ciint btrfs_verify_level_key(struct extent_buffer *eb, int level, 7062306a36Sopenharmony_ci struct btrfs_key *first_key, u64 parent_transid); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#endif 73