ctree.h 11.0 KB
Newer Older
C
Chris Mason 已提交
1 2
#ifndef __BTRFS__
#define __BTRFS__
3

4
#include "list.h"
C
Chris Mason 已提交
5
#include "kerncompat.h"
6

7
#define BTRFS_MAGIC "_BtRfS_M"
C
Chris Mason 已提交
8
#define BTRFS_BLOCKSIZE 1024
9

10 11 12 13
#define BTRFS_ROOT_TREE_OBJECTID 1
#define BTRFS_EXTENT_TREE_OBJECTID 2
#define BTRFS_FS_TREE_OBJECTID 3

14 15 16 17 18 19 20 21 22
/*
 * the key defines the order in the tree, and so it also defines (optimal)
 * block layout.  objectid corresonds to the inode number.  The flags
 * tells us things about the object, and is a kind of stream selector.
 * so for a given inode, keys with flags of 1 might refer to the inode
 * data, flags of 2 may point to file data in the btree and flags == 3
 * may point to extents.
 *
 * offset is the starting byte offset for this key in the stream.
C
Chris Mason 已提交
23 24 25 26
 *
 * btrfs_disk_key is in disk byte order.  struct btrfs_key is always
 * in cpu native order.  Otherwise they are identical and their sizes
 * should be the same (ie both packed)
27
 */
C
Chris Mason 已提交
28 29 30 31 32 33 34
struct btrfs_disk_key {
	__le64 objectid;
	__le32 flags;
	__le64 offset;
} __attribute__ ((__packed__));

struct btrfs_key {
35 36 37 38 39
	u64 objectid;
	u32 flags;
	u64 offset;
} __attribute__ ((__packed__));

40 41 42
/*
 * every tree block (leaf or node) starts with this header.
 */
43
struct btrfs_header {
44
	u8 fsid[16]; /* FS specific uuid */
45 46 47 48 49 50
	__le64 blocknr; /* which block this node is supposed to live in */
	__le64 parentid; /* objectid of the tree root */
	__le32 csum;
	__le32 ham;
	__le16 nritems;
	__le16 flags;
51
	/* generation flags to be added */
52 53
} __attribute__ ((__packed__));

C
Chris Mason 已提交
54 55
#define BTRFS_MAX_LEVEL 8
#define NODEPTRS_PER_BLOCK ((BTRFS_BLOCKSIZE - sizeof(struct btrfs_header)) / \
C
Chris Mason 已提交
56
			    (sizeof(struct btrfs_disk_key) + sizeof(u64)))
57

C
Chris Mason 已提交
58
struct btrfs_buffer;
59

60 61 62 63 64 65 66 67
struct btrfs_root_item {
	__le64 blocknr;
	__le32 flags;
	__le64 block_limit;
	__le64 blocks_used;
	__le32 refs;
};

68 69 70 71 72
/*
 * in ram representation of the tree.  extent_root is used for all allocations
 * and for the extent tree extent_root root.  current_insert is used
 * only for the extent tree.
 */
C
Chris Mason 已提交
73 74 75 76
struct btrfs_root {
	struct btrfs_buffer *node;
	struct btrfs_buffer *commit_root;
	struct btrfs_root *extent_root;
77
	struct btrfs_root *tree_root;
C
Chris Mason 已提交
78 79
	struct btrfs_key current_insert;
	struct btrfs_key last_insert;
80 81
	int fp;
	struct radix_tree_root cache_radix;
82
	struct radix_tree_root pinned_radix;
83 84 85
	struct list_head trans;
	struct list_head cache;
	int cache_size;
86 87 88
	int ref_cows;
	struct btrfs_root_item root_item;
	struct btrfs_key root_key;
89 90
};

91 92 93 94
/*
 * the super block basically lists the main trees of the FS
 * it currently lacks any block count etc etc
 */
C
Chris Mason 已提交
95
struct btrfs_super_block {
96 97 98 99 100 101 102 103 104
	u8 fsid[16];    /* FS specific uuid */
	__le64 blocknr; /* this block number */
	__le32 csum;
	__le64 magic;
	__le16 blocksize;
	__le64 generation;
	__le64 root;
	__le64 total_blocks;
	__le64 blocks_used;
C
Chris Mason 已提交
105 106
} __attribute__ ((__packed__));

107 108 109 110 111
/*
 * A leaf is full of items.  The exact type of item is defined by
 * the key flags parameter.  offset and size tell us where to find
 * the item in the leaf (relative to the start of the data area)
 */
C
Chris Mason 已提交
112
struct btrfs_item {
C
Chris Mason 已提交
113
	struct btrfs_disk_key key;
C
Chris Mason 已提交
114 115
	__le16 offset;
	__le16 size;
116 117
} __attribute__ ((__packed__));

118 119 120 121 122 123 124
/*
 * leaves have an item area and a data area:
 * [item0, item1....itemN] [free space] [dataN...data1, data0]
 *
 * The data is separate from the items to get the keys closer together
 * during searches.
 */
C
Chris Mason 已提交
125 126
#define LEAF_DATA_SIZE (BTRFS_BLOCKSIZE - sizeof(struct btrfs_header))
struct btrfs_leaf {
127
	struct btrfs_header header;
128
	union {
C
Chris Mason 已提交
129 130
		struct btrfs_item items[LEAF_DATA_SIZE/
				        sizeof(struct btrfs_item)];
C
Chris Mason 已提交
131
		u8 data[BTRFS_BLOCKSIZE - sizeof(struct btrfs_header)];
132 133 134
	};
} __attribute__ ((__packed__));

135 136 137 138
/*
 * all non-leaf blocks are nodes, they hold only keys and pointers to
 * other blocks
 */
C
Chris Mason 已提交
139
struct btrfs_node {
140
	struct btrfs_header header;
C
Chris Mason 已提交
141
	struct btrfs_disk_key keys[NODEPTRS_PER_BLOCK];
142
	__le64 blockptrs[NODEPTRS_PER_BLOCK];
143 144
} __attribute__ ((__packed__));

145 146 147 148
/*
 * items in the extent btree are used to record the objectid of the
 * owner of the block and the number of references
 */
C
Chris Mason 已提交
149
struct btrfs_extent_item {
C
Chris Mason 已提交
150 151
	__le32 refs;
	__le64 owner;
152 153
} __attribute__ ((__packed__));

154
/*
C
Chris Mason 已提交
155 156
 * btrfs_paths remember the path taken from the root down to the leaf.
 * level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point
157 158 159 160 161
 * to any other levels that are present.
 *
 * The slots array records the index of the item or block pointer
 * used while walking the tree.
 */
C
Chris Mason 已提交
162 163 164
struct btrfs_path {
	struct btrfs_buffer *nodes[BTRFS_MAX_LEVEL];
	int slots[BTRFS_MAX_LEVEL];
165
};
C
Chris Mason 已提交
166

C
Chris Mason 已提交
167
static inline u64 btrfs_extent_owner(struct btrfs_extent_item *ei)
C
Chris Mason 已提交
168 169 170 171
{
	return le64_to_cpu(ei->owner);
}

C
Chris Mason 已提交
172
static inline void btrfs_set_extent_owner(struct btrfs_extent_item *ei, u64 val)
C
Chris Mason 已提交
173 174 175 176
{
	ei->owner = cpu_to_le64(val);
}

C
Chris Mason 已提交
177
static inline u32 btrfs_extent_refs(struct btrfs_extent_item *ei)
C
Chris Mason 已提交
178 179 180 181
{
	return le32_to_cpu(ei->refs);
}

C
Chris Mason 已提交
182
static inline void btrfs_set_extent_refs(struct btrfs_extent_item *ei, u32 val)
C
Chris Mason 已提交
183 184 185 186
{
	ei->refs = cpu_to_le32(val);
}

C
Chris Mason 已提交
187
static inline u64 btrfs_node_blockptr(struct btrfs_node *n, int nr)
188 189 190 191
{
	return le64_to_cpu(n->blockptrs[nr]);
}

C
Chris Mason 已提交
192 193
static inline void btrfs_set_node_blockptr(struct btrfs_node *n, int nr,
					   u64 val)
194 195 196 197
{
	n->blockptrs[nr] = cpu_to_le64(val);
}

C
Chris Mason 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
static inline u16 btrfs_item_offset(struct btrfs_item *item)
{
	return le16_to_cpu(item->offset);
}

static inline void btrfs_set_item_offset(struct btrfs_item *item, u16 val)
{
	item->offset = cpu_to_le16(val);
}

static inline u16 btrfs_item_end(struct btrfs_item *item)
{
	return le16_to_cpu(item->offset) + le16_to_cpu(item->size);
}

static inline u16 btrfs_item_size(struct btrfs_item *item)
{
	return le16_to_cpu(item->size);
}

static inline void btrfs_set_item_size(struct btrfs_item *item, u16 val)
{
	item->size = cpu_to_le16(val);
}

C
Chris Mason 已提交
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
					 struct btrfs_disk_key *disk)
{
	cpu->offset = le64_to_cpu(disk->offset);
	cpu->flags = le32_to_cpu(disk->flags);
	cpu->objectid = le64_to_cpu(disk->objectid);
}

static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
					 struct btrfs_key *cpu)
{
	disk->offset = cpu_to_le64(cpu->offset);
	disk->flags = cpu_to_le32(cpu->flags);
	disk->objectid = cpu_to_le64(cpu->objectid);
}

static inline u64 btrfs_key_objectid(struct btrfs_disk_key *disk)
{
	return le64_to_cpu(disk->objectid);
}

static inline void btrfs_set_key_objectid(struct btrfs_disk_key *disk,
					  u64 val)
{
	disk->objectid = cpu_to_le64(val);
}

static inline u64 btrfs_key_offset(struct btrfs_disk_key *disk)
{
	return le64_to_cpu(disk->offset);
}

static inline void btrfs_set_key_offset(struct btrfs_disk_key *disk,
					  u64 val)
{
	disk->offset = cpu_to_le64(val);
}

static inline u32 btrfs_key_flags(struct btrfs_disk_key *disk)
{
	return le32_to_cpu(disk->flags);
}

static inline void btrfs_set_key_flags(struct btrfs_disk_key *disk,
					  u32 val)
{
	disk->flags = cpu_to_le32(val);
}

272
static inline u64 btrfs_header_blocknr(struct btrfs_header *h)
273
{
274
	return le64_to_cpu(h->blocknr);
275 276
}

277
static inline void btrfs_set_header_blocknr(struct btrfs_header *h, u64 blocknr)
278
{
279
	h->blocknr = cpu_to_le64(blocknr);
280 281
}

282
static inline u64 btrfs_header_parentid(struct btrfs_header *h)
283
{
284
	return le64_to_cpu(h->parentid);
285 286
}

287 288
static inline void btrfs_set_header_parentid(struct btrfs_header *h,
					     u64 parentid)
289
{
290
	h->parentid = cpu_to_le64(parentid);
291 292
}

293
static inline u16 btrfs_header_nritems(struct btrfs_header *h)
294
{
295
	return le16_to_cpu(h->nritems);
296 297
}

298
static inline void btrfs_set_header_nritems(struct btrfs_header *h, u16 val)
299
{
300
	h->nritems = cpu_to_le16(val);
301 302
}

303
static inline u16 btrfs_header_flags(struct btrfs_header *h)
304
{
305
	return le16_to_cpu(h->flags);
306 307
}

308
static inline void btrfs_set_header_flags(struct btrfs_header *h, u16 val)
309
{
310
	h->flags = cpu_to_le16(val);
311 312
}

313
static inline int btrfs_header_level(struct btrfs_header *h)
314
{
C
Chris Mason 已提交
315
	return btrfs_header_flags(h) & (BTRFS_MAX_LEVEL - 1);
316 317
}

318
static inline void btrfs_set_header_level(struct btrfs_header *h, int level)
319
{
320
	u16 flags;
C
Chris Mason 已提交
321 322
	BUG_ON(level > BTRFS_MAX_LEVEL);
	flags = btrfs_header_flags(h) & ~(BTRFS_MAX_LEVEL - 1);
323 324 325
	btrfs_set_header_flags(h, flags | level);
}

C
Chris Mason 已提交
326
static inline int btrfs_is_leaf(struct btrfs_node *n)
327 328 329 330
{
	return (btrfs_header_level(&n->header) == 0);
}

331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
static inline u64 btrfs_root_blocknr(struct btrfs_root_item *item)
{
	return le64_to_cpu(item->blocknr);
}

static inline void btrfs_set_root_blocknr(struct btrfs_root_item *item, u64 val)
{
	item->blocknr = cpu_to_le64(val);
}

static inline u32 btrfs_root_refs(struct btrfs_root_item *item)
{
	return le32_to_cpu(item->refs);
}

static inline void btrfs_set_root_refs(struct btrfs_root_item *item, u32 val)
{
	item->refs = cpu_to_le32(val);
}

static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s)
{
	return le64_to_cpu(s->blocknr);
}

static inline void btrfs_set_super_blocknr(struct btrfs_super_block *s, u64 val)
{
	s->blocknr = cpu_to_le64(val);
}

static inline u64 btrfs_super_root(struct btrfs_super_block *s)
{
	return le64_to_cpu(s->root);
}

static inline void btrfs_set_super_root(struct btrfs_super_block *s, u64 val)
{
	s->root = cpu_to_le64(val);
}

static inline u64 btrfs_super_total_blocks(struct btrfs_super_block *s)
{
	return le64_to_cpu(s->total_blocks);
}

static inline void btrfs_set_super_total_blocks(struct btrfs_super_block *s,
						u64 val)
{
	s->total_blocks = cpu_to_le64(val);
}

static inline u64 btrfs_super_blocks_used(struct btrfs_super_block *s)
{
	return le64_to_cpu(s->blocks_used);
}

static inline void btrfs_set_super_blocks_used(struct btrfs_super_block *s,
						u64 val)
{
	s->blocks_used = cpu_to_le64(val);
}

static inline u16 btrfs_super_blocksize(struct btrfs_super_block *s)
{
	return le16_to_cpu(s->blocksize);
}

static inline void btrfs_set_super_blocksize(struct btrfs_super_block *s,
						u16 val)
{
	s->blocksize = cpu_to_le16(val);
}

404 405 406 407
/* helper function to cast into the data area of the leaf. */
#define btrfs_item_ptr(leaf, slot, type) \
	((type *)((leaf)->data + btrfs_item_offset((leaf)->items + (slot))))

C
Chris Mason 已提交
408 409 410 411 412 413 414 415 416
struct btrfs_buffer *btrfs_alloc_free_block(struct btrfs_root *root);
int btrfs_inc_ref(struct btrfs_root *root, struct btrfs_buffer *buf);
int btrfs_free_extent(struct btrfs_root *root, u64 blocknr, u64 num_blocks);
int btrfs_search_slot(struct btrfs_root *root, struct btrfs_key *key,
		struct btrfs_path *p, int ins_len, int cow);
void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p);
void btrfs_init_path(struct btrfs_path *p);
int btrfs_del_item(struct btrfs_root *root, struct btrfs_path *path);
int btrfs_insert_item(struct btrfs_root *root, struct btrfs_key *key,
C
Chris Mason 已提交
417
		void *data, int data_size);
C
Chris Mason 已提交
418 419 420 421
int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);
int btrfs_leaf_free_space(struct btrfs_leaf *leaf);
int btrfs_drop_snapshot(struct btrfs_root *root, struct btrfs_buffer *snap);
int btrfs_finish_extent_commit(struct btrfs_root *root);
422 423 424 425 426 427 428
int btrfs_del_root(struct btrfs_root *root, struct btrfs_key *key);
int btrfs_insert_root(struct btrfs_root *root, struct btrfs_key *key,
		      struct btrfs_root_item *item);
int btrfs_update_root(struct btrfs_root *root, struct btrfs_key *key,
		      struct btrfs_root_item *item);
int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
			struct btrfs_root_item *item, struct btrfs_key *key);
429
#endif