blob: 02125e5e100cb52403b54670125049a0474f45c4 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Marek Behún4eff4262017-09-03 17:00:26 +02002/*
3 * From linux/fs/btrfs/ctree.h
4 * Copyright (C) 2007,2008 Oracle. All rights reserved.
5 *
6 * Modified in 2017 by Marek Behun, CZ.NIC, marek.behun@nic.cz
Marek Behún4eff4262017-09-03 17:00:26 +02007 */
8
9#ifndef __BTRFS_CTREE_H__
10#define __BTRFS_CTREE_H__
11
12#include <common.h>
13#include <compiler.h>
Qu Wenruo07d977f2020-06-24 18:02:47 +020014#include "kernel-shared/btrfs_tree.h"
Qu Wenruo1a618082020-06-24 18:02:49 +020015#include "compat.h"
Marek Behún4eff4262017-09-03 17:00:26 +020016
17#define BTRFS_MAX_MIRRORS 3
18
Marek Behún4eff4262017-09-03 17:00:26 +020019/*
20 * the max metadata block size. This limit is somewhat artificial,
21 * but the memmove costs go through the roof for larger blocks.
22 */
23#define BTRFS_MAX_METADATA_BLOCKSIZE 65536
24
25/*
Marek Behún4eff4262017-09-03 17:00:26 +020026 * Theoretical limit is larger, but we keep this down to a sane
27 * value. That should limit greatly the possibility of collisions on
28 * inode ref items.
29 */
30#define BTRFS_LINK_MAX 65535U
31
Marek Behún4eff4262017-09-03 17:00:26 +020032/* four bytes for CRC32 */
33#define BTRFS_EMPTY_DIR_SIZE 0
34
35/* ioprio of readahead is set to idle */
36#define BTRFS_IOPRIO_READA (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0))
37
38#define BTRFS_DIRTY_METADATA_THRESH SZ_32M
39
40#define BTRFS_MAX_EXTENT_SIZE SZ_128M
41
42/*
43 * File system states
44 */
45#define BTRFS_FS_STATE_ERROR 0
46#define BTRFS_FS_STATE_REMOUNTING 1
47#define BTRFS_FS_STATE_TRANS_ABORTED 2
48#define BTRFS_FS_STATE_DEV_REPLACING 3
49#define BTRFS_FS_STATE_DUMMY_FS_INFO 4
50
Qu Wenruo1a618082020-06-24 18:02:49 +020051#define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \
52static inline u##bits btrfs_##name(const type *s) \
53{ \
54 return le##bits##_to_cpu(s->member); \
55} \
56static inline void btrfs_set_##name(type *s, u##bits val) \
57{ \
58 s->member = cpu_to_le##bits(val); \
59}
60
Marek Behún4eff4262017-09-03 17:00:26 +020061union btrfs_tree_node {
62 struct btrfs_header header;
63 struct btrfs_leaf leaf;
64 struct btrfs_node node;
65};
66
Marek Behún4eff4262017-09-03 17:00:26 +020067struct btrfs_path {
68 union btrfs_tree_node *nodes[BTRFS_MAX_LEVEL];
69 u32 slots[BTRFS_MAX_LEVEL];
70};
71
72struct btrfs_root {
73 u64 objectid;
74 u64 bytenr;
75 u64 root_dirid;
76};
77
78int btrfs_comp_keys(struct btrfs_key *, struct btrfs_key *);
79int btrfs_comp_keys_type(struct btrfs_key *, struct btrfs_key *);
80int btrfs_bin_search(union btrfs_tree_node *, struct btrfs_key *, int *);
81void btrfs_free_path(struct btrfs_path *);
82int btrfs_search_tree(const struct btrfs_root *, struct btrfs_key *,
83 struct btrfs_path *);
84int btrfs_prev_slot(struct btrfs_path *);
85int btrfs_next_slot(struct btrfs_path *);
86
87static inline struct btrfs_key *btrfs_path_leaf_key(struct btrfs_path *p) {
Qu Wenruo07d977f2020-06-24 18:02:47 +020088 /* At tree read time we have converted the endian for btrfs_disk_key */
89 return (struct btrfs_key *)&p->nodes[0]->leaf.items[p->slots[0]].key;
Marek Behún4eff4262017-09-03 17:00:26 +020090}
91
92static inline struct btrfs_key *
93btrfs_search_tree_key_type(const struct btrfs_root *root, u64 objectid,
94 u8 type, struct btrfs_path *path)
95{
96 struct btrfs_key key, *res;
97
98 key.objectid = objectid;
99 key.type = type;
Tom Rini2d8200c2019-04-27 11:34:55 -0400100 key.offset = 0;
Marek Behún4eff4262017-09-03 17:00:26 +0200101
102 if (btrfs_search_tree(root, &key, path))
103 return NULL;
104
Pierre Bourdon9fffe322019-04-13 23:50:49 +0200105 res = btrfs_path_leaf_key(path);
Tom Rini2d8200c2019-04-27 11:34:55 -0400106 if (btrfs_comp_keys_type(&key, res)) {
107 btrfs_free_path(path);
108 return NULL;
109 }
Pierre Bourdon9fffe322019-04-13 23:50:49 +0200110
Tom Rini2d8200c2019-04-27 11:34:55 -0400111 return res;
Marek Behún4eff4262017-09-03 17:00:26 +0200112}
113
114static inline u32 btrfs_path_item_size(struct btrfs_path *p)
115{
116 return p->nodes[0]->leaf.items[p->slots[0]].size;
117}
118
119static inline void *btrfs_leaf_data(struct btrfs_leaf *leaf, u32 slot)
120{
121 return ((u8 *) leaf) + sizeof(struct btrfs_header)
122 + leaf->items[slot].offset;
123}
124
125static inline void *btrfs_path_leaf_data(struct btrfs_path *p)
126{
127 return btrfs_leaf_data(&p->nodes[0]->leaf, p->slots[0]);
128}
129
130#define btrfs_item_ptr(l,s,t) \
131 ((t *) btrfs_leaf_data((l),(s)))
132
133#define btrfs_path_item_ptr(p,t) \
134 ((t *) btrfs_path_leaf_data((p)))
135
Qu Wenruo1a618082020-06-24 18:02:49 +0200136u16 btrfs_super_csum_size(const struct btrfs_super_block *s);
137const char *btrfs_super_csum_name(u16 csum_type);
138u16 btrfs_csum_type_size(u16 csum_type);
139size_t btrfs_super_num_csums(void);
140
141/* struct btrfs_super_block */
142
143BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
144BTRFS_SETGET_STACK_FUNCS(super_flags, struct btrfs_super_block, flags, 64);
145BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
146 generation, 64);
147BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
148BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
149 struct btrfs_super_block, sys_chunk_array_size, 32);
150BTRFS_SETGET_STACK_FUNCS(super_chunk_root_generation,
151 struct btrfs_super_block, chunk_root_generation, 64);
152BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
153 root_level, 8);
154BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
155 chunk_root, 64);
156BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
157 chunk_root_level, 8);
158BTRFS_SETGET_STACK_FUNCS(super_log_root, struct btrfs_super_block,
159 log_root, 64);
160BTRFS_SETGET_STACK_FUNCS(super_log_root_transid, struct btrfs_super_block,
161 log_root_transid, 64);
162BTRFS_SETGET_STACK_FUNCS(super_log_root_level, struct btrfs_super_block,
163 log_root_level, 8);
164BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
165 total_bytes, 64);
166BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
167 bytes_used, 64);
168BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
169 sectorsize, 32);
170BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
171 nodesize, 32);
172BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
173 stripesize, 32);
174BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
175 root_dir_objectid, 64);
176BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block,
177 num_devices, 64);
178BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block,
179 compat_flags, 64);
180BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block,
181 compat_ro_flags, 64);
182BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block,
183 incompat_flags, 64);
184BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block,
185 csum_type, 16);
186BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
187 cache_generation, 64);
188BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
189 uuid_tree_generation, 64);
190BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
191
Marek Behún4eff4262017-09-03 17:00:26 +0200192#endif /* __BTRFS_CTREE_H__ */