Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128247
b: refs/heads/master
c: fec577f
h: refs/heads/master
i:
  128245: efbf2c6
  128243: 4b8400f
  128239: e9a39c5
v: v3
  • Loading branch information
Chris Mason authored and David Woodhouse committed Feb 26, 2007
1 parent 0dda7ab commit d2f725c
Show file tree
Hide file tree
Showing 7 changed files with 681 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 97571fd0c939be8ae9cb57a8c57430a244ce13ae
refs/heads/master: fec577fb7f516e0d12ff821b1af272fd754e120a
10 changes: 8 additions & 2 deletions trunk/fs/btrfs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ objects = ctree.o disk-io.o radix-tree.o mkfs.o extent-tree.o print-tree.o
#.c.o:
# $(CC) $(CFLAGS) -c $<

ctree : $(objects)
gcc $(CFLAGS) -o ctree $(objects)
all: tester debug-tree

debug-tree: $(objects) debug-tree.o
gcc $(CFLAGS) -o debug-tree $(objects) debug-tree.o

tester: $(objects) random-test.o
gcc $(CFLAGS) -o tester $(objects) random-test.o

$(objects) : $(headers)

clean :
rm ctree *.o


6 changes: 4 additions & 2 deletions trunk/fs/btrfs/ctree.c
Original file line number Diff line number Diff line change
Expand Up @@ -1047,14 +1047,14 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path)
return 0;
}

/* some sample code to insert,search & delete items */
#if 0
/* for testing only */
int next_key(int i, int max_key) {
return rand() % max_key;
//return i;
}

int main() {
struct ctree_root *root;
struct key ins;
struct key last = { (u64)-1, 0, 0};
char *buf;
Expand All @@ -1066,6 +1066,7 @@ int main() {
int tree_size = 0;
struct ctree_path path;
struct ctree_super_block super;
struct ctree_root *root;

radix_tree_init();

Expand Down Expand Up @@ -1207,3 +1208,4 @@ int main() {
close_ctree(root);
return 0;
}
#endif
62 changes: 58 additions & 4 deletions trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,36 @@
#ifndef __CTREE__
#define __CTREE__

#define CTREE_BLOCKSIZE 4096
#define CTREE_BLOCKSIZE 1024

/*
* 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.
*/
struct key {
u64 objectid;
u32 flags;
u64 offset;
} __attribute__ ((__packed__));

/*
* every tree block (leaf or node) starts with this header.
*/
struct header {
u64 fsid[2]; /* FS specific uuid */
u64 blocknr;
u64 parentid;
u64 blocknr; /* which block this node is supposed to live in */
u64 parentid; /* objectid of the tree root */
u32 csum;
u32 ham;
u16 nritems;
u16 flags;
/* generation flags to be added */
} __attribute__ ((__packed__));

#define NODEPTRS_PER_BLOCK ((CTREE_BLOCKSIZE - sizeof(struct header)) / \
Expand All @@ -28,6 +42,11 @@ struct header {

struct tree_buffer;

/*
* 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.
*/
struct ctree_root {
struct tree_buffer *node;
struct ctree_root *extent_root;
Expand All @@ -36,27 +55,46 @@ struct ctree_root {
struct radix_tree_root cache_radix;
};

/*
* describes a tree on disk
*/
struct ctree_root_info {
u64 fsid[2]; /* FS specific uuid */
u64 blocknr; /* blocknr of this block */
u64 objectid; /* inode number of this root */
u64 tree_root; /* the tree root */
u64 tree_root; /* the tree root block */
u32 csum;
u32 ham;
u64 snapuuid[2]; /* root specific uuid */
} __attribute__ ((__packed__));

/*
* the super block basically lists the main trees of the FS
* it currently lacks any block count etc etc
*/
struct ctree_super_block {
struct ctree_root_info root_info;
struct ctree_root_info extent_info;
} __attribute__ ((__packed__));

/*
* 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)
*/
struct item {
struct key key;
u16 offset;
u16 size;
} __attribute__ ((__packed__));

/*
* 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.
*/
#define LEAF_DATA_SIZE (CTREE_BLOCKSIZE - sizeof(struct header))
struct leaf {
struct header header;
Expand All @@ -66,17 +104,33 @@ struct leaf {
};
} __attribute__ ((__packed__));

/*
* all non-leaf blocks are nodes, they hold only keys and pointers to
* other blocks
*/
struct node {
struct header header;
struct key keys[NODEPTRS_PER_BLOCK];
u64 blockptrs[NODEPTRS_PER_BLOCK];
} __attribute__ ((__packed__));

/*
* items in the extent btree are used to record the objectid of the
* owner of the block and the number of references
*/
struct extent_item {
u32 refs;
u64 owner;
} __attribute__ ((__packed__));

/*
* ctree_paths remember the path taken from the root down to the leaf.
* level 0 is always the leaf, and nodes[1...MAX_LEVEL] will point
* to any other levels that are present.
*
* The slots array records the index of the item or block pointer
* used while walking the tree.
*/
struct ctree_path {
struct tree_buffer *nodes[MAX_LEVEL];
int slots[MAX_LEVEL];
Expand Down
19 changes: 19 additions & 0 deletions trunk/fs/btrfs/debug-tree.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <stdio.h>
#include <stdlib.h>
#include "kerncompat.h"
#include "radix-tree.h"
#include "ctree.h"
#include "disk-io.h"
#include "print-tree.h"

int main() {
struct ctree_super_block super;
struct ctree_root *root;
radix_tree_init();
root = open_ctree("dbfile", &super);
printf("root tree\n");
print_tree(root, root->node);
printf("map tree\n");
print_tree(root->extent_root, root->extent_root->node);
return 0;
}
Loading

0 comments on commit d2f725c

Please sign in to comment.