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