aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.h
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-03-15 12:56:47 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2007-03-15 12:56:47 -0400
commit62e2749e03a855d98855f9ce032dbe72d5fad148 (patch)
treeed12521d1bde4ac7eda7f917b57b3cab1e76539d /fs/btrfs/ctree.h
parenta1516c8921ce2c148b69493e858d95bc79c92f01 (diff)
Btrfs: Use a chunk of the key flags to record the item type.
Add (untested and simple) directory item code Fix comp_keys to use the new key ordering Add btrfs_insert_empty_item Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.h')
-rw-r--r--fs/btrfs/ctree.h182
1 files changed, 127 insertions, 55 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 73ebc824924a..e8a26fd8ea9f 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -58,39 +58,6 @@ struct btrfs_header {
58#define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->blocksize)) 58#define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->blocksize))
59 59
60struct btrfs_buffer; 60struct btrfs_buffer;
61
62struct btrfs_root_item {
63 __le64 blocknr;
64 __le32 flags;
65 __le64 block_limit;
66 __le64 blocks_used;
67 __le32 refs;
68};
69
70/*
71 * in ram representation of the tree. extent_root is used for all allocations
72 * and for the extent tree extent_root root. current_insert is used
73 * only for the extent tree.
74 */
75struct btrfs_root {
76 struct btrfs_buffer *node;
77 struct btrfs_buffer *commit_root;
78 struct btrfs_root *extent_root;
79 struct btrfs_root *tree_root;
80 struct btrfs_key current_insert;
81 struct btrfs_key last_insert;
82 int fp;
83 struct radix_tree_root cache_radix;
84 struct radix_tree_root pinned_radix;
85 struct list_head trans;
86 struct list_head cache;
87 int cache_size;
88 int ref_cows;
89 struct btrfs_root_item root_item;
90 struct btrfs_key root_key;
91 u32 blocksize;
92};
93
94/* 61/*
95 * the super block basically lists the main trees of the FS 62 * the super block basically lists the main trees of the FS
96 * it currently lacks any block count etc etc 63 * it currently lacks any block count etc etc
@@ -108,8 +75,7 @@ struct btrfs_super_block {
108} __attribute__ ((__packed__)); 75} __attribute__ ((__packed__));
109 76
110/* 77/*
111 * A leaf is full of items. The exact type of item is defined by 78 * A leaf is full of items. offset and size tell us where to find
112 * the key flags parameter. offset and size tell us where to find
113 * the item in the leaf (relative to the start of the data area) 79 * the item in the leaf (relative to the start of the data area)
114 */ 80 */
115struct btrfs_item { 81struct btrfs_item {
@@ -145,15 +111,6 @@ struct btrfs_node {
145} __attribute__ ((__packed__)); 111} __attribute__ ((__packed__));
146 112
147/* 113/*
148 * items in the extent btree are used to record the objectid of the
149 * owner of the block and the number of references
150 */
151struct btrfs_extent_item {
152 __le32 refs;
153 __le64 owner;
154} __attribute__ ((__packed__));
155
156/*
157 * btrfs_paths remember the path taken from the root down to the leaf. 114 * btrfs_paths remember the path taken from the root down to the leaf.
158 * level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point 115 * level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point
159 * to any other levels that are present. 116 * to any other levels that are present.
@@ -166,6 +123,94 @@ struct btrfs_path {
166 int slots[BTRFS_MAX_LEVEL]; 123 int slots[BTRFS_MAX_LEVEL];
167}; 124};
168 125
126/*
127 * items in the extent btree are used to record the objectid of the
128 * owner of the block and the number of references
129 */
130struct btrfs_extent_item {
131 __le32 refs;
132 __le64 owner;
133} __attribute__ ((__packed__));
134
135struct btrfs_dir_item {
136 __le64 objectid;
137 __le16 flags;
138 u8 type;
139} __attribute__ ((__packed__));
140
141struct btrfs_root_item {
142 __le64 blocknr;
143 __le32 flags;
144 __le64 block_limit;
145 __le64 blocks_used;
146 __le32 refs;
147};
148
149/*
150 * in ram representation of the tree. extent_root is used for all allocations
151 * and for the extent tree extent_root root. current_insert is used
152 * only for the extent tree.
153 */
154struct btrfs_root {
155 struct btrfs_buffer *node;
156 struct btrfs_buffer *commit_root;
157 struct btrfs_root *extent_root;
158 struct btrfs_root *tree_root;
159 struct btrfs_key current_insert;
160 struct btrfs_key last_insert;
161 int fp;
162 struct radix_tree_root cache_radix;
163 struct radix_tree_root pinned_radix;
164 struct list_head trans;
165 struct list_head cache;
166 int cache_size;
167 int ref_cows;
168 struct btrfs_root_item root_item;
169 struct btrfs_key root_key;
170 u32 blocksize;
171};
172
173
174/* the lower bits in the key flags defines the item type */
175#define BTRFS_KEY_TYPE_MAX 256
176#define BTRFS_KEY_TYPE_MASK (BTRFS_KEY_TYPE_MAX - 1)
177#define BTRFS_INODE_ITEM_KEY 1
178#define BTRFS_DIR_ITEM_KEY 2
179#define BTRFS_ROOT_ITEM_KEY 3
180#define BTRFS_EXTENT_ITEM_KEY 4
181#define BTRFS_STRING_ITEM_KEY 5
182
183static inline u64 btrfs_dir_objectid(struct btrfs_dir_item *d)
184{
185 return le64_to_cpu(d->objectid);
186}
187
188static inline void btrfs_set_dir_objectid(struct btrfs_dir_item *d, u64 val)
189{
190 d->objectid = cpu_to_le64(val);
191}
192
193static inline u16 btrfs_dir_flags(struct btrfs_dir_item *d)
194{
195 return le16_to_cpu(d->flags);
196}
197
198static inline void btrfs_set_dir_flags(struct btrfs_dir_item *d, u16 val)
199{
200 d->flags = cpu_to_le16(val);
201}
202
203static inline u8 btrfs_dir_type(struct btrfs_dir_item *d)
204{
205 return d->type;
206}
207
208static inline void btrfs_set_dir_type(struct btrfs_dir_item *d, u8 val)
209{
210 d->type = val;
211}
212
213
169static inline u64 btrfs_extent_owner(struct btrfs_extent_item *ei) 214static inline u64 btrfs_extent_owner(struct btrfs_extent_item *ei)
170{ 215{
171 return le64_to_cpu(ei->owner); 216 return le64_to_cpu(ei->owner);
@@ -238,39 +283,65 @@ static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
238 disk->objectid = cpu_to_le64(cpu->objectid); 283 disk->objectid = cpu_to_le64(cpu->objectid);
239} 284}
240 285
241static inline u64 btrfs_key_objectid(struct btrfs_disk_key *disk) 286static inline u64 btrfs_disk_key_objectid(struct btrfs_disk_key *disk)
242{ 287{
243 return le64_to_cpu(disk->objectid); 288 return le64_to_cpu(disk->objectid);
244} 289}
245 290
246static inline void btrfs_set_key_objectid(struct btrfs_disk_key *disk, 291static inline void btrfs_set_disk_key_objectid(struct btrfs_disk_key *disk,
247 u64 val) 292 u64 val)
248{ 293{
249 disk->objectid = cpu_to_le64(val); 294 disk->objectid = cpu_to_le64(val);
250} 295}
251 296
252static inline u64 btrfs_key_offset(struct btrfs_disk_key *disk) 297static inline u64 btrfs_disk_key_offset(struct btrfs_disk_key *disk)
253{ 298{
254 return le64_to_cpu(disk->offset); 299 return le64_to_cpu(disk->offset);
255} 300}
256 301
257static inline void btrfs_set_key_offset(struct btrfs_disk_key *disk, 302static inline void btrfs_set_disk_key_offset(struct btrfs_disk_key *disk,
258 u64 val) 303 u64 val)
259{ 304{
260 disk->offset = cpu_to_le64(val); 305 disk->offset = cpu_to_le64(val);
261} 306}
262 307
263static inline u32 btrfs_key_flags(struct btrfs_disk_key *disk) 308static inline u32 btrfs_disk_key_flags(struct btrfs_disk_key *disk)
264{ 309{
265 return le32_to_cpu(disk->flags); 310 return le32_to_cpu(disk->flags);
266} 311}
267 312
268static inline void btrfs_set_key_flags(struct btrfs_disk_key *disk, 313static inline void btrfs_set_disk_key_flags(struct btrfs_disk_key *disk,
269 u32 val) 314 u32 val)
270{ 315{
271 disk->flags = cpu_to_le32(val); 316 disk->flags = cpu_to_le32(val);
272} 317}
273 318
319static inline u32 btrfs_key_type(struct btrfs_key *key)
320{
321 return key->flags & BTRFS_KEY_TYPE_MASK;
322}
323
324static inline u32 btrfs_disk_key_type(struct btrfs_disk_key *key)
325{
326 return le32_to_cpu(key->flags) & BTRFS_KEY_TYPE_MASK;
327}
328
329static inline void btrfs_set_key_type(struct btrfs_key *key, u32 type)
330{
331 BUG_ON(type >= BTRFS_KEY_TYPE_MAX);
332 key->flags = (key->flags & ~((u64)BTRFS_KEY_TYPE_MASK)) | type;
333}
334
335static inline void btrfs_set_disk_key_type(struct btrfs_disk_key *key, u32 type)
336{
337 u32 flags = btrfs_disk_key_flags(key);
338 BUG_ON(type >= BTRFS_KEY_TYPE_MAX);
339 flags = (flags & ~((u64)BTRFS_KEY_TYPE_MASK)) | type;
340 btrfs_set_disk_key_flags(key, flags);
341}
342
343
344
274static inline u64 btrfs_header_blocknr(struct btrfs_header *h) 345static inline u64 btrfs_header_blocknr(struct btrfs_header *h)
275{ 346{
276 return le64_to_cpu(h->blocknr); 347 return le64_to_cpu(h->blocknr);
@@ -407,7 +478,6 @@ static inline u8 *btrfs_leaf_data(struct btrfs_leaf *l)
407{ 478{
408 return (u8 *)l->items; 479 return (u8 *)l->items;
409} 480}
410
411/* helper function to cast into the data area of the leaf. */ 481/* helper function to cast into the data area of the leaf. */
412#define btrfs_item_ptr(leaf, slot, type) \ 482#define btrfs_item_ptr(leaf, slot, type) \
413 ((type *)(btrfs_leaf_data(leaf) + \ 483 ((type *)(btrfs_leaf_data(leaf) + \
@@ -422,7 +492,9 @@ void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p);
422void btrfs_init_path(struct btrfs_path *p); 492void btrfs_init_path(struct btrfs_path *p);
423int btrfs_del_item(struct btrfs_root *root, struct btrfs_path *path); 493int btrfs_del_item(struct btrfs_root *root, struct btrfs_path *path);
424int btrfs_insert_item(struct btrfs_root *root, struct btrfs_key *key, 494int btrfs_insert_item(struct btrfs_root *root, struct btrfs_key *key,
425 void *data, int data_size); 495 void *data, u32 data_size);
496int btrfs_insert_empty_item(struct btrfs_root *root, struct btrfs_path *path,
497 struct btrfs_key *cpu_key, u32 data_size);
426int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path); 498int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);
427int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf); 499int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf);
428int btrfs_drop_snapshot(struct btrfs_root *root, struct btrfs_buffer *snap); 500int btrfs_drop_snapshot(struct btrfs_root *root, struct btrfs_buffer *snap);