1 #include <linux/module.h>
4 #include "transaction.h"
6 static int split_node(struct btrfs_trans_handle
*trans
, struct btrfs_root
7 *root
, struct btrfs_path
*path
, int level
);
8 static int split_leaf(struct btrfs_trans_handle
*trans
, struct btrfs_root
9 *root
, struct btrfs_path
*path
, int data_size
);
10 static int push_node_left(struct btrfs_trans_handle
*trans
, struct btrfs_root
11 *root
, struct buffer_head
*dst
, struct buffer_head
13 static int balance_node_right(struct btrfs_trans_handle
*trans
, struct
14 btrfs_root
*root
, struct buffer_head
*dst_buf
,
15 struct buffer_head
*src_buf
);
16 static int del_ptr(struct btrfs_trans_handle
*trans
, struct btrfs_root
*root
,
17 struct btrfs_path
*path
, int level
, int slot
);
19 inline void btrfs_init_path(struct btrfs_path
*p
)
21 memset(p
, 0, sizeof(*p
));
24 void btrfs_release_path(struct btrfs_root
*root
, struct btrfs_path
*p
)
27 for (i
= 0; i
< BTRFS_MAX_LEVEL
; i
++) {
30 btrfs_block_release(root
, p
->nodes
[i
]);
32 memset(p
, 0, sizeof(*p
));
35 static int btrfs_cow_block(struct btrfs_trans_handle
*trans
, struct btrfs_root
36 *root
, struct buffer_head
*buf
, struct buffer_head
37 *parent
, int parent_slot
, struct buffer_head
40 struct buffer_head
*cow
;
41 struct btrfs_node
*cow_node
;
43 if (btrfs_header_generation(btrfs_buffer_header(buf
)) ==
48 cow
= btrfs_alloc_free_block(trans
, root
);
49 cow_node
= btrfs_buffer_node(cow
);
50 memcpy(cow_node
, btrfs_buffer_node(buf
), root
->blocksize
);
51 btrfs_set_header_blocknr(&cow_node
->header
, cow
->b_blocknr
);
52 btrfs_set_header_generation(&cow_node
->header
, trans
->transid
);
54 btrfs_mark_buffer_dirty(cow
);
55 btrfs_inc_ref(trans
, root
, buf
);
56 if (buf
== root
->node
) {
59 if (buf
!= root
->commit_root
)
60 btrfs_free_extent(trans
, root
, buf
->b_blocknr
, 1, 1);
61 btrfs_block_release(root
, buf
);
63 btrfs_set_node_blockptr(btrfs_buffer_node(parent
), parent_slot
,
65 btrfs_mark_buffer_dirty(parent
);
66 btrfs_free_extent(trans
, root
, buf
->b_blocknr
, 1, 1);
68 btrfs_block_release(root
, buf
);
73 * The leaf data grows from end-to-front in the node.
74 * this returns the address of the start of the last item,
75 * which is the stop of the leaf data stack
77 static inline unsigned int leaf_data_end(struct btrfs_root
*root
,
78 struct btrfs_leaf
*leaf
)
80 u32 nr
= btrfs_header_nritems(&leaf
->header
);
82 return BTRFS_LEAF_DATA_SIZE(root
);
83 return btrfs_item_offset(leaf
->items
+ nr
- 1);
87 * The space between the end of the leaf items and
88 * the start of the leaf data. IOW, how much room
89 * the leaf has left for both items and data
91 int btrfs_leaf_free_space(struct btrfs_root
*root
, struct btrfs_leaf
*leaf
)
93 int data_end
= leaf_data_end(root
, leaf
);
94 int nritems
= btrfs_header_nritems(&leaf
->header
);
95 char *items_end
= (char *)(leaf
->items
+ nritems
+ 1);
96 return (char *)(btrfs_leaf_data(leaf
) + data_end
) - (char *)items_end
;
100 * compare two keys in a memcmp fashion
102 static int comp_keys(struct btrfs_disk_key
*disk
, struct btrfs_key
*k2
)
106 btrfs_disk_key_to_cpu(&k1
, disk
);
108 if (k1
.objectid
> k2
->objectid
)
110 if (k1
.objectid
< k2
->objectid
)
112 if (k1
.offset
> k2
->offset
)
114 if (k1
.offset
< k2
->offset
)
116 if (k1
.flags
> k2
->flags
)
118 if (k1
.flags
< k2
->flags
)
123 static int check_node(struct btrfs_root
*root
, struct btrfs_path
*path
,
127 struct btrfs_node
*parent
= NULL
;
128 struct btrfs_node
*node
= btrfs_buffer_node(path
->nodes
[level
]);
130 u32 nritems
= btrfs_header_nritems(&node
->header
);
132 if (path
->nodes
[level
+ 1])
133 parent
= btrfs_buffer_node(path
->nodes
[level
+ 1]);
134 parent_slot
= path
->slots
[level
+ 1];
135 BUG_ON(nritems
== 0);
137 struct btrfs_disk_key
*parent_key
;
138 parent_key
= &parent
->ptrs
[parent_slot
].key
;
139 BUG_ON(memcmp(parent_key
, &node
->ptrs
[0].key
,
140 sizeof(struct btrfs_disk_key
)));
141 BUG_ON(btrfs_node_blockptr(parent
, parent_slot
) !=
142 btrfs_header_blocknr(&node
->header
));
144 BUG_ON(nritems
> BTRFS_NODEPTRS_PER_BLOCK(root
));
145 for (i
= 0; nritems
> 1 && i
< nritems
- 2; i
++) {
146 struct btrfs_key cpukey
;
147 btrfs_disk_key_to_cpu(&cpukey
, &node
->ptrs
[i
+ 1].key
);
148 BUG_ON(comp_keys(&node
->ptrs
[i
].key
, &cpukey
) >= 0);
153 static int check_leaf(struct btrfs_root
*root
, struct btrfs_path
*path
,
157 struct btrfs_leaf
*leaf
= btrfs_buffer_leaf(path
->nodes
[level
]);
158 struct btrfs_node
*parent
= NULL
;
160 u32 nritems
= btrfs_header_nritems(&leaf
->header
);
162 if (path
->nodes
[level
+ 1])
163 parent
= btrfs_buffer_node(path
->nodes
[level
+ 1]);
164 parent_slot
= path
->slots
[level
+ 1];
165 BUG_ON(btrfs_leaf_free_space(root
, leaf
) < 0);
171 struct btrfs_disk_key
*parent_key
;
172 parent_key
= &parent
->ptrs
[parent_slot
].key
;
173 BUG_ON(memcmp(parent_key
, &leaf
->items
[0].key
,
174 sizeof(struct btrfs_disk_key
)));
175 BUG_ON(btrfs_node_blockptr(parent
, parent_slot
) !=
176 btrfs_header_blocknr(&leaf
->header
));
178 for (i
= 0; nritems
> 1 && i
< nritems
- 2; i
++) {
179 struct btrfs_key cpukey
;
180 btrfs_disk_key_to_cpu(&cpukey
, &leaf
->items
[i
+ 1].key
);
181 BUG_ON(comp_keys(&leaf
->items
[i
].key
,
183 BUG_ON(btrfs_item_offset(leaf
->items
+ i
) !=
184 btrfs_item_end(leaf
->items
+ i
+ 1));
186 BUG_ON(btrfs_item_offset(leaf
->items
+ i
) +
187 btrfs_item_size(leaf
->items
+ i
) !=
188 BTRFS_LEAF_DATA_SIZE(root
));
194 static int check_block(struct btrfs_root
*root
, struct btrfs_path
*path
,
198 return check_leaf(root
, path
, level
);
199 return check_node(root
, path
, level
);
203 * search for key in the array p. items p are item_size apart
204 * and there are 'max' items in p
205 * the slot in the array is returned via slot, and it points to
206 * the place where you would insert key if it is not found in
209 * slot may point to max if the key is bigger than all of the keys
211 static int generic_bin_search(char *p
, int item_size
, struct btrfs_key
*key
,
218 struct btrfs_disk_key
*tmp
;
221 mid
= (low
+ high
) / 2;
222 tmp
= (struct btrfs_disk_key
*)(p
+ mid
* item_size
);
223 ret
= comp_keys(tmp
, key
);
239 * simple bin_search frontend that does the right thing for
242 static int bin_search(struct btrfs_node
*c
, struct btrfs_key
*key
, int *slot
)
244 if (btrfs_is_leaf(c
)) {
245 struct btrfs_leaf
*l
= (struct btrfs_leaf
*)c
;
246 return generic_bin_search((void *)l
->items
,
247 sizeof(struct btrfs_item
),
248 key
, btrfs_header_nritems(&c
->header
),
251 return generic_bin_search((void *)c
->ptrs
,
252 sizeof(struct btrfs_key_ptr
),
253 key
, btrfs_header_nritems(&c
->header
),
259 static struct buffer_head
*read_node_slot(struct btrfs_root
*root
,
260 struct buffer_head
*parent_buf
,
263 struct btrfs_node
*node
= btrfs_buffer_node(parent_buf
);
266 if (slot
>= btrfs_header_nritems(&node
->header
))
268 return read_tree_block(root
, btrfs_node_blockptr(node
, slot
));
271 static int balance_level(struct btrfs_trans_handle
*trans
, struct btrfs_root
272 *root
, struct btrfs_path
*path
, int level
)
274 struct buffer_head
*right_buf
;
275 struct buffer_head
*mid_buf
;
276 struct buffer_head
*left_buf
;
277 struct buffer_head
*parent_buf
= NULL
;
278 struct btrfs_node
*right
= NULL
;
279 struct btrfs_node
*mid
;
280 struct btrfs_node
*left
= NULL
;
281 struct btrfs_node
*parent
= NULL
;
285 int orig_slot
= path
->slots
[level
];
291 mid_buf
= path
->nodes
[level
];
292 mid
= btrfs_buffer_node(mid_buf
);
293 orig_ptr
= btrfs_node_blockptr(mid
, orig_slot
);
295 if (level
< BTRFS_MAX_LEVEL
- 1)
296 parent_buf
= path
->nodes
[level
+ 1];
297 pslot
= path
->slots
[level
+ 1];
300 * deal with the case where there is only one pointer in the root
301 * by promoting the node below to a root
304 struct buffer_head
*child
;
305 u64 blocknr
= mid_buf
->b_blocknr
;
307 if (btrfs_header_nritems(&mid
->header
) != 1)
310 /* promote the child to a root */
311 child
= read_node_slot(root
, mid_buf
, 0);
314 path
->nodes
[level
] = NULL
;
315 clean_tree_block(trans
, root
, mid_buf
);
316 wait_on_buffer(mid_buf
);
317 /* once for the path */
318 btrfs_block_release(root
, mid_buf
);
319 /* once for the root ptr */
320 btrfs_block_release(root
, mid_buf
);
321 return btrfs_free_extent(trans
, root
, blocknr
, 1, 1);
323 parent
= btrfs_buffer_node(parent_buf
);
325 if (btrfs_header_nritems(&mid
->header
) >
326 BTRFS_NODEPTRS_PER_BLOCK(root
) / 4)
329 left_buf
= read_node_slot(root
, parent_buf
, pslot
- 1);
330 right_buf
= read_node_slot(root
, parent_buf
, pslot
+ 1);
332 /* first, try to make some room in the middle buffer */
334 btrfs_cow_block(trans
, root
, left_buf
, parent_buf
, pslot
- 1,
336 left
= btrfs_buffer_node(left_buf
);
337 orig_slot
+= btrfs_header_nritems(&left
->header
);
338 wret
= push_node_left(trans
, root
, left_buf
, mid_buf
);
344 * then try to empty the right most buffer into the middle
347 btrfs_cow_block(trans
, root
, right_buf
, parent_buf
, pslot
+ 1,
349 right
= btrfs_buffer_node(right_buf
);
350 wret
= push_node_left(trans
, root
, mid_buf
, right_buf
);
353 if (btrfs_header_nritems(&right
->header
) == 0) {
354 u64 blocknr
= right_buf
->b_blocknr
;
355 clean_tree_block(trans
, root
, right_buf
);
356 wait_on_buffer(right_buf
);
357 btrfs_block_release(root
, right_buf
);
360 wret
= del_ptr(trans
, root
, path
, level
+ 1, pslot
+
364 wret
= btrfs_free_extent(trans
, root
, blocknr
, 1, 1);
368 btrfs_memcpy(root
, parent
,
369 &parent
->ptrs
[pslot
+ 1].key
,
371 sizeof(struct btrfs_disk_key
));
372 btrfs_mark_buffer_dirty(parent_buf
);
375 if (btrfs_header_nritems(&mid
->header
) == 1) {
377 * we're not allowed to leave a node with one item in the
378 * tree during a delete. A deletion from lower in the tree
379 * could try to delete the only pointer in this node.
380 * So, pull some keys from the left.
381 * There has to be a left pointer at this point because
382 * otherwise we would have pulled some pointers from the
386 wret
= balance_node_right(trans
, root
, mid_buf
, left_buf
);
391 if (btrfs_header_nritems(&mid
->header
) == 0) {
392 /* we've managed to empty the middle node, drop it */
393 u64 blocknr
= mid_buf
->b_blocknr
;
394 clean_tree_block(trans
, root
, mid_buf
);
395 wait_on_buffer(mid_buf
);
396 btrfs_block_release(root
, mid_buf
);
399 wret
= del_ptr(trans
, root
, path
, level
+ 1, pslot
);
402 wret
= btrfs_free_extent(trans
, root
, blocknr
, 1, 1);
406 /* update the parent key to reflect our changes */
407 btrfs_memcpy(root
, parent
,
408 &parent
->ptrs
[pslot
].key
, &mid
->ptrs
[0].key
,
409 sizeof(struct btrfs_disk_key
));
410 btrfs_mark_buffer_dirty(parent_buf
);
413 /* update the path */
415 if (btrfs_header_nritems(&left
->header
) > orig_slot
) {
417 path
->nodes
[level
] = left_buf
;
418 path
->slots
[level
+ 1] -= 1;
419 path
->slots
[level
] = orig_slot
;
421 btrfs_block_release(root
, mid_buf
);
423 orig_slot
-= btrfs_header_nritems(&left
->header
);
424 path
->slots
[level
] = orig_slot
;
427 /* double check we haven't messed things up */
428 check_block(root
, path
, level
);
430 btrfs_node_blockptr(btrfs_buffer_node(path
->nodes
[level
]),
435 btrfs_block_release(root
, right_buf
);
437 btrfs_block_release(root
, left_buf
);
442 * look for key in the tree. path is filled in with nodes along the way
443 * if key is found, we return zero and you can find the item in the leaf
444 * level of the path (level 0)
446 * If the key isn't found, the path points to the slot where it should
447 * be inserted, and 1 is returned. If there are other errors during the
448 * search a negative error number is returned.
450 * if ins_len > 0, nodes and leaves will be split as we walk down the
451 * tree. if ins_len < 0, nodes will be merged as we walk down the tree (if
454 int btrfs_search_slot(struct btrfs_trans_handle
*trans
, struct btrfs_root
455 *root
, struct btrfs_key
*key
, struct btrfs_path
*p
, int
458 struct buffer_head
*b
;
459 struct buffer_head
*cow_buf
;
460 struct btrfs_node
*c
;
465 WARN_ON(p
->nodes
[0] != NULL
);
466 WARN_ON(!mutex_is_locked(&root
->fs_info
->fs_mutex
));
471 c
= btrfs_buffer_node(b
);
472 level
= btrfs_header_level(&c
->header
);
475 wret
= btrfs_cow_block(trans
, root
, b
,
481 BUG_ON(!cow
&& ins_len
);
482 c
= btrfs_buffer_node(b
);
484 ret
= check_block(root
, p
, level
);
487 ret
= bin_search(c
, key
, &slot
);
488 if (!btrfs_is_leaf(c
)) {
491 p
->slots
[level
] = slot
;
492 if (ins_len
> 0 && btrfs_header_nritems(&c
->header
) ==
493 BTRFS_NODEPTRS_PER_BLOCK(root
)) {
494 int sret
= split_node(trans
, root
, p
, level
);
499 c
= btrfs_buffer_node(b
);
500 slot
= p
->slots
[level
];
501 } else if (ins_len
< 0) {
502 int sret
= balance_level(trans
, root
, p
,
509 c
= btrfs_buffer_node(b
);
510 slot
= p
->slots
[level
];
511 BUG_ON(btrfs_header_nritems(&c
->header
) == 1);
513 b
= read_tree_block(root
, btrfs_node_blockptr(c
, slot
));
515 struct btrfs_leaf
*l
= (struct btrfs_leaf
*)c
;
516 p
->slots
[level
] = slot
;
517 if (ins_len
> 0 && btrfs_leaf_free_space(root
, l
) <
518 sizeof(struct btrfs_item
) + ins_len
) {
519 int sret
= split_leaf(trans
, root
, p
, ins_len
);
531 * adjust the pointers going up the tree, starting at level
532 * making sure the right key of each node is points to 'key'.
533 * This is used after shifting pointers to the left, so it stops
534 * fixing up pointers when a given leaf/node is not in slot 0 of the
537 * If this fails to write a tree block, it returns -1, but continues
538 * fixing up the blocks in ram so the tree is consistent.
540 static int fixup_low_keys(struct btrfs_trans_handle
*trans
, struct btrfs_root
541 *root
, struct btrfs_path
*path
, struct btrfs_disk_key
546 for (i
= level
; i
< BTRFS_MAX_LEVEL
; i
++) {
547 struct btrfs_node
*t
;
548 int tslot
= path
->slots
[i
];
551 t
= btrfs_buffer_node(path
->nodes
[i
]);
552 btrfs_memcpy(root
, t
, &t
->ptrs
[tslot
].key
, key
, sizeof(*key
));
553 btrfs_mark_buffer_dirty(path
->nodes
[i
]);
561 * try to push data from one node into the next node left in the
564 * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
565 * error, and > 0 if there was no room in the left hand block.
567 static int push_node_left(struct btrfs_trans_handle
*trans
, struct btrfs_root
568 *root
, struct buffer_head
*dst_buf
, struct
569 buffer_head
*src_buf
)
571 struct btrfs_node
*src
= btrfs_buffer_node(src_buf
);
572 struct btrfs_node
*dst
= btrfs_buffer_node(dst_buf
);
578 src_nritems
= btrfs_header_nritems(&src
->header
);
579 dst_nritems
= btrfs_header_nritems(&dst
->header
);
580 push_items
= BTRFS_NODEPTRS_PER_BLOCK(root
) - dst_nritems
;
581 if (push_items
<= 0) {
585 if (src_nritems
< push_items
)
586 push_items
= src_nritems
;
588 btrfs_memcpy(root
, dst
, dst
->ptrs
+ dst_nritems
, src
->ptrs
,
589 push_items
* sizeof(struct btrfs_key_ptr
));
590 if (push_items
< src_nritems
) {
591 btrfs_memmove(root
, src
, src
->ptrs
, src
->ptrs
+ push_items
,
592 (src_nritems
- push_items
) *
593 sizeof(struct btrfs_key_ptr
));
595 btrfs_set_header_nritems(&src
->header
, src_nritems
- push_items
);
596 btrfs_set_header_nritems(&dst
->header
, dst_nritems
+ push_items
);
597 btrfs_mark_buffer_dirty(src_buf
);
598 btrfs_mark_buffer_dirty(dst_buf
);
603 * try to push data from one node into the next node right in the
606 * returns 0 if some ptrs were pushed, < 0 if there was some horrible
607 * error, and > 0 if there was no room in the right hand block.
609 * this will only push up to 1/2 the contents of the left node over
611 static int balance_node_right(struct btrfs_trans_handle
*trans
, struct
612 btrfs_root
*root
, struct buffer_head
*dst_buf
,
613 struct buffer_head
*src_buf
)
615 struct btrfs_node
*src
= btrfs_buffer_node(src_buf
);
616 struct btrfs_node
*dst
= btrfs_buffer_node(dst_buf
);
623 src_nritems
= btrfs_header_nritems(&src
->header
);
624 dst_nritems
= btrfs_header_nritems(&dst
->header
);
625 push_items
= BTRFS_NODEPTRS_PER_BLOCK(root
) - dst_nritems
;
626 if (push_items
<= 0) {
630 max_push
= src_nritems
/ 2 + 1;
631 /* don't try to empty the node */
632 if (max_push
> src_nritems
)
634 if (max_push
< push_items
)
635 push_items
= max_push
;
637 btrfs_memmove(root
, dst
, dst
->ptrs
+ push_items
, dst
->ptrs
,
638 dst_nritems
* sizeof(struct btrfs_key_ptr
));
640 btrfs_memcpy(root
, dst
, dst
->ptrs
,
641 src
->ptrs
+ src_nritems
- push_items
,
642 push_items
* sizeof(struct btrfs_key_ptr
));
644 btrfs_set_header_nritems(&src
->header
, src_nritems
- push_items
);
645 btrfs_set_header_nritems(&dst
->header
, dst_nritems
+ push_items
);
647 btrfs_mark_buffer_dirty(src_buf
);
648 btrfs_mark_buffer_dirty(dst_buf
);
653 * helper function to insert a new root level in the tree.
654 * A new node is allocated, and a single item is inserted to
655 * point to the existing root
657 * returns zero on success or < 0 on failure.
659 static int insert_new_root(struct btrfs_trans_handle
*trans
, struct btrfs_root
660 *root
, struct btrfs_path
*path
, int level
)
662 struct buffer_head
*t
;
663 struct btrfs_node
*lower
;
664 struct btrfs_node
*c
;
665 struct btrfs_disk_key
*lower_key
;
667 BUG_ON(path
->nodes
[level
]);
668 BUG_ON(path
->nodes
[level
-1] != root
->node
);
670 t
= btrfs_alloc_free_block(trans
, root
);
671 c
= btrfs_buffer_node(t
);
672 memset(c
, 0, root
->blocksize
);
673 btrfs_set_header_nritems(&c
->header
, 1);
674 btrfs_set_header_level(&c
->header
, level
);
675 btrfs_set_header_blocknr(&c
->header
, t
->b_blocknr
);
676 btrfs_set_header_generation(&c
->header
, trans
->transid
);
677 btrfs_set_header_parentid(&c
->header
,
678 btrfs_header_parentid(btrfs_buffer_header(root
->node
)));
679 lower
= btrfs_buffer_node(path
->nodes
[level
-1]);
680 if (btrfs_is_leaf(lower
))
681 lower_key
= &((struct btrfs_leaf
*)lower
)->items
[0].key
;
683 lower_key
= &lower
->ptrs
[0].key
;
684 btrfs_memcpy(root
, c
, &c
->ptrs
[0].key
, lower_key
,
685 sizeof(struct btrfs_disk_key
));
686 btrfs_set_node_blockptr(c
, 0, path
->nodes
[level
- 1]->b_blocknr
);
688 btrfs_mark_buffer_dirty(t
);
690 /* the super has an extra ref to root->node */
691 btrfs_block_release(root
, root
->node
);
694 path
->nodes
[level
] = t
;
695 path
->slots
[level
] = 0;
700 * worker function to insert a single pointer in a node.
701 * the node should have enough room for the pointer already
703 * slot and level indicate where you want the key to go, and
704 * blocknr is the block the key points to.
706 * returns zero on success and < 0 on any error
708 static int insert_ptr(struct btrfs_trans_handle
*trans
, struct btrfs_root
709 *root
, struct btrfs_path
*path
, struct btrfs_disk_key
710 *key
, u64 blocknr
, int slot
, int level
)
712 struct btrfs_node
*lower
;
715 BUG_ON(!path
->nodes
[level
]);
716 lower
= btrfs_buffer_node(path
->nodes
[level
]);
717 nritems
= btrfs_header_nritems(&lower
->header
);
720 if (nritems
== BTRFS_NODEPTRS_PER_BLOCK(root
))
722 if (slot
!= nritems
) {
723 btrfs_memmove(root
, lower
, lower
->ptrs
+ slot
+ 1,
725 (nritems
- slot
) * sizeof(struct btrfs_key_ptr
));
727 btrfs_memcpy(root
, lower
, &lower
->ptrs
[slot
].key
,
728 key
, sizeof(struct btrfs_disk_key
));
729 btrfs_set_node_blockptr(lower
, slot
, blocknr
);
730 btrfs_set_header_nritems(&lower
->header
, nritems
+ 1);
731 btrfs_mark_buffer_dirty(path
->nodes
[level
]);
736 * split the node at the specified level in path in two.
737 * The path is corrected to point to the appropriate node after the split
739 * Before splitting this tries to make some room in the node by pushing
740 * left and right, if either one works, it returns right away.
742 * returns 0 on success and < 0 on failure
744 static int split_node(struct btrfs_trans_handle
*trans
, struct btrfs_root
745 *root
, struct btrfs_path
*path
, int level
)
747 struct buffer_head
*t
;
748 struct btrfs_node
*c
;
749 struct buffer_head
*split_buffer
;
750 struct btrfs_node
*split
;
756 t
= path
->nodes
[level
];
757 c
= btrfs_buffer_node(t
);
758 if (t
== root
->node
) {
759 /* trying to split the root, lets make a new one */
760 ret
= insert_new_root(trans
, root
, path
, level
+ 1);
764 c_nritems
= btrfs_header_nritems(&c
->header
);
765 split_buffer
= btrfs_alloc_free_block(trans
, root
);
766 split
= btrfs_buffer_node(split_buffer
);
767 btrfs_set_header_flags(&split
->header
, btrfs_header_flags(&c
->header
));
768 btrfs_set_header_level(&split
->header
, btrfs_header_level(&c
->header
));
769 btrfs_set_header_blocknr(&split
->header
, split_buffer
->b_blocknr
);
770 btrfs_set_header_generation(&split
->header
, trans
->transid
);
771 btrfs_set_header_parentid(&split
->header
,
772 btrfs_header_parentid(btrfs_buffer_header(root
->node
)));
773 mid
= (c_nritems
+ 1) / 2;
774 btrfs_memcpy(root
, split
, split
->ptrs
, c
->ptrs
+ mid
,
775 (c_nritems
- mid
) * sizeof(struct btrfs_key_ptr
));
776 btrfs_set_header_nritems(&split
->header
, c_nritems
- mid
);
777 btrfs_set_header_nritems(&c
->header
, mid
);
780 btrfs_mark_buffer_dirty(t
);
781 btrfs_mark_buffer_dirty(split_buffer
);
782 wret
= insert_ptr(trans
, root
, path
, &split
->ptrs
[0].key
,
783 split_buffer
->b_blocknr
, path
->slots
[level
+ 1] + 1,
788 if (path
->slots
[level
] >= mid
) {
789 path
->slots
[level
] -= mid
;
790 btrfs_block_release(root
, t
);
791 path
->nodes
[level
] = split_buffer
;
792 path
->slots
[level
+ 1] += 1;
794 btrfs_block_release(root
, split_buffer
);
800 * how many bytes are required to store the items in a leaf. start
801 * and nr indicate which items in the leaf to check. This totals up the
802 * space used both by the item structs and the item data
804 static int leaf_space_used(struct btrfs_leaf
*l
, int start
, int nr
)
807 int end
= start
+ nr
- 1;
811 data_len
= btrfs_item_end(l
->items
+ start
);
812 data_len
= data_len
- btrfs_item_offset(l
->items
+ end
);
813 data_len
+= sizeof(struct btrfs_item
) * nr
;
818 * push some data in the path leaf to the right, trying to free up at
819 * least data_size bytes. returns zero if the push worked, nonzero otherwise
821 * returns 1 if the push failed because the other node didn't have enough
822 * room, 0 if everything worked out and < 0 if there were major errors.
824 static int push_leaf_right(struct btrfs_trans_handle
*trans
, struct btrfs_root
825 *root
, struct btrfs_path
*path
, int data_size
)
827 struct buffer_head
*left_buf
= path
->nodes
[0];
828 struct btrfs_leaf
*left
= btrfs_buffer_leaf(left_buf
);
829 struct btrfs_leaf
*right
;
830 struct buffer_head
*right_buf
;
831 struct buffer_head
*upper
;
832 struct btrfs_node
*upper_node
;
838 struct btrfs_item
*item
;
842 slot
= path
->slots
[1];
843 if (!path
->nodes
[1]) {
846 upper
= path
->nodes
[1];
847 upper_node
= btrfs_buffer_node(upper
);
848 if (slot
>= btrfs_header_nritems(&upper_node
->header
) - 1) {
851 right_buf
= read_tree_block(root
,
852 btrfs_node_blockptr(btrfs_buffer_node(upper
), slot
+ 1));
853 right
= btrfs_buffer_leaf(right_buf
);
854 free_space
= btrfs_leaf_free_space(root
, right
);
855 if (free_space
< data_size
+ sizeof(struct btrfs_item
)) {
856 btrfs_block_release(root
, right_buf
);
859 /* cow and double check */
860 btrfs_cow_block(trans
, root
, right_buf
, upper
, slot
+ 1, &right_buf
);
861 right
= btrfs_buffer_leaf(right_buf
);
862 free_space
= btrfs_leaf_free_space(root
, right
);
863 if (free_space
< data_size
+ sizeof(struct btrfs_item
)) {
864 btrfs_block_release(root
, right_buf
);
868 left_nritems
= btrfs_header_nritems(&left
->header
);
869 for (i
= left_nritems
- 1; i
>= 0; i
--) {
870 item
= left
->items
+ i
;
871 if (path
->slots
[0] == i
)
872 push_space
+= data_size
+ sizeof(*item
);
873 if (btrfs_item_size(item
) + sizeof(*item
) + push_space
>
877 push_space
+= btrfs_item_size(item
) + sizeof(*item
);
879 if (push_items
== 0) {
880 btrfs_block_release(root
, right_buf
);
883 right_nritems
= btrfs_header_nritems(&right
->header
);
884 /* push left to right */
885 push_space
= btrfs_item_end(left
->items
+ left_nritems
- push_items
);
886 push_space
-= leaf_data_end(root
, left
);
887 /* make room in the right data area */
888 btrfs_memmove(root
, right
, btrfs_leaf_data(right
) +
889 leaf_data_end(root
, right
) - push_space
,
890 btrfs_leaf_data(right
) +
891 leaf_data_end(root
, right
), BTRFS_LEAF_DATA_SIZE(root
) -
892 leaf_data_end(root
, right
));
893 /* copy from the left data area */
894 btrfs_memcpy(root
, right
, btrfs_leaf_data(right
) +
895 BTRFS_LEAF_DATA_SIZE(root
) - push_space
,
896 btrfs_leaf_data(left
) + leaf_data_end(root
, left
),
898 btrfs_memmove(root
, right
, right
->items
+ push_items
, right
->items
,
899 right_nritems
* sizeof(struct btrfs_item
));
900 /* copy the items from left to right */
901 btrfs_memcpy(root
, right
, right
->items
, left
->items
+
902 left_nritems
- push_items
,
903 push_items
* sizeof(struct btrfs_item
));
905 /* update the item pointers */
906 right_nritems
+= push_items
;
907 btrfs_set_header_nritems(&right
->header
, right_nritems
);
908 push_space
= BTRFS_LEAF_DATA_SIZE(root
);
909 for (i
= 0; i
< right_nritems
; i
++) {
910 btrfs_set_item_offset(right
->items
+ i
, push_space
-
911 btrfs_item_size(right
->items
+ i
));
912 push_space
= btrfs_item_offset(right
->items
+ i
);
914 left_nritems
-= push_items
;
915 btrfs_set_header_nritems(&left
->header
, left_nritems
);
917 btrfs_mark_buffer_dirty(left_buf
);
918 btrfs_mark_buffer_dirty(right_buf
);
919 btrfs_memcpy(root
, upper_node
, &upper_node
->ptrs
[slot
+ 1].key
,
920 &right
->items
[0].key
, sizeof(struct btrfs_disk_key
));
921 btrfs_mark_buffer_dirty(upper
);
923 /* then fixup the leaf pointer in the path */
924 if (path
->slots
[0] >= left_nritems
) {
925 path
->slots
[0] -= left_nritems
;
926 btrfs_block_release(root
, path
->nodes
[0]);
927 path
->nodes
[0] = right_buf
;
930 btrfs_block_release(root
, right_buf
);
935 * push some data in the path leaf to the left, trying to free up at
936 * least data_size bytes. returns zero if the push worked, nonzero otherwise
938 static int push_leaf_left(struct btrfs_trans_handle
*trans
, struct btrfs_root
939 *root
, struct btrfs_path
*path
, int data_size
)
941 struct buffer_head
*right_buf
= path
->nodes
[0];
942 struct btrfs_leaf
*right
= btrfs_buffer_leaf(right_buf
);
943 struct buffer_head
*t
;
944 struct btrfs_leaf
*left
;
950 struct btrfs_item
*item
;
951 u32 old_left_nritems
;
955 slot
= path
->slots
[1];
959 if (!path
->nodes
[1]) {
962 t
= read_tree_block(root
,
963 btrfs_node_blockptr(btrfs_buffer_node(path
->nodes
[1]), slot
- 1));
964 left
= btrfs_buffer_leaf(t
);
965 free_space
= btrfs_leaf_free_space(root
, left
);
966 if (free_space
< data_size
+ sizeof(struct btrfs_item
)) {
967 btrfs_block_release(root
, t
);
971 /* cow and double check */
972 btrfs_cow_block(trans
, root
, t
, path
->nodes
[1], slot
- 1, &t
);
973 left
= btrfs_buffer_leaf(t
);
974 free_space
= btrfs_leaf_free_space(root
, left
);
975 if (free_space
< data_size
+ sizeof(struct btrfs_item
)) {
976 btrfs_block_release(root
, t
);
980 for (i
= 0; i
< btrfs_header_nritems(&right
->header
); i
++) {
981 item
= right
->items
+ i
;
982 if (path
->slots
[0] == i
)
983 push_space
+= data_size
+ sizeof(*item
);
984 if (btrfs_item_size(item
) + sizeof(*item
) + push_space
>
988 push_space
+= btrfs_item_size(item
) + sizeof(*item
);
990 if (push_items
== 0) {
991 btrfs_block_release(root
, t
);
994 /* push data from right to left */
995 btrfs_memcpy(root
, left
, left
->items
+
996 btrfs_header_nritems(&left
->header
),
997 right
->items
, push_items
* sizeof(struct btrfs_item
));
998 push_space
= BTRFS_LEAF_DATA_SIZE(root
) -
999 btrfs_item_offset(right
->items
+ push_items
-1);
1000 btrfs_memcpy(root
, left
, btrfs_leaf_data(left
) +
1001 leaf_data_end(root
, left
) - push_space
,
1002 btrfs_leaf_data(right
) +
1003 btrfs_item_offset(right
->items
+ push_items
- 1),
1005 old_left_nritems
= btrfs_header_nritems(&left
->header
);
1006 BUG_ON(old_left_nritems
< 0);
1008 for (i
= old_left_nritems
; i
< old_left_nritems
+ push_items
; i
++) {
1009 u32 ioff
= btrfs_item_offset(left
->items
+ i
);
1010 btrfs_set_item_offset(left
->items
+ i
, ioff
-
1011 (BTRFS_LEAF_DATA_SIZE(root
) -
1012 btrfs_item_offset(left
->items
+
1013 old_left_nritems
- 1)));
1015 btrfs_set_header_nritems(&left
->header
, old_left_nritems
+ push_items
);
1017 /* fixup right node */
1018 push_space
= btrfs_item_offset(right
->items
+ push_items
- 1) -
1019 leaf_data_end(root
, right
);
1020 btrfs_memmove(root
, right
, btrfs_leaf_data(right
) +
1021 BTRFS_LEAF_DATA_SIZE(root
) - push_space
,
1022 btrfs_leaf_data(right
) +
1023 leaf_data_end(root
, right
), push_space
);
1024 btrfs_memmove(root
, right
, right
->items
, right
->items
+ push_items
,
1025 (btrfs_header_nritems(&right
->header
) - push_items
) *
1026 sizeof(struct btrfs_item
));
1027 btrfs_set_header_nritems(&right
->header
,
1028 btrfs_header_nritems(&right
->header
) -
1030 push_space
= BTRFS_LEAF_DATA_SIZE(root
);
1032 for (i
= 0; i
< btrfs_header_nritems(&right
->header
); i
++) {
1033 btrfs_set_item_offset(right
->items
+ i
, push_space
-
1034 btrfs_item_size(right
->items
+ i
));
1035 push_space
= btrfs_item_offset(right
->items
+ i
);
1038 btrfs_mark_buffer_dirty(t
);
1039 btrfs_mark_buffer_dirty(right_buf
);
1041 wret
= fixup_low_keys(trans
, root
, path
, &right
->items
[0].key
, 1);
1045 /* then fixup the leaf pointer in the path */
1046 if (path
->slots
[0] < push_items
) {
1047 path
->slots
[0] += old_left_nritems
;
1048 btrfs_block_release(root
, path
->nodes
[0]);
1050 path
->slots
[1] -= 1;
1052 btrfs_block_release(root
, t
);
1053 path
->slots
[0] -= push_items
;
1055 BUG_ON(path
->slots
[0] < 0);
1060 * split the path's leaf in two, making sure there is at least data_size
1061 * available for the resulting leaf level of the path.
1063 * returns 0 if all went well and < 0 on failure.
1065 static int split_leaf(struct btrfs_trans_handle
*trans
, struct btrfs_root
1066 *root
, struct btrfs_path
*path
, int data_size
)
1068 struct buffer_head
*l_buf
;
1069 struct btrfs_leaf
*l
;
1073 struct btrfs_leaf
*right
;
1074 struct buffer_head
*right_buffer
;
1075 int space_needed
= data_size
+ sizeof(struct btrfs_item
);
1082 /* first try to make some room by pushing left and right */
1083 wret
= push_leaf_left(trans
, root
, path
, data_size
);
1087 wret
= push_leaf_right(trans
, root
, path
, data_size
);
1091 l_buf
= path
->nodes
[0];
1092 l
= btrfs_buffer_leaf(l_buf
);
1094 /* did the pushes work? */
1095 if (btrfs_leaf_free_space(root
, l
) >=
1096 sizeof(struct btrfs_item
) + data_size
)
1099 if (!path
->nodes
[1]) {
1100 ret
= insert_new_root(trans
, root
, path
, 1);
1104 slot
= path
->slots
[0];
1105 nritems
= btrfs_header_nritems(&l
->header
);
1106 mid
= (nritems
+ 1)/ 2;
1107 right_buffer
= btrfs_alloc_free_block(trans
, root
);
1108 BUG_ON(!right_buffer
);
1109 BUG_ON(mid
== nritems
);
1110 right
= btrfs_buffer_leaf(right_buffer
);
1111 memset(&right
->header
, 0, sizeof(right
->header
));
1113 /* FIXME, just alloc a new leaf here */
1114 if (leaf_space_used(l
, mid
, nritems
- mid
) + space_needed
>
1115 BTRFS_LEAF_DATA_SIZE(root
))
1118 /* FIXME, just alloc a new leaf here */
1119 if (leaf_space_used(l
, 0, mid
+ 1) + space_needed
>
1120 BTRFS_LEAF_DATA_SIZE(root
))
1123 btrfs_set_header_nritems(&right
->header
, nritems
- mid
);
1124 btrfs_set_header_blocknr(&right
->header
, right_buffer
->b_blocknr
);
1125 btrfs_set_header_generation(&right
->header
, trans
->transid
);
1126 btrfs_set_header_level(&right
->header
, 0);
1127 btrfs_set_header_parentid(&right
->header
,
1128 btrfs_header_parentid(btrfs_buffer_header(root
->node
)));
1129 data_copy_size
= btrfs_item_end(l
->items
+ mid
) -
1130 leaf_data_end(root
, l
);
1131 btrfs_memcpy(root
, right
, right
->items
, l
->items
+ mid
,
1132 (nritems
- mid
) * sizeof(struct btrfs_item
));
1133 btrfs_memcpy(root
, right
,
1134 btrfs_leaf_data(right
) + BTRFS_LEAF_DATA_SIZE(root
) -
1135 data_copy_size
, btrfs_leaf_data(l
) +
1136 leaf_data_end(root
, l
), data_copy_size
);
1137 rt_data_off
= BTRFS_LEAF_DATA_SIZE(root
) -
1138 btrfs_item_end(l
->items
+ mid
);
1140 for (i
= 0; i
< btrfs_header_nritems(&right
->header
); i
++) {
1141 u32 ioff
= btrfs_item_offset(right
->items
+ i
);
1142 btrfs_set_item_offset(right
->items
+ i
, ioff
+ rt_data_off
);
1145 btrfs_set_header_nritems(&l
->header
, mid
);
1147 wret
= insert_ptr(trans
, root
, path
, &right
->items
[0].key
,
1148 right_buffer
->b_blocknr
, path
->slots
[1] + 1, 1);
1151 btrfs_mark_buffer_dirty(right_buffer
);
1152 btrfs_mark_buffer_dirty(l_buf
);
1153 BUG_ON(path
->slots
[0] != slot
);
1155 btrfs_block_release(root
, path
->nodes
[0]);
1156 path
->nodes
[0] = right_buffer
;
1157 path
->slots
[0] -= mid
;
1158 path
->slots
[1] += 1;
1160 btrfs_block_release(root
, right_buffer
);
1161 BUG_ON(path
->slots
[0] < 0);
1166 * Given a key and some data, insert an item into the tree.
1167 * This does all the path init required, making room in the tree if needed.
1169 int btrfs_insert_empty_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
1170 *root
, struct btrfs_path
*path
, struct btrfs_key
1171 *cpu_key
, u32 data_size
)
1176 struct btrfs_leaf
*leaf
;
1177 struct buffer_head
*leaf_buf
;
1179 unsigned int data_end
;
1180 struct btrfs_disk_key disk_key
;
1182 btrfs_cpu_key_to_disk(&disk_key
, cpu_key
);
1184 /* create a root if there isn't one */
1187 ret
= btrfs_search_slot(trans
, root
, cpu_key
, path
, data_size
, 1);
1194 slot_orig
= path
->slots
[0];
1195 leaf_buf
= path
->nodes
[0];
1196 leaf
= btrfs_buffer_leaf(leaf_buf
);
1198 nritems
= btrfs_header_nritems(&leaf
->header
);
1199 data_end
= leaf_data_end(root
, leaf
);
1201 if (btrfs_leaf_free_space(root
, leaf
) <
1202 sizeof(struct btrfs_item
) + data_size
)
1205 slot
= path
->slots
[0];
1207 if (slot
!= nritems
) {
1209 unsigned int old_data
= btrfs_item_end(leaf
->items
+ slot
);
1212 * item0..itemN ... dataN.offset..dataN.size .. data0.size
1214 /* first correct the data pointers */
1215 for (i
= slot
; i
< nritems
; i
++) {
1216 u32 ioff
= btrfs_item_offset(leaf
->items
+ i
);
1217 btrfs_set_item_offset(leaf
->items
+ i
,
1221 /* shift the items */
1222 btrfs_memmove(root
, leaf
, leaf
->items
+ slot
+ 1,
1224 (nritems
- slot
) * sizeof(struct btrfs_item
));
1226 /* shift the data */
1227 btrfs_memmove(root
, leaf
, btrfs_leaf_data(leaf
) +
1228 data_end
- data_size
, btrfs_leaf_data(leaf
) +
1229 data_end
, old_data
- data_end
);
1230 data_end
= old_data
;
1232 /* setup the item for the new data */
1233 btrfs_memcpy(root
, leaf
, &leaf
->items
[slot
].key
, &disk_key
,
1234 sizeof(struct btrfs_disk_key
));
1235 btrfs_set_item_offset(leaf
->items
+ slot
, data_end
- data_size
);
1236 btrfs_set_item_size(leaf
->items
+ slot
, data_size
);
1237 btrfs_set_header_nritems(&leaf
->header
, nritems
+ 1);
1238 btrfs_mark_buffer_dirty(leaf_buf
);
1242 ret
= fixup_low_keys(trans
, root
, path
, &disk_key
, 1);
1244 if (btrfs_leaf_free_space(root
, leaf
) < 0)
1246 check_leaf(root
, path
, 0);
1252 * Given a key and some data, insert an item into the tree.
1253 * This does all the path init required, making room in the tree if needed.
1255 int btrfs_insert_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
1256 *root
, struct btrfs_key
*cpu_key
, void *data
, u32
1260 struct btrfs_path path
;
1263 btrfs_init_path(&path
);
1264 ret
= btrfs_insert_empty_item(trans
, root
, &path
, cpu_key
, data_size
);
1266 ptr
= btrfs_item_ptr(btrfs_buffer_leaf(path
.nodes
[0]),
1268 btrfs_memcpy(root
, path
.nodes
[0]->b_data
,
1269 ptr
, data
, data_size
);
1270 btrfs_mark_buffer_dirty(path
.nodes
[0]);
1272 btrfs_release_path(root
, &path
);
1277 * delete the pointer from a given node.
1279 * If the delete empties a node, the node is removed from the tree,
1280 * continuing all the way the root if required. The root is converted into
1281 * a leaf if all the nodes are emptied.
1283 static int del_ptr(struct btrfs_trans_handle
*trans
, struct btrfs_root
*root
,
1284 struct btrfs_path
*path
, int level
, int slot
)
1286 struct btrfs_node
*node
;
1287 struct buffer_head
*parent
= path
->nodes
[level
];
1292 node
= btrfs_buffer_node(parent
);
1293 nritems
= btrfs_header_nritems(&node
->header
);
1294 if (slot
!= nritems
-1) {
1295 btrfs_memmove(root
, node
, node
->ptrs
+ slot
,
1296 node
->ptrs
+ slot
+ 1,
1297 sizeof(struct btrfs_key_ptr
) *
1298 (nritems
- slot
- 1));
1301 btrfs_set_header_nritems(&node
->header
, nritems
);
1302 if (nritems
== 0 && parent
== root
->node
) {
1303 struct btrfs_header
*header
= btrfs_buffer_header(root
->node
);
1304 BUG_ON(btrfs_header_level(header
) != 1);
1305 /* just turn the root into a leaf and break */
1306 btrfs_set_header_level(header
, 0);
1307 } else if (slot
== 0) {
1308 wret
= fixup_low_keys(trans
, root
, path
, &node
->ptrs
[0].key
,
1313 btrfs_mark_buffer_dirty(parent
);
1318 * delete the item at the leaf level in path. If that empties
1319 * the leaf, remove it from the tree
1321 int btrfs_del_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
*root
,
1322 struct btrfs_path
*path
)
1325 struct btrfs_leaf
*leaf
;
1326 struct buffer_head
*leaf_buf
;
1333 leaf_buf
= path
->nodes
[0];
1334 leaf
= btrfs_buffer_leaf(leaf_buf
);
1335 slot
= path
->slots
[0];
1336 doff
= btrfs_item_offset(leaf
->items
+ slot
);
1337 dsize
= btrfs_item_size(leaf
->items
+ slot
);
1338 nritems
= btrfs_header_nritems(&leaf
->header
);
1340 if (slot
!= nritems
- 1) {
1342 int data_end
= leaf_data_end(root
, leaf
);
1343 btrfs_memmove(root
, leaf
, btrfs_leaf_data(leaf
) +
1345 btrfs_leaf_data(leaf
) + data_end
,
1347 for (i
= slot
+ 1; i
< nritems
; i
++) {
1348 u32 ioff
= btrfs_item_offset(leaf
->items
+ i
);
1349 btrfs_set_item_offset(leaf
->items
+ i
, ioff
+ dsize
);
1351 btrfs_memmove(root
, leaf
, leaf
->items
+ slot
,
1352 leaf
->items
+ slot
+ 1,
1353 sizeof(struct btrfs_item
) *
1354 (nritems
- slot
- 1));
1356 btrfs_set_header_nritems(&leaf
->header
, nritems
- 1);
1358 /* delete the leaf if we've emptied it */
1360 if (leaf_buf
== root
->node
) {
1361 btrfs_set_header_level(&leaf
->header
, 0);
1363 clean_tree_block(trans
, root
, leaf_buf
);
1364 wait_on_buffer(leaf_buf
);
1365 wret
= del_ptr(trans
, root
, path
, 1, path
->slots
[1]);
1368 wret
= btrfs_free_extent(trans
, root
,
1369 leaf_buf
->b_blocknr
, 1, 1);
1374 int used
= leaf_space_used(leaf
, 0, nritems
);
1376 wret
= fixup_low_keys(trans
, root
, path
,
1377 &leaf
->items
[0].key
, 1);
1382 /* delete the leaf if it is mostly empty */
1383 if (used
< BTRFS_LEAF_DATA_SIZE(root
) / 3) {
1384 /* push_leaf_left fixes the path.
1385 * make sure the path still points to our leaf
1386 * for possible call to del_ptr below
1388 slot
= path
->slots
[1];
1390 wret
= push_leaf_left(trans
, root
, path
, 1);
1393 if (path
->nodes
[0] == leaf_buf
&&
1394 btrfs_header_nritems(&leaf
->header
)) {
1395 wret
= push_leaf_right(trans
, root
, path
, 1);
1399 if (btrfs_header_nritems(&leaf
->header
) == 0) {
1400 u64 blocknr
= leaf_buf
->b_blocknr
;
1401 clean_tree_block(trans
, root
, leaf_buf
);
1402 wait_on_buffer(leaf_buf
);
1403 wret
= del_ptr(trans
, root
, path
, 1, slot
);
1406 btrfs_block_release(root
, leaf_buf
);
1407 wret
= btrfs_free_extent(trans
, root
, blocknr
,
1412 btrfs_mark_buffer_dirty(leaf_buf
);
1413 btrfs_block_release(root
, leaf_buf
);
1416 btrfs_mark_buffer_dirty(leaf_buf
);
1423 * walk up the tree as far as required to find the next leaf.
1424 * returns 0 if it found something or 1 if there are no greater leaves.
1425 * returns < 0 on io errors.
1427 int btrfs_next_leaf(struct btrfs_root
*root
, struct btrfs_path
*path
)
1432 struct buffer_head
*c
;
1433 struct btrfs_node
*c_node
;
1434 struct buffer_head
*next
= NULL
;
1436 while(level
< BTRFS_MAX_LEVEL
) {
1437 if (!path
->nodes
[level
])
1439 slot
= path
->slots
[level
] + 1;
1440 c
= path
->nodes
[level
];
1441 c_node
= btrfs_buffer_node(c
);
1442 if (slot
>= btrfs_header_nritems(&c_node
->header
)) {
1446 blocknr
= btrfs_node_blockptr(c_node
, slot
);
1448 btrfs_block_release(root
, next
);
1449 next
= read_tree_block(root
, blocknr
);
1452 path
->slots
[level
] = slot
;
1455 c
= path
->nodes
[level
];
1456 btrfs_block_release(root
, c
);
1457 path
->nodes
[level
] = next
;
1458 path
->slots
[level
] = 0;
1461 next
= read_tree_block(root
,
1462 btrfs_node_blockptr(btrfs_buffer_node(next
), 0));
This page took 0.060984 seconds and 6 git commands to generate.