diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-03-13 16:47:54 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2007-03-13 16:47:54 -0400 |
commit | 3768f3689fc76ecea17414936dff7a02746a4355 (patch) | |
tree | 0494b12e3ba0be0a25f122922e205bc91d88957b /fs/btrfs/ctree.h | |
parent | eaee50e881b88766d9a781c54c4142456cf5e527 (diff) |
Btrfs: Change the super to point to a tree of trees to enable persistent snapshots
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.h')
-rw-r--r-- | fs/btrfs/ctree.h | 123 |
1 files changed, 107 insertions, 16 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 5dfcc90812c..0968899fb7f 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -4,8 +4,13 @@ | |||
4 | #include "list.h" | 4 | #include "list.h" |
5 | #include "kerncompat.h" | 5 | #include "kerncompat.h" |
6 | 6 | ||
7 | #define BTRFS_MAGIC "_BtRfS_M" | ||
7 | #define BTRFS_BLOCKSIZE 1024 | 8 | #define BTRFS_BLOCKSIZE 1024 |
8 | 9 | ||
10 | #define BTRFS_ROOT_TREE_OBJECTID 1 | ||
11 | #define BTRFS_EXTENT_TREE_OBJECTID 2 | ||
12 | #define BTRFS_FS_TREE_OBJECTID 3 | ||
13 | |||
9 | /* | 14 | /* |
10 | * the key defines the order in the tree, and so it also defines (optimal) | 15 | * the key defines the order in the tree, and so it also defines (optimal) |
11 | * block layout. objectid corresonds to the inode number. The flags | 16 | * block layout. objectid corresonds to the inode number. The flags |
@@ -36,7 +41,7 @@ struct btrfs_key { | |||
36 | * every tree block (leaf or node) starts with this header. | 41 | * every tree block (leaf or node) starts with this header. |
37 | */ | 42 | */ |
38 | struct btrfs_header { | 43 | struct btrfs_header { |
39 | __le64 fsid[2]; /* FS specific uuid */ | 44 | u8 fsid[16]; /* FS specific uuid */ |
40 | __le64 blocknr; /* which block this node is supposed to live in */ | 45 | __le64 blocknr; /* which block this node is supposed to live in */ |
41 | __le64 parentid; /* objectid of the tree root */ | 46 | __le64 parentid; /* objectid of the tree root */ |
42 | __le32 csum; | 47 | __le32 csum; |
@@ -52,6 +57,14 @@ struct btrfs_header { | |||
52 | 57 | ||
53 | struct btrfs_buffer; | 58 | struct btrfs_buffer; |
54 | 59 | ||
60 | struct btrfs_root_item { | ||
61 | __le64 blocknr; | ||
62 | __le32 flags; | ||
63 | __le64 block_limit; | ||
64 | __le64 blocks_used; | ||
65 | __le32 refs; | ||
66 | }; | ||
67 | |||
55 | /* | 68 | /* |
56 | * in ram representation of the tree. extent_root is used for all allocations | 69 | * in ram representation of the tree. extent_root is used for all allocations |
57 | * and for the extent tree extent_root root. current_insert is used | 70 | * and for the extent tree extent_root root. current_insert is used |
@@ -61,6 +74,7 @@ struct btrfs_root { | |||
61 | struct btrfs_buffer *node; | 74 | struct btrfs_buffer *node; |
62 | struct btrfs_buffer *commit_root; | 75 | struct btrfs_buffer *commit_root; |
63 | struct btrfs_root *extent_root; | 76 | struct btrfs_root *extent_root; |
77 | struct btrfs_root *tree_root; | ||
64 | struct btrfs_key current_insert; | 78 | struct btrfs_key current_insert; |
65 | struct btrfs_key last_insert; | 79 | struct btrfs_key last_insert; |
66 | int fp; | 80 | int fp; |
@@ -69,28 +83,25 @@ struct btrfs_root { | |||
69 | struct list_head trans; | 83 | struct list_head trans; |
70 | struct list_head cache; | 84 | struct list_head cache; |
71 | int cache_size; | 85 | int cache_size; |
86 | int ref_cows; | ||
87 | struct btrfs_root_item root_item; | ||
88 | struct btrfs_key root_key; | ||
72 | }; | 89 | }; |
73 | 90 | ||
74 | /* | 91 | /* |
75 | * describes a tree on disk | ||
76 | */ | ||
77 | struct btrfs_root_info { | ||
78 | u64 fsid[2]; /* FS specific uuid */ | ||
79 | u64 blocknr; /* blocknr of this block */ | ||
80 | u64 objectid; /* inode number of this root */ | ||
81 | u64 tree_root; /* the tree root block */ | ||
82 | u32 csum; | ||
83 | u32 ham; | ||
84 | u64 snapuuid[2]; /* root specific uuid */ | ||
85 | } __attribute__ ((__packed__)); | ||
86 | |||
87 | /* | ||
88 | * the super block basically lists the main trees of the FS | 92 | * the super block basically lists the main trees of the FS |
89 | * it currently lacks any block count etc etc | 93 | * it currently lacks any block count etc etc |
90 | */ | 94 | */ |
91 | struct btrfs_super_block { | 95 | struct btrfs_super_block { |
92 | struct btrfs_root_info root_info; | 96 | u8 fsid[16]; /* FS specific uuid */ |
93 | struct btrfs_root_info extent_info; | 97 | __le64 blocknr; /* this block number */ |
98 | __le32 csum; | ||
99 | __le64 magic; | ||
100 | __le16 blocksize; | ||
101 | __le64 generation; | ||
102 | __le64 root; | ||
103 | __le64 total_blocks; | ||
104 | __le64 blocks_used; | ||
94 | } __attribute__ ((__packed__)); | 105 | } __attribute__ ((__packed__)); |
95 | 106 | ||
96 | /* | 107 | /* |
@@ -317,6 +328,79 @@ static inline int btrfs_is_leaf(struct btrfs_node *n) | |||
317 | return (btrfs_header_level(&n->header) == 0); | 328 | return (btrfs_header_level(&n->header) == 0); |
318 | } | 329 | } |
319 | 330 | ||
331 | static inline u64 btrfs_root_blocknr(struct btrfs_root_item *item) | ||
332 | { | ||
333 | return le64_to_cpu(item->blocknr); | ||
334 | } | ||
335 | |||
336 | static inline void btrfs_set_root_blocknr(struct btrfs_root_item *item, u64 val) | ||
337 | { | ||
338 | item->blocknr = cpu_to_le64(val); | ||
339 | } | ||
340 | |||
341 | static inline u32 btrfs_root_refs(struct btrfs_root_item *item) | ||
342 | { | ||
343 | return le32_to_cpu(item->refs); | ||
344 | } | ||
345 | |||
346 | static inline void btrfs_set_root_refs(struct btrfs_root_item *item, u32 val) | ||
347 | { | ||
348 | item->refs = cpu_to_le32(val); | ||
349 | } | ||
350 | |||
351 | static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s) | ||
352 | { | ||
353 | return le64_to_cpu(s->blocknr); | ||
354 | } | ||
355 | |||
356 | static inline void btrfs_set_super_blocknr(struct btrfs_super_block *s, u64 val) | ||
357 | { | ||
358 | s->blocknr = cpu_to_le64(val); | ||
359 | } | ||
360 | |||
361 | static inline u64 btrfs_super_root(struct btrfs_super_block *s) | ||
362 | { | ||
363 | return le64_to_cpu(s->root); | ||
364 | } | ||
365 | |||
366 | static inline void btrfs_set_super_root(struct btrfs_super_block *s, u64 val) | ||
367 | { | ||
368 | s->root = cpu_to_le64(val); | ||
369 | } | ||
370 | |||
371 | static inline u64 btrfs_super_total_blocks(struct btrfs_super_block *s) | ||
372 | { | ||
373 | return le64_to_cpu(s->total_blocks); | ||
374 | } | ||
375 | |||
376 | static inline void btrfs_set_super_total_blocks(struct btrfs_super_block *s, | ||
377 | u64 val) | ||
378 | { | ||
379 | s->total_blocks = cpu_to_le64(val); | ||
380 | } | ||
381 | |||
382 | static inline u64 btrfs_super_blocks_used(struct btrfs_super_block *s) | ||
383 | { | ||
384 | return le64_to_cpu(s->blocks_used); | ||
385 | } | ||
386 | |||
387 | static inline void btrfs_set_super_blocks_used(struct btrfs_super_block *s, | ||
388 | u64 val) | ||
389 | { | ||
390 | s->blocks_used = cpu_to_le64(val); | ||
391 | } | ||
392 | |||
393 | static inline u16 btrfs_super_blocksize(struct btrfs_super_block *s) | ||
394 | { | ||
395 | return le16_to_cpu(s->blocksize); | ||
396 | } | ||
397 | |||
398 | static inline void btrfs_set_super_blocksize(struct btrfs_super_block *s, | ||
399 | u16 val) | ||
400 | { | ||
401 | s->blocksize = cpu_to_le16(val); | ||
402 | } | ||
403 | |||
320 | struct btrfs_buffer *btrfs_alloc_free_block(struct btrfs_root *root); | 404 | struct btrfs_buffer *btrfs_alloc_free_block(struct btrfs_root *root); |
321 | int btrfs_inc_ref(struct btrfs_root *root, struct btrfs_buffer *buf); | 405 | int btrfs_inc_ref(struct btrfs_root *root, struct btrfs_buffer *buf); |
322 | int btrfs_free_extent(struct btrfs_root *root, u64 blocknr, u64 num_blocks); | 406 | int btrfs_free_extent(struct btrfs_root *root, u64 blocknr, u64 num_blocks); |
@@ -331,4 +415,11 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path); | |||
331 | int btrfs_leaf_free_space(struct btrfs_leaf *leaf); | 415 | int btrfs_leaf_free_space(struct btrfs_leaf *leaf); |
332 | int btrfs_drop_snapshot(struct btrfs_root *root, struct btrfs_buffer *snap); | 416 | int btrfs_drop_snapshot(struct btrfs_root *root, struct btrfs_buffer *snap); |
333 | int btrfs_finish_extent_commit(struct btrfs_root *root); | 417 | int btrfs_finish_extent_commit(struct btrfs_root *root); |
418 | int btrfs_del_root(struct btrfs_root *root, struct btrfs_key *key); | ||
419 | int btrfs_insert_root(struct btrfs_root *root, struct btrfs_key *key, | ||
420 | struct btrfs_root_item *item); | ||
421 | int btrfs_update_root(struct btrfs_root *root, struct btrfs_key *key, | ||
422 | struct btrfs_root_item *item); | ||
423 | int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, | ||
424 | struct btrfs_root_item *item, struct btrfs_key *key); | ||
334 | #endif | 425 | #endif |