Btrfs: Fix extent_buffer and extent_state leaks
[linux-block.git] / fs / btrfs / ctree.c
CommitLineData
6cbd5570
CM
1/*
2 * Copyright (C) 2007 Oracle. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
17 */
18
5f39d397 19#include <linux/highmem.h>
eb60ceac
CM
20#include "ctree.h"
21#include "disk-io.h"
7f5c1516 22#include "transaction.h"
5f39d397 23#include "print-tree.h"
9a8dd150 24
e089f05c
CM
25static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
26 *root, struct btrfs_path *path, int level);
27static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
d4dbff95
CM
28 *root, struct btrfs_key *ins_key,
29 struct btrfs_path *path, int data_size);
5f39d397
CM
30static int push_node_left(struct btrfs_trans_handle *trans,
31 struct btrfs_root *root, struct extent_buffer *dst,
32 struct extent_buffer *src);
33static int balance_node_right(struct btrfs_trans_handle *trans,
34 struct btrfs_root *root,
35 struct extent_buffer *dst_buf,
36 struct extent_buffer *src_buf);
e089f05c
CM
37static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
38 struct btrfs_path *path, int level, int slot);
d97e63b6 39
df24a2b9 40inline void btrfs_init_path(struct btrfs_path *p)
2c90e5d6 41{
df24a2b9 42 memset(p, 0, sizeof(*p));
2c90e5d6
CM
43}
44
df24a2b9 45struct btrfs_path *btrfs_alloc_path(void)
2c90e5d6 46{
df24a2b9
CM
47 struct btrfs_path *path;
48 path = kmem_cache_alloc(btrfs_path_cachep, GFP_NOFS);
2cc58cf2 49 if (path) {
df24a2b9 50 btrfs_init_path(path);
2cc58cf2
CM
51 path->reada = 1;
52 }
df24a2b9 53 return path;
2c90e5d6
CM
54}
55
df24a2b9 56void btrfs_free_path(struct btrfs_path *p)
be0e5c09 57{
df24a2b9
CM
58 btrfs_release_path(NULL, p);
59 kmem_cache_free(btrfs_path_cachep, p);
be0e5c09
CM
60}
61
234b63a0 62void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p)
eb60ceac
CM
63{
64 int i;
234b63a0 65 for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
eb60ceac
CM
66 if (!p->nodes[i])
67 break;
5f39d397 68 free_extent_buffer(p->nodes[i]);
eb60ceac 69 }
aa5d6bed 70 memset(p, 0, sizeof(*p));
eb60ceac
CM
71}
72
5f39d397
CM
73static int __btrfs_cow_block(struct btrfs_trans_handle *trans,
74 struct btrfs_root *root,
75 struct extent_buffer *buf,
76 struct extent_buffer *parent, int parent_slot,
77 struct extent_buffer **cow_ret,
78 u64 search_start, u64 empty_size)
02217ed2 79{
5f39d397 80 struct extent_buffer *cow;
6702ed49
CM
81 int ret = 0;
82 int different_trans = 0;
02217ed2 83
6702ed49 84 WARN_ON(root->ref_cows && trans->transid != root->last_trans);
5f39d397 85
6702ed49 86 cow = btrfs_alloc_free_block(trans, root, search_start, empty_size);
54aa1f4d
CM
87 if (IS_ERR(cow))
88 return PTR_ERR(cow);
6702ed49 89
f510cfec 90 cow->alloc_addr = (unsigned long)__builtin_return_address(0);
5f39d397 91 if (buf->len != root->sectorsize || cow->len != root->sectorsize)
2c90e5d6 92 WARN_ON(1);
6702ed49 93
5f39d397
CM
94 copy_extent_buffer(cow, buf, 0, 0, cow->len);
95 btrfs_set_header_blocknr(cow, extent_buffer_blocknr(cow));
96 btrfs_set_header_generation(cow, trans->transid);
97 btrfs_set_header_owner(cow, root->root_key.objectid);
6702ed49 98
5f39d397
CM
99 WARN_ON(btrfs_header_generation(buf) > trans->transid);
100 if (btrfs_header_generation(buf) != trans->transid) {
6702ed49
CM
101 different_trans = 1;
102 ret = btrfs_inc_ref(trans, root, buf);
103 if (ret)
104 return ret;
105 } else {
6702ed49
CM
106 clean_tree_block(trans, root, buf);
107 }
108
02217ed2
CM
109 if (buf == root->node) {
110 root->node = cow;
5f39d397 111 extent_buffer_get(cow);
2c90e5d6 112 if (buf != root->commit_root) {
5f39d397
CM
113 btrfs_free_extent(trans, root,
114 extent_buffer_blocknr(buf), 1, 1);
2c90e5d6 115 }
5f39d397 116 free_extent_buffer(buf);
02217ed2 117 } else {
5f39d397
CM
118 btrfs_set_node_blockptr(parent, parent_slot,
119 extent_buffer_blocknr(cow));
d6025579 120 btrfs_mark_buffer_dirty(parent);
5f39d397
CM
121 WARN_ON(btrfs_header_generation(parent) != trans->transid);
122 btrfs_free_extent(trans, root, extent_buffer_blocknr(buf),1,1);
02217ed2 123 }
5f39d397 124 free_extent_buffer(buf);
ccd467d6 125 btrfs_mark_buffer_dirty(cow);
2c90e5d6 126 *cow_ret = cow;
02217ed2
CM
127 return 0;
128}
129
5f39d397
CM
130int btrfs_cow_block(struct btrfs_trans_handle *trans,
131 struct btrfs_root *root, struct extent_buffer *buf,
132 struct extent_buffer *parent, int parent_slot,
133 struct extent_buffer **cow_ret)
6702ed49
CM
134{
135 u64 search_start;
f510cfec 136 int ret;
6702ed49
CM
137 if (trans->transaction != root->fs_info->running_transaction) {
138 printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
139 root->fs_info->running_transaction->transid);
140 WARN_ON(1);
141 }
142 if (trans->transid != root->fs_info->generation) {
143 printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
144 root->fs_info->generation);
145 WARN_ON(1);
146 }
5f39d397 147 if (btrfs_header_generation(buf) == trans->transid) {
6702ed49
CM
148 *cow_ret = buf;
149 return 0;
150 }
151
5f39d397 152 search_start = extent_buffer_blocknr(buf) & ~((u64)65535);
f510cfec 153 ret = __btrfs_cow_block(trans, root, buf, parent,
6702ed49 154 parent_slot, cow_ret, search_start, 0);
f510cfec
CM
155 (*cow_ret)->alloc_addr = (unsigned long)__builtin_return_address(0);
156 return ret;
6702ed49
CM
157}
158
159static int close_blocks(u64 blocknr, u64 other)
160{
161 if (blocknr < other && other - blocknr < 8)
162 return 1;
163 if (blocknr > other && blocknr - other < 8)
164 return 1;
165 return 0;
166}
167
5f39d397
CM
168#if 0
169static int should_defrag_leaf(struct extent_buffer *eb)
2cc58cf2 170{
5f39d397
CM
171 return 0;
172 struct btrfs_leaf *leaf = btrfs_buffer_leaf(eb);
2cc58cf2
CM
173 struct btrfs_disk_key *key;
174 u32 nritems;
175
176 if (buffer_defrag(bh))
177 return 1;
178
179 nritems = btrfs_header_nritems(&leaf->header);
180 if (nritems == 0)
181 return 0;
182
183 key = &leaf->items[0].key;
184 if (btrfs_disk_key_type(key) == BTRFS_DIR_ITEM_KEY)
185 return 1;
186
187 key = &leaf->items[nritems-1].key;
188 if (btrfs_disk_key_type(key) == BTRFS_DIR_ITEM_KEY)
189 return 1;
190 if (nritems > 4) {
191 key = &leaf->items[nritems/2].key;
192 if (btrfs_disk_key_type(key) == BTRFS_DIR_ITEM_KEY)
193 return 1;
194 }
195 return 0;
196}
5f39d397 197#endif
2cc58cf2 198
6702ed49 199int btrfs_realloc_node(struct btrfs_trans_handle *trans,
5f39d397 200 struct btrfs_root *root, struct extent_buffer *parent,
e9d0b13b 201 int cache_only, u64 *last_ret)
6702ed49 202{
5f39d397
CM
203 return 0;
204#if 0
6702ed49 205 struct btrfs_node *parent_node;
5f39d397
CM
206 struct extent_buffer *cur_eb;
207 struct extent_buffer *tmp_eb;
6702ed49 208 u64 blocknr;
e9d0b13b
CM
209 u64 search_start = *last_ret;
210 u64 last_block = 0;
6702ed49
CM
211 u64 other;
212 u32 parent_nritems;
213 int start_slot;
214 int end_slot;
215 int i;
216 int err = 0;
f2183bde 217 int parent_level;
6702ed49
CM
218
219 if (trans->transaction != root->fs_info->running_transaction) {
220 printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
221 root->fs_info->running_transaction->transid);
222 WARN_ON(1);
223 }
224 if (trans->transid != root->fs_info->generation) {
225 printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
226 root->fs_info->generation);
227 WARN_ON(1);
228 }
86479a04
CM
229 if (buffer_defrag_done(parent))
230 return 0;
231
6702ed49
CM
232 parent_node = btrfs_buffer_node(parent);
233 parent_nritems = btrfs_header_nritems(&parent_node->header);
f2183bde 234 parent_level = btrfs_header_level(&parent_node->header);
6702ed49
CM
235
236 start_slot = 0;
237 end_slot = parent_nritems;
238
239 if (parent_nritems == 1)
240 return 0;
241
242 for (i = start_slot; i < end_slot; i++) {
243 int close = 1;
244 blocknr = btrfs_node_blockptr(parent_node, i);
e9d0b13b
CM
245 if (last_block == 0)
246 last_block = blocknr;
6702ed49
CM
247 if (i > 0) {
248 other = btrfs_node_blockptr(parent_node, i - 1);
249 close = close_blocks(blocknr, other);
250 }
251 if (close && i < end_slot - 1) {
252 other = btrfs_node_blockptr(parent_node, i + 1);
253 close = close_blocks(blocknr, other);
254 }
e9d0b13b
CM
255 if (close) {
256 last_block = blocknr;
6702ed49 257 continue;
e9d0b13b 258 }
6702ed49
CM
259
260 cur_bh = btrfs_find_tree_block(root, blocknr);
261 if (!cur_bh || !buffer_uptodate(cur_bh) ||
2cc58cf2
CM
262 buffer_locked(cur_bh) ||
263 (parent_level != 1 && !buffer_defrag(cur_bh)) ||
264 (parent_level == 1 && !should_defrag_leaf(cur_bh))) {
6702ed49
CM
265 if (cache_only) {
266 brelse(cur_bh);
267 continue;
268 }
f2183bde
CM
269 if (!cur_bh || !buffer_uptodate(cur_bh) ||
270 buffer_locked(cur_bh)) {
271 brelse(cur_bh);
272 cur_bh = read_tree_block(root, blocknr);
273 }
6702ed49 274 }
e9d0b13b
CM
275 if (search_start == 0)
276 search_start = last_block & ~((u64)65535);
277
6702ed49
CM
278 err = __btrfs_cow_block(trans, root, cur_bh, parent, i,
279 &tmp_bh, search_start,
280 min(8, end_slot - i));
252c38f0
Y
281 if (err) {
282 brelse(cur_bh);
6702ed49 283 break;
252c38f0 284 }
6702ed49 285 search_start = bh_blocknr(tmp_bh);
f2183bde
CM
286 *last_ret = search_start;
287 if (parent_level == 1)
288 clear_buffer_defrag(tmp_bh);
86479a04 289 set_buffer_defrag_done(tmp_bh);
6702ed49
CM
290 brelse(tmp_bh);
291 }
292 return err;
5f39d397 293#endif
6702ed49
CM
294}
295
74123bd7
CM
296/*
297 * The leaf data grows from end-to-front in the node.
298 * this returns the address of the start of the last item,
299 * which is the stop of the leaf data stack
300 */
123abc88 301static inline unsigned int leaf_data_end(struct btrfs_root *root,
5f39d397 302 struct extent_buffer *leaf)
be0e5c09 303{
5f39d397 304 u32 nr = btrfs_header_nritems(leaf);
be0e5c09 305 if (nr == 0)
123abc88 306 return BTRFS_LEAF_DATA_SIZE(root);
5f39d397 307 return btrfs_item_offset_nr(leaf, nr - 1);
be0e5c09
CM
308}
309
74123bd7
CM
310/*
311 * compare two keys in a memcmp fashion
312 */
9aca1d51 313static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
be0e5c09 314{
e2fa7227
CM
315 struct btrfs_key k1;
316
317 btrfs_disk_key_to_cpu(&k1, disk);
318
319 if (k1.objectid > k2->objectid)
be0e5c09 320 return 1;
e2fa7227 321 if (k1.objectid < k2->objectid)
be0e5c09 322 return -1;
5f39d397 323 if (k1.type > k2->type)
f254e52c 324 return 1;
5f39d397 325 if (k1.type < k2->type)
f254e52c 326 return -1;
70b2befd
CM
327 if (k1.offset > k2->offset)
328 return 1;
329 if (k1.offset < k2->offset)
330 return -1;
be0e5c09
CM
331 return 0;
332}
74123bd7 333
123abc88
CM
334static int check_node(struct btrfs_root *root, struct btrfs_path *path,
335 int level)
aa5d6bed 336{
5f39d397
CM
337 struct extent_buffer *parent = NULL;
338 struct extent_buffer *node = path->nodes[level];
339 struct btrfs_disk_key parent_key;
340 struct btrfs_disk_key node_key;
aa5d6bed 341 int parent_slot;
8d7be552
CM
342 int slot;
343 struct btrfs_key cpukey;
5f39d397 344 u32 nritems = btrfs_header_nritems(node);
aa5d6bed
CM
345
346 if (path->nodes[level + 1])
5f39d397 347 parent = path->nodes[level + 1];
a1f39630 348
8d7be552 349 slot = path->slots[level];
7518a238
CM
350 BUG_ON(nritems == 0);
351 if (parent) {
a1f39630 352 parent_slot = path->slots[level + 1];
5f39d397
CM
353 btrfs_node_key(parent, &parent_key, parent_slot);
354 btrfs_node_key(node, &node_key, 0);
355 BUG_ON(memcmp(&parent_key, &node_key,
e2fa7227 356 sizeof(struct btrfs_disk_key)));
1d4f8a0c 357 BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
5f39d397 358 btrfs_header_blocknr(node));
aa5d6bed 359 }
123abc88 360 BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root));
8d7be552 361 if (slot != 0) {
5f39d397
CM
362 btrfs_node_key_to_cpu(node, &cpukey, slot - 1);
363 btrfs_node_key(node, &node_key, slot);
364 BUG_ON(comp_keys(&node_key, &cpukey) <= 0);
8d7be552
CM
365 }
366 if (slot < nritems - 1) {
5f39d397
CM
367 btrfs_node_key_to_cpu(node, &cpukey, slot + 1);
368 btrfs_node_key(node, &node_key, slot);
369 BUG_ON(comp_keys(&node_key, &cpukey) >= 0);
aa5d6bed
CM
370 }
371 return 0;
372}
373
123abc88
CM
374static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
375 int level)
aa5d6bed 376{
5f39d397
CM
377 struct extent_buffer *leaf = path->nodes[level];
378 struct extent_buffer *parent = NULL;
aa5d6bed 379 int parent_slot;
8d7be552 380 struct btrfs_key cpukey;
5f39d397
CM
381 struct btrfs_disk_key parent_key;
382 struct btrfs_disk_key leaf_key;
383 int slot = path->slots[0];
8d7be552 384
5f39d397 385 u32 nritems = btrfs_header_nritems(leaf);
aa5d6bed
CM
386
387 if (path->nodes[level + 1])
5f39d397 388 parent = path->nodes[level + 1];
7518a238
CM
389
390 if (nritems == 0)
391 return 0;
392
393 if (parent) {
a1f39630 394 parent_slot = path->slots[level + 1];
5f39d397
CM
395 btrfs_node_key(parent, &parent_key, parent_slot);
396 btrfs_item_key(leaf, &leaf_key, 0);
6702ed49 397
5f39d397 398 BUG_ON(memcmp(&parent_key, &leaf_key,
e2fa7227 399 sizeof(struct btrfs_disk_key)));
1d4f8a0c 400 BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
5f39d397
CM
401 btrfs_header_blocknr(leaf));
402 }
403#if 0
404 for (i = 0; nritems > 1 && i < nritems - 2; i++) {
405 btrfs_item_key_to_cpu(leaf, &cpukey, i + 1);
406 btrfs_item_key(leaf, &leaf_key, i);
407 if (comp_keys(&leaf_key, &cpukey) >= 0) {
408 btrfs_print_leaf(root, leaf);
409 printk("slot %d offset bad key\n", i);
410 BUG_ON(1);
411 }
412 if (btrfs_item_offset_nr(leaf, i) !=
413 btrfs_item_end_nr(leaf, i + 1)) {
414 btrfs_print_leaf(root, leaf);
415 printk("slot %d offset bad\n", i);
416 BUG_ON(1);
417 }
418 if (i == 0) {
419 if (btrfs_item_offset_nr(leaf, i) +
420 btrfs_item_size_nr(leaf, i) !=
421 BTRFS_LEAF_DATA_SIZE(root)) {
422 btrfs_print_leaf(root, leaf);
423 printk("slot %d first offset bad\n", i);
424 BUG_ON(1);
425 }
426 }
aa5d6bed 427 }
5f39d397
CM
428 if (nritems > 0) {
429 if (btrfs_item_size_nr(leaf, nritems - 1) > 4096) {
430 btrfs_print_leaf(root, leaf);
431 printk("slot %d bad size \n", nritems - 1);
432 BUG_ON(1);
433 }
434 }
435#endif
436 if (slot != 0 && slot < nritems - 1) {
437 btrfs_item_key(leaf, &leaf_key, slot);
438 btrfs_item_key_to_cpu(leaf, &cpukey, slot - 1);
439 if (comp_keys(&leaf_key, &cpukey) <= 0) {
440 btrfs_print_leaf(root, leaf);
441 printk("slot %d offset bad key\n", slot);
442 BUG_ON(1);
443 }
444 if (btrfs_item_offset_nr(leaf, slot - 1) !=
445 btrfs_item_end_nr(leaf, slot)) {
446 btrfs_print_leaf(root, leaf);
447 printk("slot %d offset bad\n", slot);
448 BUG_ON(1);
449 }
8d7be552
CM
450 }
451 if (slot < nritems - 1) {
5f39d397
CM
452 btrfs_item_key(leaf, &leaf_key, slot);
453 btrfs_item_key_to_cpu(leaf, &cpukey, slot + 1);
454 BUG_ON(comp_keys(&leaf_key, &cpukey) >= 0);
455 if (btrfs_item_offset_nr(leaf, slot) !=
456 btrfs_item_end_nr(leaf, slot + 1)) {
457 btrfs_print_leaf(root, leaf);
458 printk("slot %d offset bad\n", slot);
459 BUG_ON(1);
460 }
aa5d6bed 461 }
5f39d397
CM
462 BUG_ON(btrfs_item_offset_nr(leaf, 0) +
463 btrfs_item_size_nr(leaf, 0) != BTRFS_LEAF_DATA_SIZE(root));
aa5d6bed
CM
464 return 0;
465}
466
123abc88
CM
467static int check_block(struct btrfs_root *root, struct btrfs_path *path,
468 int level)
aa5d6bed 469{
5f39d397 470 struct extent_buffer *buf = path->nodes[level];
5f39d397 471
479965d6
CM
472 if (memcmp_extent_buffer(buf, root->fs_info->fsid,
473 (unsigned long)btrfs_header_fsid(buf),
474 BTRFS_FSID_SIZE)) {
5f39d397 475 printk("warning bad block %Lu\n", buf->start);
479965d6 476 BUG();
5f39d397 477 }
aa5d6bed 478 if (level == 0)
123abc88
CM
479 return check_leaf(root, path, level);
480 return check_node(root, path, level);
aa5d6bed
CM
481}
482
74123bd7 483/*
5f39d397
CM
484 * search for key in the extent_buffer. The items start at offset p,
485 * and they are item_size apart. There are 'max' items in p.
486 *
74123bd7
CM
487 * the slot in the array is returned via slot, and it points to
488 * the place where you would insert key if it is not found in
489 * the array.
490 *
491 * slot may point to max if the key is bigger than all of the keys
492 */
5f39d397
CM
493static int generic_bin_search(struct extent_buffer *eb, unsigned long p,
494 int item_size, struct btrfs_key *key,
495 int max, int *slot)
be0e5c09
CM
496{
497 int low = 0;
498 int high = max;
499 int mid;
500 int ret;
479965d6 501 struct btrfs_disk_key *tmp = NULL;
5f39d397
CM
502 struct btrfs_disk_key unaligned;
503 unsigned long offset;
504 char *map_token = NULL;
505 char *kaddr = NULL;
506 unsigned long map_start = 0;
507 unsigned long map_len = 0;
479965d6 508 int err;
be0e5c09
CM
509
510 while(low < high) {
511 mid = (low + high) / 2;
5f39d397
CM
512 offset = p + mid * item_size;
513
514 if (!map_token || offset < map_start ||
515 (offset + sizeof(struct btrfs_disk_key)) >
516 map_start + map_len) {
479965d6 517 if (map_token) {
5f39d397 518 unmap_extent_buffer(eb, map_token, KM_USER0);
479965d6
CM
519 map_token = NULL;
520 }
521 err = map_extent_buffer(eb, offset,
522 sizeof(struct btrfs_disk_key),
523 &map_token, &kaddr,
524 &map_start, &map_len, KM_USER0);
525
526 if (!err) {
527 tmp = (struct btrfs_disk_key *)(kaddr + offset -
528 map_start);
529 } else {
530 read_extent_buffer(eb, &unaligned,
531 offset, sizeof(unaligned));
532 tmp = &unaligned;
533 }
5f39d397 534
5f39d397
CM
535 } else {
536 tmp = (struct btrfs_disk_key *)(kaddr + offset -
537 map_start);
538 }
be0e5c09
CM
539 ret = comp_keys(tmp, key);
540
541 if (ret < 0)
542 low = mid + 1;
543 else if (ret > 0)
544 high = mid;
545 else {
546 *slot = mid;
479965d6
CM
547 if (map_token)
548 unmap_extent_buffer(eb, map_token, KM_USER0);
be0e5c09
CM
549 return 0;
550 }
551 }
552 *slot = low;
5f39d397
CM
553 if (map_token)
554 unmap_extent_buffer(eb, map_token, KM_USER0);
be0e5c09
CM
555 return 1;
556}
557
97571fd0
CM
558/*
559 * simple bin_search frontend that does the right thing for
560 * leaves vs nodes
561 */
5f39d397
CM
562static int bin_search(struct extent_buffer *eb, struct btrfs_key *key,
563 int level, int *slot)
be0e5c09 564{
5f39d397
CM
565 if (level == 0) {
566 return generic_bin_search(eb,
567 offsetof(struct btrfs_leaf, items),
0783fcfc 568 sizeof(struct btrfs_item),
5f39d397 569 key, btrfs_header_nritems(eb),
7518a238 570 slot);
be0e5c09 571 } else {
5f39d397
CM
572 return generic_bin_search(eb,
573 offsetof(struct btrfs_node, ptrs),
123abc88 574 sizeof(struct btrfs_key_ptr),
5f39d397 575 key, btrfs_header_nritems(eb),
7518a238 576 slot);
be0e5c09
CM
577 }
578 return -1;
579}
580
5f39d397
CM
581static struct extent_buffer *read_node_slot(struct btrfs_root *root,
582 struct extent_buffer *parent, int slot)
bb803951 583{
bb803951
CM
584 if (slot < 0)
585 return NULL;
5f39d397 586 if (slot >= btrfs_header_nritems(parent))
bb803951 587 return NULL;
5f39d397 588 return read_tree_block(root, btrfs_node_blockptr(parent, slot));
bb803951
CM
589}
590
e089f05c
CM
591static int balance_level(struct btrfs_trans_handle *trans, struct btrfs_root
592 *root, struct btrfs_path *path, int level)
bb803951 593{
5f39d397
CM
594 struct extent_buffer *right = NULL;
595 struct extent_buffer *mid;
596 struct extent_buffer *left = NULL;
597 struct extent_buffer *parent = NULL;
bb803951
CM
598 int ret = 0;
599 int wret;
600 int pslot;
bb803951 601 int orig_slot = path->slots[level];
54aa1f4d 602 int err_on_enospc = 0;
79f95c82 603 u64 orig_ptr;
bb803951
CM
604
605 if (level == 0)
606 return 0;
607
5f39d397 608 mid = path->nodes[level];
1d4f8a0c 609 orig_ptr = btrfs_node_blockptr(mid, orig_slot);
79f95c82 610
234b63a0 611 if (level < BTRFS_MAX_LEVEL - 1)
5f39d397 612 parent = path->nodes[level + 1];
bb803951
CM
613 pslot = path->slots[level + 1];
614
40689478
CM
615 /*
616 * deal with the case where there is only one pointer in the root
617 * by promoting the node below to a root
618 */
5f39d397
CM
619 if (!parent) {
620 struct extent_buffer *child;
621 u64 blocknr = extent_buffer_blocknr(mid);
bb803951 622
5f39d397 623 if (btrfs_header_nritems(mid) != 1)
bb803951
CM
624 return 0;
625
626 /* promote the child to a root */
5f39d397 627 child = read_node_slot(root, mid, 0);
bb803951
CM
628 BUG_ON(!child);
629 root->node = child;
630 path->nodes[level] = NULL;
5f39d397
CM
631 clean_tree_block(trans, root, mid);
632 wait_on_tree_block_writeback(root, mid);
bb803951 633 /* once for the path */
5f39d397 634 free_extent_buffer(mid);
bb803951 635 /* once for the root ptr */
5f39d397 636 free_extent_buffer(mid);
e089f05c 637 return btrfs_free_extent(trans, root, blocknr, 1, 1);
bb803951 638 }
5f39d397 639 if (btrfs_header_nritems(mid) >
123abc88 640 BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
bb803951
CM
641 return 0;
642
5f39d397 643 if (btrfs_header_nritems(mid) < 2)
54aa1f4d
CM
644 err_on_enospc = 1;
645
5f39d397
CM
646 left = read_node_slot(root, parent, pslot - 1);
647 if (left) {
648 wret = btrfs_cow_block(trans, root, left,
649 parent, pslot - 1, &left);
54aa1f4d
CM
650 if (wret) {
651 ret = wret;
652 goto enospc;
653 }
2cc58cf2 654 }
5f39d397
CM
655 right = read_node_slot(root, parent, pslot + 1);
656 if (right) {
657 wret = btrfs_cow_block(trans, root, right,
658 parent, pslot + 1, &right);
2cc58cf2
CM
659 if (wret) {
660 ret = wret;
661 goto enospc;
662 }
663 }
664
665 /* first, try to make some room in the middle buffer */
5f39d397
CM
666 if (left) {
667 orig_slot += btrfs_header_nritems(left);
668 wret = push_node_left(trans, root, left, mid);
79f95c82
CM
669 if (wret < 0)
670 ret = wret;
5f39d397 671 if (btrfs_header_nritems(mid) < 2)
54aa1f4d 672 err_on_enospc = 1;
bb803951 673 }
79f95c82
CM
674
675 /*
676 * then try to empty the right most buffer into the middle
677 */
5f39d397
CM
678 if (right) {
679 wret = push_node_left(trans, root, mid, right);
54aa1f4d 680 if (wret < 0 && wret != -ENOSPC)
79f95c82 681 ret = wret;
5f39d397
CM
682 if (btrfs_header_nritems(right) == 0) {
683 u64 blocknr = extent_buffer_blocknr(right);
684 clean_tree_block(trans, root, right);
685 wait_on_tree_block_writeback(root, right);
686 free_extent_buffer(right);
bb803951 687 right = NULL;
e089f05c
CM
688 wret = del_ptr(trans, root, path, level + 1, pslot +
689 1);
bb803951
CM
690 if (wret)
691 ret = wret;
e089f05c 692 wret = btrfs_free_extent(trans, root, blocknr, 1, 1);
bb803951
CM
693 if (wret)
694 ret = wret;
695 } else {
5f39d397
CM
696 struct btrfs_disk_key right_key;
697 btrfs_node_key(right, &right_key, 0);
698 btrfs_set_node_key(parent, &right_key, pslot + 1);
699 btrfs_mark_buffer_dirty(parent);
bb803951
CM
700 }
701 }
5f39d397 702 if (btrfs_header_nritems(mid) == 1) {
79f95c82
CM
703 /*
704 * we're not allowed to leave a node with one item in the
705 * tree during a delete. A deletion from lower in the tree
706 * could try to delete the only pointer in this node.
707 * So, pull some keys from the left.
708 * There has to be a left pointer at this point because
709 * otherwise we would have pulled some pointers from the
710 * right
711 */
5f39d397
CM
712 BUG_ON(!left);
713 wret = balance_node_right(trans, root, mid, left);
54aa1f4d 714 if (wret < 0) {
79f95c82 715 ret = wret;
54aa1f4d
CM
716 goto enospc;
717 }
79f95c82
CM
718 BUG_ON(wret == 1);
719 }
5f39d397 720 if (btrfs_header_nritems(mid) == 0) {
79f95c82 721 /* we've managed to empty the middle node, drop it */
5f39d397
CM
722 u64 blocknr = extent_buffer_blocknr(mid);
723 clean_tree_block(trans, root, mid);
724 wait_on_tree_block_writeback(root, mid);
725 free_extent_buffer(mid);
bb803951 726 mid = NULL;
e089f05c 727 wret = del_ptr(trans, root, path, level + 1, pslot);
bb803951
CM
728 if (wret)
729 ret = wret;
e089f05c 730 wret = btrfs_free_extent(trans, root, blocknr, 1, 1);
bb803951
CM
731 if (wret)
732 ret = wret;
79f95c82
CM
733 } else {
734 /* update the parent key to reflect our changes */
5f39d397
CM
735 struct btrfs_disk_key mid_key;
736 btrfs_node_key(mid, &mid_key, 0);
737 btrfs_set_node_key(parent, &mid_key, pslot);
738 btrfs_mark_buffer_dirty(parent);
79f95c82 739 }
bb803951 740
79f95c82 741 /* update the path */
5f39d397
CM
742 if (left) {
743 if (btrfs_header_nritems(left) > orig_slot) {
744 extent_buffer_get(left);
745 path->nodes[level] = left;
bb803951
CM
746 path->slots[level + 1] -= 1;
747 path->slots[level] = orig_slot;
5f39d397
CM
748 if (mid)
749 free_extent_buffer(mid);
bb803951 750 } else {
5f39d397 751 orig_slot -= btrfs_header_nritems(left);
bb803951
CM
752 path->slots[level] = orig_slot;
753 }
754 }
79f95c82 755 /* double check we haven't messed things up */
123abc88 756 check_block(root, path, level);
e20d96d6 757 if (orig_ptr !=
5f39d397 758 btrfs_node_blockptr(path->nodes[level], path->slots[level]))
79f95c82 759 BUG();
54aa1f4d 760enospc:
5f39d397
CM
761 if (right)
762 free_extent_buffer(right);
763 if (left)
764 free_extent_buffer(left);
bb803951
CM
765 return ret;
766}
767
e66f709b
CM
768/* returns zero if the push worked, non-zero otherwise */
769static int push_nodes_for_insert(struct btrfs_trans_handle *trans,
770 struct btrfs_root *root,
771 struct btrfs_path *path, int level)
772{
5f39d397
CM
773 struct extent_buffer *right = NULL;
774 struct extent_buffer *mid;
775 struct extent_buffer *left = NULL;
776 struct extent_buffer *parent = NULL;
e66f709b
CM
777 int ret = 0;
778 int wret;
779 int pslot;
780 int orig_slot = path->slots[level];
781 u64 orig_ptr;
782
783 if (level == 0)
784 return 1;
785
5f39d397 786 mid = path->nodes[level];
e66f709b
CM
787 orig_ptr = btrfs_node_blockptr(mid, orig_slot);
788
789 if (level < BTRFS_MAX_LEVEL - 1)
5f39d397 790 parent = path->nodes[level + 1];
e66f709b
CM
791 pslot = path->slots[level + 1];
792
5f39d397 793 if (!parent)
e66f709b 794 return 1;
e66f709b 795
5f39d397 796 left = read_node_slot(root, parent, pslot - 1);
e66f709b
CM
797
798 /* first, try to make some room in the middle buffer */
5f39d397 799 if (left) {
e66f709b 800 u32 left_nr;
5f39d397 801 left_nr = btrfs_header_nritems(left);
33ade1f8
CM
802 if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
803 wret = 1;
804 } else {
5f39d397
CM
805 ret = btrfs_cow_block(trans, root, left, parent,
806 pslot - 1, &left);
54aa1f4d
CM
807 if (ret)
808 wret = 1;
809 else {
54aa1f4d 810 wret = push_node_left(trans, root,
5f39d397 811 left, mid);
54aa1f4d 812 }
33ade1f8 813 }
e66f709b
CM
814 if (wret < 0)
815 ret = wret;
816 if (wret == 0) {
5f39d397 817 struct btrfs_disk_key disk_key;
e66f709b 818 orig_slot += left_nr;
5f39d397
CM
819 btrfs_node_key(mid, &disk_key, 0);
820 btrfs_set_node_key(parent, &disk_key, pslot);
821 btrfs_mark_buffer_dirty(parent);
822 if (btrfs_header_nritems(left) > orig_slot) {
823 path->nodes[level] = left;
e66f709b
CM
824 path->slots[level + 1] -= 1;
825 path->slots[level] = orig_slot;
5f39d397 826 free_extent_buffer(mid);
e66f709b
CM
827 } else {
828 orig_slot -=
5f39d397 829 btrfs_header_nritems(left);
e66f709b 830 path->slots[level] = orig_slot;
5f39d397 831 free_extent_buffer(left);
e66f709b
CM
832 }
833 check_node(root, path, level);
834 return 0;
835 }
5f39d397 836 free_extent_buffer(left);
e66f709b 837 }
5f39d397 838 right= read_node_slot(root, parent, pslot + 1);
e66f709b
CM
839
840 /*
841 * then try to empty the right most buffer into the middle
842 */
5f39d397 843 if (right) {
33ade1f8 844 u32 right_nr;
5f39d397 845 right_nr = btrfs_header_nritems(right);
33ade1f8
CM
846 if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
847 wret = 1;
848 } else {
5f39d397
CM
849 ret = btrfs_cow_block(trans, root, right,
850 parent, pslot + 1,
851 &right);
54aa1f4d
CM
852 if (ret)
853 wret = 1;
854 else {
54aa1f4d 855 wret = balance_node_right(trans, root,
5f39d397 856 right, mid);
54aa1f4d 857 }
33ade1f8 858 }
e66f709b
CM
859 if (wret < 0)
860 ret = wret;
861 if (wret == 0) {
5f39d397
CM
862 struct btrfs_disk_key disk_key;
863
864 btrfs_node_key(right, &disk_key, 0);
865 btrfs_set_node_key(parent, &disk_key, pslot + 1);
866 btrfs_mark_buffer_dirty(parent);
867
868 if (btrfs_header_nritems(mid) <= orig_slot) {
869 path->nodes[level] = right;
e66f709b
CM
870 path->slots[level + 1] += 1;
871 path->slots[level] = orig_slot -
5f39d397
CM
872 btrfs_header_nritems(mid);
873 free_extent_buffer(mid);
e66f709b 874 } else {
5f39d397 875 free_extent_buffer(right);
e66f709b
CM
876 }
877 check_node(root, path, level);
878 return 0;
879 }
5f39d397 880 free_extent_buffer(right);
e66f709b
CM
881 }
882 check_node(root, path, level);
883 return 1;
884}
885
3c69faec
CM
886/*
887 * readahead one full node of leaves
888 */
889static void reada_for_search(struct btrfs_root *root, struct btrfs_path *path,
6702ed49 890 int level, int slot)
3c69faec 891{
5f39d397 892 struct extent_buffer *node;
3c69faec
CM
893 int i;
894 u32 nritems;
3c69faec
CM
895 u64 blocknr;
896 u64 search;
897 u64 cluster_start;
898 int ret;
899 int nread = 0;
900 int direction = path->reada;
901 struct radix_tree_root found;
902 unsigned long gang[8];
5f39d397 903 struct extent_buffer *eb;
3c69faec 904
6702ed49
CM
905 if (level == 0)
906 return;
907
908 if (!path->nodes[level])
3c69faec
CM
909 return;
910
5f39d397 911 node = path->nodes[level];
3c69faec 912 search = btrfs_node_blockptr(node, slot);
5f39d397
CM
913 eb = btrfs_find_tree_block(root, search);
914 if (eb) {
915 free_extent_buffer(eb);
3c69faec
CM
916 return;
917 }
918
919 init_bit_radix(&found);
5f39d397 920 nritems = btrfs_header_nritems(node);
3c69faec 921 for (i = slot; i < nritems; i++) {
3c69faec
CM
922 blocknr = btrfs_node_blockptr(node, i);
923 set_radix_bit(&found, blocknr);
924 }
925 if (direction > 0) {
926 cluster_start = search - 4;
927 if (cluster_start > search)
928 cluster_start = 0;
929 } else
930 cluster_start = search + 4;
931 while(1) {
932 ret = find_first_radix_bit(&found, gang, 0, ARRAY_SIZE(gang));
933 if (!ret)
934 break;
935 for (i = 0; i < ret; i++) {
936 blocknr = gang[i];
937 clear_radix_bit(&found, blocknr);
2cc58cf2 938 if (path->reada == 1 && nread > 16)
3c69faec 939 continue;
f2183bde 940 if (close_blocks(cluster_start, blocknr)) {
3c69faec
CM
941 readahead_tree_block(root, blocknr);
942 nread++;
3c69faec 943 cluster_start = blocknr;
3c69faec
CM
944 }
945 }
946 }
947}
74123bd7
CM
948/*
949 * look for key in the tree. path is filled in with nodes along the way
950 * if key is found, we return zero and you can find the item in the leaf
951 * level of the path (level 0)
952 *
953 * If the key isn't found, the path points to the slot where it should
aa5d6bed
CM
954 * be inserted, and 1 is returned. If there are other errors during the
955 * search a negative error number is returned.
97571fd0
CM
956 *
957 * if ins_len > 0, nodes and leaves will be split as we walk down the
958 * tree. if ins_len < 0, nodes will be merged as we walk down the tree (if
959 * possible)
74123bd7 960 */
e089f05c
CM
961int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
962 *root, struct btrfs_key *key, struct btrfs_path *p, int
963 ins_len, int cow)
be0e5c09 964{
5f39d397 965 struct extent_buffer *b;
3c69faec 966 u64 blocknr;
be0e5c09
CM
967 int slot;
968 int ret;
969 int level;
3c69faec 970 int should_reada = p->reada;
9f3a7427
CM
971 u8 lowest_level = 0;
972
6702ed49
CM
973 lowest_level = p->lowest_level;
974 WARN_ON(lowest_level && ins_len);
22b0ebda
CM
975 WARN_ON(p->nodes[0] != NULL);
976 WARN_ON(!mutex_is_locked(&root->fs_info->fs_mutex));
bb803951
CM
977again:
978 b = root->node;
5f39d397 979 extent_buffer_get(b);
eb60ceac 980 while (b) {
5f39d397 981 level = btrfs_header_level(b);
02217ed2
CM
982 if (cow) {
983 int wret;
e20d96d6
CM
984 wret = btrfs_cow_block(trans, root, b,
985 p->nodes[level + 1],
986 p->slots[level + 1],
252c38f0 987 &b);
54aa1f4d 988 if (wret) {
5f39d397 989 free_extent_buffer(b);
54aa1f4d
CM
990 return wret;
991 }
02217ed2
CM
992 }
993 BUG_ON(!cow && ins_len);
5f39d397 994 if (level != btrfs_header_level(b))
2c90e5d6 995 WARN_ON(1);
5f39d397 996 level = btrfs_header_level(b);
eb60ceac 997 p->nodes[level] = b;
123abc88 998 ret = check_block(root, p, level);
aa5d6bed
CM
999 if (ret)
1000 return -1;
5f39d397
CM
1001 ret = bin_search(b, key, level, &slot);
1002 if (level != 0) {
be0e5c09
CM
1003 if (ret && slot > 0)
1004 slot -= 1;
1005 p->slots[level] = slot;
5f39d397 1006 if (ins_len > 0 && btrfs_header_nritems(b) >=
d4dbff95 1007 BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
e089f05c 1008 int sret = split_node(trans, root, p, level);
5c680ed6
CM
1009 BUG_ON(sret > 0);
1010 if (sret)
1011 return sret;
1012 b = p->nodes[level];
5c680ed6 1013 slot = p->slots[level];
bb803951 1014 } else if (ins_len < 0) {
e089f05c
CM
1015 int sret = balance_level(trans, root, p,
1016 level);
bb803951
CM
1017 if (sret)
1018 return sret;
1019 b = p->nodes[level];
f510cfec
CM
1020 if (!b) {
1021 btrfs_release_path(NULL, p);
bb803951 1022 goto again;
f510cfec 1023 }
bb803951 1024 slot = p->slots[level];
5f39d397 1025 BUG_ON(btrfs_header_nritems(b) == 1);
5c680ed6 1026 }
9f3a7427
CM
1027 /* this is only true while dropping a snapshot */
1028 if (level == lowest_level)
1029 break;
5f39d397 1030 blocknr = btrfs_node_blockptr(b, slot);
6702ed49
CM
1031 if (should_reada)
1032 reada_for_search(root, p, level, slot);
5f39d397 1033 b = read_tree_block(root, btrfs_node_blockptr(b, slot));
be0e5c09
CM
1034 } else {
1035 p->slots[level] = slot;
5f39d397 1036 if (ins_len > 0 && btrfs_leaf_free_space(root, b) <
0783fcfc 1037 sizeof(struct btrfs_item) + ins_len) {
d4dbff95
CM
1038 int sret = split_leaf(trans, root, key,
1039 p, ins_len);
5c680ed6
CM
1040 BUG_ON(sret > 0);
1041 if (sret)
1042 return sret;
1043 }
be0e5c09
CM
1044 return ret;
1045 }
1046 }
aa5d6bed 1047 return 1;
be0e5c09
CM
1048}
1049
74123bd7
CM
1050/*
1051 * adjust the pointers going up the tree, starting at level
1052 * making sure the right key of each node is points to 'key'.
1053 * This is used after shifting pointers to the left, so it stops
1054 * fixing up pointers when a given leaf/node is not in slot 0 of the
1055 * higher levels
aa5d6bed
CM
1056 *
1057 * If this fails to write a tree block, it returns -1, but continues
1058 * fixing up the blocks in ram so the tree is consistent.
74123bd7 1059 */
5f39d397
CM
1060static int fixup_low_keys(struct btrfs_trans_handle *trans,
1061 struct btrfs_root *root, struct btrfs_path *path,
1062 struct btrfs_disk_key *key, int level)
be0e5c09
CM
1063{
1064 int i;
aa5d6bed 1065 int ret = 0;
5f39d397
CM
1066 struct extent_buffer *t;
1067
234b63a0 1068 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
be0e5c09 1069 int tslot = path->slots[i];
eb60ceac 1070 if (!path->nodes[i])
be0e5c09 1071 break;
5f39d397
CM
1072 t = path->nodes[i];
1073 btrfs_set_node_key(t, key, tslot);
d6025579 1074 btrfs_mark_buffer_dirty(path->nodes[i]);
be0e5c09
CM
1075 if (tslot != 0)
1076 break;
1077 }
aa5d6bed 1078 return ret;
be0e5c09
CM
1079}
1080
74123bd7
CM
1081/*
1082 * try to push data from one node into the next node left in the
79f95c82 1083 * tree.
aa5d6bed
CM
1084 *
1085 * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
1086 * error, and > 0 if there was no room in the left hand block.
74123bd7 1087 */
e089f05c 1088static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root
5f39d397
CM
1089 *root, struct extent_buffer *dst,
1090 struct extent_buffer *src)
be0e5c09 1091{
be0e5c09 1092 int push_items = 0;
bb803951
CM
1093 int src_nritems;
1094 int dst_nritems;
aa5d6bed 1095 int ret = 0;
be0e5c09 1096
5f39d397
CM
1097 src_nritems = btrfs_header_nritems(src);
1098 dst_nritems = btrfs_header_nritems(dst);
123abc88 1099 push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
54aa1f4d 1100
eb60ceac 1101 if (push_items <= 0) {
be0e5c09 1102 return 1;
eb60ceac 1103 }
be0e5c09 1104
bb803951 1105 if (src_nritems < push_items)
79f95c82
CM
1106 push_items = src_nritems;
1107
5f39d397
CM
1108 copy_extent_buffer(dst, src,
1109 btrfs_node_key_ptr_offset(dst_nritems),
1110 btrfs_node_key_ptr_offset(0),
1111 push_items * sizeof(struct btrfs_key_ptr));
1112
bb803951 1113 if (push_items < src_nritems) {
5f39d397
CM
1114 memmove_extent_buffer(src, btrfs_node_key_ptr_offset(0),
1115 btrfs_node_key_ptr_offset(push_items),
1116 (src_nritems - push_items) *
1117 sizeof(struct btrfs_key_ptr));
1118 }
1119 btrfs_set_header_nritems(src, src_nritems - push_items);
1120 btrfs_set_header_nritems(dst, dst_nritems + push_items);
1121 btrfs_mark_buffer_dirty(src);
1122 btrfs_mark_buffer_dirty(dst);
79f95c82
CM
1123 return ret;
1124}
1125
1126/*
1127 * try to push data from one node into the next node right in the
1128 * tree.
1129 *
1130 * returns 0 if some ptrs were pushed, < 0 if there was some horrible
1131 * error, and > 0 if there was no room in the right hand block.
1132 *
1133 * this will only push up to 1/2 the contents of the left node over
1134 */
5f39d397
CM
1135static int balance_node_right(struct btrfs_trans_handle *trans,
1136 struct btrfs_root *root,
1137 struct extent_buffer *dst,
1138 struct extent_buffer *src)
79f95c82 1139{
79f95c82
CM
1140 int push_items = 0;
1141 int max_push;
1142 int src_nritems;
1143 int dst_nritems;
1144 int ret = 0;
79f95c82 1145
5f39d397
CM
1146 src_nritems = btrfs_header_nritems(src);
1147 dst_nritems = btrfs_header_nritems(dst);
123abc88 1148 push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
5f39d397 1149 if (push_items <= 0)
79f95c82 1150 return 1;
79f95c82
CM
1151
1152 max_push = src_nritems / 2 + 1;
1153 /* don't try to empty the node */
252c38f0 1154 if (max_push >= src_nritems)
79f95c82 1155 return 1;
252c38f0 1156
79f95c82
CM
1157 if (max_push < push_items)
1158 push_items = max_push;
1159
5f39d397
CM
1160 memmove_extent_buffer(dst, btrfs_node_key_ptr_offset(push_items),
1161 btrfs_node_key_ptr_offset(0),
1162 (dst_nritems) *
1163 sizeof(struct btrfs_key_ptr));
d6025579 1164
5f39d397
CM
1165 copy_extent_buffer(dst, src,
1166 btrfs_node_key_ptr_offset(0),
1167 btrfs_node_key_ptr_offset(src_nritems - push_items),
1168 push_items * sizeof(struct btrfs_key_ptr));
79f95c82 1169
5f39d397
CM
1170 btrfs_set_header_nritems(src, src_nritems - push_items);
1171 btrfs_set_header_nritems(dst, dst_nritems + push_items);
79f95c82 1172
5f39d397
CM
1173 btrfs_mark_buffer_dirty(src);
1174 btrfs_mark_buffer_dirty(dst);
aa5d6bed 1175 return ret;
be0e5c09
CM
1176}
1177
97571fd0
CM
1178/*
1179 * helper function to insert a new root level in the tree.
1180 * A new node is allocated, and a single item is inserted to
1181 * point to the existing root
aa5d6bed
CM
1182 *
1183 * returns zero on success or < 0 on failure.
97571fd0 1184 */
5f39d397
CM
1185static int insert_new_root(struct btrfs_trans_handle *trans,
1186 struct btrfs_root *root,
1187 struct btrfs_path *path, int level)
5c680ed6 1188{
5f39d397
CM
1189 struct extent_buffer *lower;
1190 struct extent_buffer *c;
1191 struct btrfs_disk_key lower_key;
5c680ed6
CM
1192
1193 BUG_ON(path->nodes[level]);
1194 BUG_ON(path->nodes[level-1] != root->node);
1195
5f39d397
CM
1196 c = btrfs_alloc_free_block(trans, root,
1197 extent_buffer_blocknr(root->node), 0);
1198 if (IS_ERR(c))
1199 return PTR_ERR(c);
1200 memset_extent_buffer(c, 0, 0, root->nodesize);
1201 btrfs_set_header_nritems(c, 1);
1202 btrfs_set_header_level(c, level);
1203 btrfs_set_header_blocknr(c, extent_buffer_blocknr(c));
1204 btrfs_set_header_generation(c, trans->transid);
1205 btrfs_set_header_owner(c, root->root_key.objectid);
1206 lower = path->nodes[level-1];
1207
1208 write_extent_buffer(c, root->fs_info->fsid,
1209 (unsigned long)btrfs_header_fsid(c),
1210 BTRFS_FSID_SIZE);
1211 if (level == 1)
1212 btrfs_item_key(lower, &lower_key, 0);
5c680ed6 1213 else
5f39d397
CM
1214 btrfs_node_key(lower, &lower_key, 0);
1215 btrfs_set_node_key(c, &lower_key, 0);
1216 btrfs_set_node_blockptr(c, 0, extent_buffer_blocknr(lower));
d5719762 1217
5f39d397 1218 btrfs_mark_buffer_dirty(c);
d5719762 1219
5c680ed6 1220 /* the super has an extra ref to root->node */
5f39d397
CM
1221 free_extent_buffer(root->node);
1222 root->node = c;
1223 extent_buffer_get(c);
1224 path->nodes[level] = c;
5c680ed6
CM
1225 path->slots[level] = 0;
1226 return 0;
1227}
1228
74123bd7
CM
1229/*
1230 * worker function to insert a single pointer in a node.
1231 * the node should have enough room for the pointer already
97571fd0 1232 *
74123bd7
CM
1233 * slot and level indicate where you want the key to go, and
1234 * blocknr is the block the key points to.
aa5d6bed
CM
1235 *
1236 * returns zero on success and < 0 on any error
74123bd7 1237 */
e089f05c
CM
1238static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
1239 *root, struct btrfs_path *path, struct btrfs_disk_key
1240 *key, u64 blocknr, int slot, int level)
74123bd7 1241{
5f39d397 1242 struct extent_buffer *lower;
74123bd7 1243 int nritems;
5c680ed6
CM
1244
1245 BUG_ON(!path->nodes[level]);
5f39d397
CM
1246 lower = path->nodes[level];
1247 nritems = btrfs_header_nritems(lower);
74123bd7
CM
1248 if (slot > nritems)
1249 BUG();
123abc88 1250 if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
74123bd7
CM
1251 BUG();
1252 if (slot != nritems) {
5f39d397
CM
1253 memmove_extent_buffer(lower,
1254 btrfs_node_key_ptr_offset(slot + 1),
1255 btrfs_node_key_ptr_offset(slot),
d6025579 1256 (nritems - slot) * sizeof(struct btrfs_key_ptr));
74123bd7 1257 }
5f39d397 1258 btrfs_set_node_key(lower, key, slot);
1d4f8a0c 1259 btrfs_set_node_blockptr(lower, slot, blocknr);
5f39d397
CM
1260 btrfs_set_header_nritems(lower, nritems + 1);
1261 btrfs_mark_buffer_dirty(lower);
098f59c2 1262 check_node(root, path, level);
74123bd7
CM
1263 return 0;
1264}
1265
97571fd0
CM
1266/*
1267 * split the node at the specified level in path in two.
1268 * The path is corrected to point to the appropriate node after the split
1269 *
1270 * Before splitting this tries to make some room in the node by pushing
1271 * left and right, if either one works, it returns right away.
aa5d6bed
CM
1272 *
1273 * returns 0 on success and < 0 on failure
97571fd0 1274 */
e089f05c
CM
1275static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
1276 *root, struct btrfs_path *path, int level)
be0e5c09 1277{
5f39d397
CM
1278 struct extent_buffer *c;
1279 struct extent_buffer *split;
1280 struct btrfs_disk_key disk_key;
be0e5c09 1281 int mid;
5c680ed6 1282 int ret;
aa5d6bed 1283 int wret;
7518a238 1284 u32 c_nritems;
eb60ceac 1285
5f39d397
CM
1286 c = path->nodes[level];
1287 if (c == root->node) {
5c680ed6 1288 /* trying to split the root, lets make a new one */
e089f05c 1289 ret = insert_new_root(trans, root, path, level + 1);
5c680ed6
CM
1290 if (ret)
1291 return ret;
e66f709b
CM
1292 } else {
1293 ret = push_nodes_for_insert(trans, root, path, level);
5f39d397
CM
1294 c = path->nodes[level];
1295 if (!ret && btrfs_header_nritems(c) <
e66f709b
CM
1296 BTRFS_NODEPTRS_PER_BLOCK(root) - 1)
1297 return 0;
54aa1f4d
CM
1298 if (ret < 0)
1299 return ret;
be0e5c09 1300 }
e66f709b 1301
5f39d397
CM
1302 c_nritems = btrfs_header_nritems(c);
1303 split = btrfs_alloc_free_block(trans, root,
1304 extent_buffer_blocknr(c), 0);
1305 if (IS_ERR(split))
1306 return PTR_ERR(split);
1307
1308 btrfs_set_header_flags(split, btrfs_header_flags(c));
1309 btrfs_set_header_level(split, btrfs_header_level(c));
1310 btrfs_set_header_blocknr(split, extent_buffer_blocknr(split));
1311 btrfs_set_header_generation(split, trans->transid);
1312 btrfs_set_header_owner(split, root->root_key.objectid);
1313 write_extent_buffer(split, root->fs_info->fsid,
1314 (unsigned long)btrfs_header_fsid(split),
1315 BTRFS_FSID_SIZE);
54aa1f4d 1316
7518a238 1317 mid = (c_nritems + 1) / 2;
5f39d397
CM
1318
1319 copy_extent_buffer(split, c,
1320 btrfs_node_key_ptr_offset(0),
1321 btrfs_node_key_ptr_offset(mid),
1322 (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
1323 btrfs_set_header_nritems(split, c_nritems - mid);
1324 btrfs_set_header_nritems(c, mid);
aa5d6bed
CM
1325 ret = 0;
1326
5f39d397
CM
1327 btrfs_mark_buffer_dirty(c);
1328 btrfs_mark_buffer_dirty(split);
1329
1330 btrfs_node_key(split, &disk_key, 0);
1331 wret = insert_ptr(trans, root, path, &disk_key,
1332 extent_buffer_blocknr(split),
1333 path->slots[level + 1] + 1,
123abc88 1334 level + 1);
aa5d6bed
CM
1335 if (wret)
1336 ret = wret;
1337
5de08d7d 1338 if (path->slots[level] >= mid) {
5c680ed6 1339 path->slots[level] -= mid;
5f39d397
CM
1340 free_extent_buffer(c);
1341 path->nodes[level] = split;
5c680ed6
CM
1342 path->slots[level + 1] += 1;
1343 } else {
5f39d397 1344 free_extent_buffer(split);
be0e5c09 1345 }
aa5d6bed 1346 return ret;
be0e5c09
CM
1347}
1348
74123bd7
CM
1349/*
1350 * how many bytes are required to store the items in a leaf. start
1351 * and nr indicate which items in the leaf to check. This totals up the
1352 * space used both by the item structs and the item data
1353 */
5f39d397 1354static int leaf_space_used(struct extent_buffer *l, int start, int nr)
be0e5c09
CM
1355{
1356 int data_len;
5f39d397 1357 int nritems = btrfs_header_nritems(l);
d4dbff95 1358 int end = min(nritems, start + nr) - 1;
be0e5c09
CM
1359
1360 if (!nr)
1361 return 0;
5f39d397
CM
1362 data_len = btrfs_item_end_nr(l, start);
1363 data_len = data_len - btrfs_item_offset_nr(l, end);
0783fcfc 1364 data_len += sizeof(struct btrfs_item) * nr;
d4dbff95 1365 WARN_ON(data_len < 0);
be0e5c09
CM
1366 return data_len;
1367}
1368
d4dbff95
CM
1369/*
1370 * The space between the end of the leaf items and
1371 * the start of the leaf data. IOW, how much room
1372 * the leaf has left for both items and data
1373 */
5f39d397 1374int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf)
d4dbff95 1375{
5f39d397
CM
1376 int nritems = btrfs_header_nritems(leaf);
1377 int ret;
1378 ret = BTRFS_LEAF_DATA_SIZE(root) - leaf_space_used(leaf, 0, nritems);
1379 if (ret < 0) {
1380 printk("leaf free space ret %d, leaf data size %lu, used %d nritems %d\n",
1381 ret, BTRFS_LEAF_DATA_SIZE(root),
1382 leaf_space_used(leaf, 0, nritems), nritems);
1383 }
1384 return ret;
d4dbff95
CM
1385}
1386
00ec4c51
CM
1387/*
1388 * push some data in the path leaf to the right, trying to free up at
1389 * least data_size bytes. returns zero if the push worked, nonzero otherwise
aa5d6bed
CM
1390 *
1391 * returns 1 if the push failed because the other node didn't have enough
1392 * room, 0 if everything worked out and < 0 if there were major errors.
00ec4c51 1393 */
e089f05c
CM
1394static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
1395 *root, struct btrfs_path *path, int data_size)
00ec4c51 1396{
5f39d397
CM
1397 struct extent_buffer *left = path->nodes[0];
1398 struct extent_buffer *right;
1399 struct extent_buffer *upper;
1400 struct btrfs_disk_key disk_key;
00ec4c51
CM
1401 int slot;
1402 int i;
1403 int free_space;
1404 int push_space = 0;
1405 int push_items = 0;
0783fcfc 1406 struct btrfs_item *item;
7518a238
CM
1407 u32 left_nritems;
1408 u32 right_nritems;
5f39d397 1409 u32 data_end;
54aa1f4d 1410 int ret;
00ec4c51
CM
1411
1412 slot = path->slots[1];
1413 if (!path->nodes[1]) {
1414 return 1;
1415 }
1416 upper = path->nodes[1];
5f39d397 1417 if (slot >= btrfs_header_nritems(upper) - 1)
00ec4c51 1418 return 1;
5f39d397
CM
1419
1420 right = read_tree_block(root, btrfs_node_blockptr(upper, slot + 1));
123abc88 1421 free_space = btrfs_leaf_free_space(root, right);
0783fcfc 1422 if (free_space < data_size + sizeof(struct btrfs_item)) {
5f39d397 1423 free_extent_buffer(right);
00ec4c51
CM
1424 return 1;
1425 }
5f39d397 1426
02217ed2 1427 /* cow and double check */
5f39d397
CM
1428 ret = btrfs_cow_block(trans, root, right, upper,
1429 slot + 1, &right);
54aa1f4d 1430 if (ret) {
5f39d397 1431 free_extent_buffer(right);
54aa1f4d
CM
1432 return 1;
1433 }
123abc88 1434 free_space = btrfs_leaf_free_space(root, right);
0783fcfc 1435 if (free_space < data_size + sizeof(struct btrfs_item)) {
5f39d397 1436 free_extent_buffer(right);
02217ed2
CM
1437 return 1;
1438 }
1439
5f39d397 1440 left_nritems = btrfs_header_nritems(left);
a429e513 1441 if (left_nritems == 0) {
5f39d397 1442 free_extent_buffer(right);
a429e513
CM
1443 return 1;
1444 }
5f39d397 1445
a429e513 1446 for (i = left_nritems - 1; i >= 1; i--) {
5f39d397 1447 item = btrfs_item_nr(left, i);
00ec4c51
CM
1448 if (path->slots[0] == i)
1449 push_space += data_size + sizeof(*item);
5f39d397 1450 if (btrfs_item_size(left, item) + sizeof(*item) + push_space >
0783fcfc 1451 free_space)
00ec4c51
CM
1452 break;
1453 push_items++;
5f39d397 1454 push_space += btrfs_item_size(left, item) + sizeof(*item);
00ec4c51 1455 }
5f39d397 1456
00ec4c51 1457 if (push_items == 0) {
5f39d397 1458 free_extent_buffer(right);
00ec4c51
CM
1459 return 1;
1460 }
5f39d397 1461
a429e513
CM
1462 if (push_items == left_nritems)
1463 WARN_ON(1);
5f39d397 1464
00ec4c51 1465 /* push left to right */
5f39d397
CM
1466 right_nritems = btrfs_header_nritems(right);
1467 push_space = btrfs_item_end_nr(left, left_nritems - push_items);
123abc88 1468 push_space -= leaf_data_end(root, left);
5f39d397 1469
00ec4c51 1470 /* make room in the right data area */
5f39d397
CM
1471 data_end = leaf_data_end(root, right);
1472 memmove_extent_buffer(right,
1473 btrfs_leaf_data(right) + data_end - push_space,
1474 btrfs_leaf_data(right) + data_end,
1475 BTRFS_LEAF_DATA_SIZE(root) - data_end);
1476
00ec4c51 1477 /* copy from the left data area */
5f39d397 1478 copy_extent_buffer(right, left, btrfs_leaf_data(right) +
d6025579
CM
1479 BTRFS_LEAF_DATA_SIZE(root) - push_space,
1480 btrfs_leaf_data(left) + leaf_data_end(root, left),
1481 push_space);
5f39d397
CM
1482
1483 memmove_extent_buffer(right, btrfs_item_nr_offset(push_items),
1484 btrfs_item_nr_offset(0),
1485 right_nritems * sizeof(struct btrfs_item));
1486
00ec4c51 1487 /* copy the items from left to right */
5f39d397
CM
1488 copy_extent_buffer(right, left, btrfs_item_nr_offset(0),
1489 btrfs_item_nr_offset(left_nritems - push_items),
1490 push_items * sizeof(struct btrfs_item));
00ec4c51
CM
1491
1492 /* update the item pointers */
7518a238 1493 right_nritems += push_items;
5f39d397 1494 btrfs_set_header_nritems(right, right_nritems);
123abc88 1495 push_space = BTRFS_LEAF_DATA_SIZE(root);
7518a238 1496 for (i = 0; i < right_nritems; i++) {
5f39d397
CM
1497 item = btrfs_item_nr(right, i);
1498 btrfs_set_item_offset(right, item, push_space -
1499 btrfs_item_size(right, item));
1500 push_space = btrfs_item_offset(right, item);
00ec4c51 1501 }
7518a238 1502 left_nritems -= push_items;
5f39d397 1503 btrfs_set_header_nritems(left, left_nritems);
00ec4c51 1504
5f39d397
CM
1505 btrfs_mark_buffer_dirty(left);
1506 btrfs_mark_buffer_dirty(right);
a429e513 1507
5f39d397
CM
1508 btrfs_item_key(right, &disk_key, 0);
1509 btrfs_set_node_key(upper, &disk_key, slot + 1);
d6025579 1510 btrfs_mark_buffer_dirty(upper);
02217ed2 1511
00ec4c51 1512 /* then fixup the leaf pointer in the path */
7518a238
CM
1513 if (path->slots[0] >= left_nritems) {
1514 path->slots[0] -= left_nritems;
5f39d397
CM
1515 free_extent_buffer(path->nodes[0]);
1516 path->nodes[0] = right;
00ec4c51
CM
1517 path->slots[1] += 1;
1518 } else {
5f39d397 1519 free_extent_buffer(right);
00ec4c51 1520 }
098f59c2
CM
1521 if (path->nodes[1])
1522 check_node(root, path, 1);
00ec4c51
CM
1523 return 0;
1524}
74123bd7
CM
1525/*
1526 * push some data in the path leaf to the left, trying to free up at
1527 * least data_size bytes. returns zero if the push worked, nonzero otherwise
1528 */
e089f05c
CM
1529static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
1530 *root, struct btrfs_path *path, int data_size)
be0e5c09 1531{
5f39d397
CM
1532 struct btrfs_disk_key disk_key;
1533 struct extent_buffer *right = path->nodes[0];
1534 struct extent_buffer *left;
be0e5c09
CM
1535 int slot;
1536 int i;
1537 int free_space;
1538 int push_space = 0;
1539 int push_items = 0;
0783fcfc 1540 struct btrfs_item *item;
7518a238 1541 u32 old_left_nritems;
5f39d397 1542 u32 right_nritems;
aa5d6bed
CM
1543 int ret = 0;
1544 int wret;
be0e5c09
CM
1545
1546 slot = path->slots[1];
5f39d397 1547 if (slot == 0)
be0e5c09 1548 return 1;
5f39d397 1549 if (!path->nodes[1])
be0e5c09 1550 return 1;
5f39d397
CM
1551
1552 left = read_tree_block(root, btrfs_node_blockptr(path->nodes[1],
1553 slot - 1));
123abc88 1554 free_space = btrfs_leaf_free_space(root, left);
0783fcfc 1555 if (free_space < data_size + sizeof(struct btrfs_item)) {
5f39d397 1556 free_extent_buffer(left);
be0e5c09
CM
1557 return 1;
1558 }
02217ed2
CM
1559
1560 /* cow and double check */
5f39d397
CM
1561 ret = btrfs_cow_block(trans, root, left,
1562 path->nodes[1], slot - 1, &left);
54aa1f4d
CM
1563 if (ret) {
1564 /* we hit -ENOSPC, but it isn't fatal here */
5f39d397 1565 free_extent_buffer(left);
54aa1f4d
CM
1566 return 1;
1567 }
123abc88 1568 free_space = btrfs_leaf_free_space(root, left);
0783fcfc 1569 if (free_space < data_size + sizeof(struct btrfs_item)) {
5f39d397 1570 free_extent_buffer(left);
02217ed2
CM
1571 return 1;
1572 }
1573
5f39d397
CM
1574 right_nritems = btrfs_header_nritems(right);
1575 if (right_nritems == 0) {
1576 free_extent_buffer(left);
a429e513
CM
1577 return 1;
1578 }
1579
5f39d397
CM
1580 for (i = 0; i < right_nritems - 1; i++) {
1581 item = btrfs_item_nr(right, i);
be0e5c09
CM
1582 if (path->slots[0] == i)
1583 push_space += data_size + sizeof(*item);
5f39d397 1584 if (btrfs_item_size(right, item) + sizeof(*item) + push_space >
0783fcfc 1585 free_space)
be0e5c09
CM
1586 break;
1587 push_items++;
5f39d397 1588 push_space += btrfs_item_size(right, item) + sizeof(*item);
be0e5c09
CM
1589 }
1590 if (push_items == 0) {
5f39d397 1591 free_extent_buffer(left);
be0e5c09
CM
1592 return 1;
1593 }
5f39d397 1594 if (push_items == btrfs_header_nritems(right))
a429e513 1595 WARN_ON(1);
5f39d397 1596
be0e5c09 1597 /* push data from right to left */
5f39d397
CM
1598 copy_extent_buffer(left, right,
1599 btrfs_item_nr_offset(btrfs_header_nritems(left)),
1600 btrfs_item_nr_offset(0),
1601 push_items * sizeof(struct btrfs_item));
1602
123abc88 1603 push_space = BTRFS_LEAF_DATA_SIZE(root) -
5f39d397
CM
1604 btrfs_item_offset_nr(right, push_items -1);
1605
1606 copy_extent_buffer(left, right, btrfs_leaf_data(left) +
d6025579
CM
1607 leaf_data_end(root, left) - push_space,
1608 btrfs_leaf_data(right) +
5f39d397 1609 btrfs_item_offset_nr(right, push_items - 1),
d6025579 1610 push_space);
5f39d397 1611 old_left_nritems = btrfs_header_nritems(left);
eb60ceac
CM
1612 BUG_ON(old_left_nritems < 0);
1613
0783fcfc 1614 for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
5f39d397
CM
1615 u32 ioff;
1616 item = btrfs_item_nr(left, i);
1617 ioff = btrfs_item_offset(left, item);
1618 btrfs_set_item_offset(left, item,
1619 ioff - (BTRFS_LEAF_DATA_SIZE(root) -
1620 btrfs_item_offset_nr(left, old_left_nritems - 1)));
be0e5c09 1621 }
5f39d397 1622 btrfs_set_header_nritems(left, old_left_nritems + push_items);
be0e5c09
CM
1623
1624 /* fixup right node */
5f39d397
CM
1625 push_space = btrfs_item_offset_nr(right, push_items - 1) -
1626 leaf_data_end(root, right);
1627 memmove_extent_buffer(right, btrfs_leaf_data(right) +
1628 BTRFS_LEAF_DATA_SIZE(root) - push_space,
1629 btrfs_leaf_data(right) +
1630 leaf_data_end(root, right), push_space);
1631
1632 memmove_extent_buffer(right, btrfs_item_nr_offset(0),
1633 btrfs_item_nr_offset(push_items),
1634 (btrfs_header_nritems(right) - push_items) *
1635 sizeof(struct btrfs_item));
1636
1637 right_nritems = btrfs_header_nritems(right) - push_items;
1638 btrfs_set_header_nritems(right, right_nritems);
123abc88 1639 push_space = BTRFS_LEAF_DATA_SIZE(root);
eb60ceac 1640
5f39d397
CM
1641 for (i = 0; i < right_nritems; i++) {
1642 item = btrfs_item_nr(right, i);
1643 btrfs_set_item_offset(right, item, push_space -
1644 btrfs_item_size(right, item));
1645 push_space = btrfs_item_offset(right, item);
be0e5c09 1646 }
eb60ceac 1647
5f39d397
CM
1648 btrfs_mark_buffer_dirty(left);
1649 btrfs_mark_buffer_dirty(right);
098f59c2 1650
5f39d397
CM
1651 btrfs_item_key(right, &disk_key, 0);
1652 wret = fixup_low_keys(trans, root, path, &disk_key, 1);
aa5d6bed
CM
1653 if (wret)
1654 ret = wret;
be0e5c09
CM
1655
1656 /* then fixup the leaf pointer in the path */
1657 if (path->slots[0] < push_items) {
1658 path->slots[0] += old_left_nritems;
5f39d397
CM
1659 free_extent_buffer(path->nodes[0]);
1660 path->nodes[0] = left;
be0e5c09
CM
1661 path->slots[1] -= 1;
1662 } else {
5f39d397 1663 free_extent_buffer(left);
be0e5c09
CM
1664 path->slots[0] -= push_items;
1665 }
eb60ceac 1666 BUG_ON(path->slots[0] < 0);
098f59c2
CM
1667 if (path->nodes[1])
1668 check_node(root, path, 1);
aa5d6bed 1669 return ret;
be0e5c09
CM
1670}
1671
74123bd7
CM
1672/*
1673 * split the path's leaf in two, making sure there is at least data_size
1674 * available for the resulting leaf level of the path.
aa5d6bed
CM
1675 *
1676 * returns 0 if all went well and < 0 on failure.
74123bd7 1677 */
e089f05c 1678static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
d4dbff95
CM
1679 *root, struct btrfs_key *ins_key,
1680 struct btrfs_path *path, int data_size)
be0e5c09 1681{
5f39d397 1682 struct extent_buffer *l;
7518a238 1683 u32 nritems;
eb60ceac
CM
1684 int mid;
1685 int slot;
5f39d397 1686 struct extent_buffer *right;
0783fcfc 1687 int space_needed = data_size + sizeof(struct btrfs_item);
be0e5c09
CM
1688 int data_copy_size;
1689 int rt_data_off;
1690 int i;
d4dbff95 1691 int ret = 0;
aa5d6bed 1692 int wret;
d4dbff95
CM
1693 int double_split = 0;
1694 struct btrfs_disk_key disk_key;
aa5d6bed 1695
40689478 1696 /* first try to make some room by pushing left and right */
e089f05c 1697 wret = push_leaf_left(trans, root, path, data_size);
eaee50e8
CM
1698 if (wret < 0)
1699 return wret;
1700 if (wret) {
e089f05c 1701 wret = push_leaf_right(trans, root, path, data_size);
eaee50e8
CM
1702 if (wret < 0)
1703 return wret;
1704 }
5f39d397 1705 l = path->nodes[0];
aa5d6bed
CM
1706
1707 /* did the pushes work? */
123abc88
CM
1708 if (btrfs_leaf_free_space(root, l) >=
1709 sizeof(struct btrfs_item) + data_size)
aa5d6bed
CM
1710 return 0;
1711
5c680ed6 1712 if (!path->nodes[1]) {
e089f05c 1713 ret = insert_new_root(trans, root, path, 1);
5c680ed6
CM
1714 if (ret)
1715 return ret;
1716 }
eb60ceac 1717 slot = path->slots[0];
5f39d397 1718 nritems = btrfs_header_nritems(l);
eb60ceac 1719 mid = (nritems + 1)/ 2;
54aa1f4d 1720
5f39d397
CM
1721 right = btrfs_alloc_free_block(trans, root,
1722 extent_buffer_blocknr(l), 0);
1723 if (IS_ERR(right))
1724 return PTR_ERR(right);
1725
1726 memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
1727 btrfs_set_header_blocknr(right, extent_buffer_blocknr(right));
1728 btrfs_set_header_generation(right, trans->transid);
1729 btrfs_set_header_owner(right, root->root_key.objectid);
1730 btrfs_set_header_level(right, 0);
1731 write_extent_buffer(right, root->fs_info->fsid,
1732 (unsigned long)btrfs_header_fsid(right),
1733 BTRFS_FSID_SIZE);
1734
d4dbff95
CM
1735 if (mid <= slot) {
1736 if (nritems == 1 ||
1737 leaf_space_used(l, mid, nritems - mid) + space_needed >
1738 BTRFS_LEAF_DATA_SIZE(root)) {
1739 if (slot >= nritems) {
1740 btrfs_cpu_key_to_disk(&disk_key, ins_key);
5f39d397 1741 btrfs_set_header_nritems(right, 0);
d4dbff95
CM
1742 wret = insert_ptr(trans, root, path,
1743 &disk_key,
5f39d397 1744 extent_buffer_blocknr(right),
d4dbff95
CM
1745 path->slots[1] + 1, 1);
1746 if (wret)
1747 ret = wret;
5f39d397
CM
1748 free_extent_buffer(path->nodes[0]);
1749 path->nodes[0] = right;
d4dbff95
CM
1750 path->slots[0] = 0;
1751 path->slots[1] += 1;
1752 return ret;
1753 }
1754 mid = slot;
1755 double_split = 1;
1756 }
1757 } else {
1758 if (leaf_space_used(l, 0, mid + 1) + space_needed >
1759 BTRFS_LEAF_DATA_SIZE(root)) {
1760 if (slot == 0) {
1761 btrfs_cpu_key_to_disk(&disk_key, ins_key);
5f39d397 1762 btrfs_set_header_nritems(right, 0);
d4dbff95
CM
1763 wret = insert_ptr(trans, root, path,
1764 &disk_key,
5f39d397 1765 extent_buffer_blocknr(right),
098f59c2 1766 path->slots[1], 1);
d4dbff95
CM
1767 if (wret)
1768 ret = wret;
5f39d397
CM
1769 free_extent_buffer(path->nodes[0]);
1770 path->nodes[0] = right;
d4dbff95 1771 path->slots[0] = 0;
a429e513
CM
1772 if (path->slots[1] == 0) {
1773 wret = fixup_low_keys(trans, root,
1774 path, &disk_key, 1);
1775 if (wret)
1776 ret = wret;
1777 }
d4dbff95
CM
1778 return ret;
1779 }
1780 mid = slot;
1781 double_split = 1;
1782 }
1783 }
5f39d397
CM
1784 nritems = nritems - mid;
1785 btrfs_set_header_nritems(right, nritems);
1786 data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(root, l);
1787
1788 copy_extent_buffer(right, l, btrfs_item_nr_offset(0),
1789 btrfs_item_nr_offset(mid),
1790 nritems * sizeof(struct btrfs_item));
1791
1792 copy_extent_buffer(right, l,
d6025579
CM
1793 btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
1794 data_copy_size, btrfs_leaf_data(l) +
1795 leaf_data_end(root, l), data_copy_size);
5f39d397 1796
123abc88 1797 rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
5f39d397 1798 btrfs_item_end_nr(l, mid);
74123bd7 1799
5f39d397
CM
1800 for (i = 0; i < nritems; i++) {
1801 struct btrfs_item *item = btrfs_item_nr(right, i);
1802 u32 ioff = btrfs_item_offset(right, item);
1803 btrfs_set_item_offset(right, item, ioff + rt_data_off);
0783fcfc 1804 }
74123bd7 1805
5f39d397 1806 btrfs_set_header_nritems(l, mid);
aa5d6bed 1807 ret = 0;
5f39d397
CM
1808 btrfs_item_key(right, &disk_key, 0);
1809 wret = insert_ptr(trans, root, path, &disk_key,
1810 extent_buffer_blocknr(right), path->slots[1] + 1, 1);
aa5d6bed
CM
1811 if (wret)
1812 ret = wret;
5f39d397
CM
1813
1814 btrfs_mark_buffer_dirty(right);
1815 btrfs_mark_buffer_dirty(l);
eb60ceac 1816 BUG_ON(path->slots[0] != slot);
5f39d397 1817
be0e5c09 1818 if (mid <= slot) {
5f39d397
CM
1819 free_extent_buffer(path->nodes[0]);
1820 path->nodes[0] = right;
be0e5c09
CM
1821 path->slots[0] -= mid;
1822 path->slots[1] += 1;
eb60ceac 1823 } else
5f39d397
CM
1824 free_extent_buffer(right);
1825
eb60ceac 1826 BUG_ON(path->slots[0] < 0);
098f59c2 1827 check_node(root, path, 1);
5f39d397 1828 check_leaf(root, path, 0);
d4dbff95
CM
1829
1830 if (!double_split)
1831 return ret;
5f39d397
CM
1832
1833 right = btrfs_alloc_free_block(trans, root,
1834 extent_buffer_blocknr(l), 0);
1835 if (IS_ERR(right))
1836 return PTR_ERR(right);
1837
1838 memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
1839 btrfs_set_header_blocknr(right, extent_buffer_blocknr(right));
1840 btrfs_set_header_generation(right, trans->transid);
1841 btrfs_set_header_owner(right, root->root_key.objectid);
1842 btrfs_set_header_level(right, 0);
1843 write_extent_buffer(right, root->fs_info->fsid,
1844 (unsigned long)btrfs_header_fsid(right),
1845 BTRFS_FSID_SIZE);
1846
d4dbff95 1847 btrfs_cpu_key_to_disk(&disk_key, ins_key);
5f39d397 1848 btrfs_set_header_nritems(right, 0);
d4dbff95
CM
1849 wret = insert_ptr(trans, root, path,
1850 &disk_key,
5f39d397 1851 extent_buffer_blocknr(right),
d4dbff95
CM
1852 path->slots[1], 1);
1853 if (wret)
1854 ret = wret;
a429e513
CM
1855 if (path->slots[1] == 0) {
1856 wret = fixup_low_keys(trans, root, path, &disk_key, 1);
1857 if (wret)
1858 ret = wret;
1859 }
5f39d397
CM
1860 free_extent_buffer(path->nodes[0]);
1861 path->nodes[0] = right;
d4dbff95
CM
1862 path->slots[0] = 0;
1863 check_node(root, path, 1);
1864 check_leaf(root, path, 0);
be0e5c09
CM
1865 return ret;
1866}
1867
b18c6685
CM
1868int btrfs_truncate_item(struct btrfs_trans_handle *trans,
1869 struct btrfs_root *root,
1870 struct btrfs_path *path,
1871 u32 new_size)
1872{
1873 int ret = 0;
1874 int slot;
1875 int slot_orig;
5f39d397
CM
1876 struct extent_buffer *leaf;
1877 struct btrfs_item *item;
b18c6685
CM
1878 u32 nritems;
1879 unsigned int data_end;
1880 unsigned int old_data_start;
1881 unsigned int old_size;
1882 unsigned int size_diff;
1883 int i;
1884
1885 slot_orig = path->slots[0];
5f39d397 1886 leaf = path->nodes[0];
b18c6685 1887
5f39d397 1888 nritems = btrfs_header_nritems(leaf);
b18c6685
CM
1889 data_end = leaf_data_end(root, leaf);
1890
1891 slot = path->slots[0];
5f39d397
CM
1892 old_data_start = btrfs_item_offset_nr(leaf, slot);
1893 old_size = btrfs_item_size_nr(leaf, slot);
b18c6685
CM
1894 BUG_ON(old_size <= new_size);
1895 size_diff = old_size - new_size;
1896
1897 BUG_ON(slot < 0);
1898 BUG_ON(slot >= nritems);
1899
1900 /*
1901 * item0..itemN ... dataN.offset..dataN.size .. data0.size
1902 */
1903 /* first correct the data pointers */
1904 for (i = slot; i < nritems; i++) {
5f39d397
CM
1905 u32 ioff;
1906 item = btrfs_item_nr(leaf, i);
1907 ioff = btrfs_item_offset(leaf, item);
1908 btrfs_set_item_offset(leaf, item, ioff + size_diff);
b18c6685
CM
1909 }
1910 /* shift the data */
5f39d397 1911 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
b18c6685
CM
1912 data_end + size_diff, btrfs_leaf_data(leaf) +
1913 data_end, old_data_start + new_size - data_end);
5f39d397
CM
1914
1915 item = btrfs_item_nr(leaf, slot);
1916 btrfs_set_item_size(leaf, item, new_size);
1917 btrfs_mark_buffer_dirty(leaf);
b18c6685
CM
1918
1919 ret = 0;
5f39d397
CM
1920 if (btrfs_leaf_free_space(root, leaf) < 0) {
1921 btrfs_print_leaf(root, leaf);
b18c6685 1922 BUG();
5f39d397 1923 }
b18c6685
CM
1924 check_leaf(root, path, 0);
1925 return ret;
1926}
1927
5f39d397
CM
1928int btrfs_extend_item(struct btrfs_trans_handle *trans,
1929 struct btrfs_root *root, struct btrfs_path *path,
1930 u32 data_size)
6567e837
CM
1931{
1932 int ret = 0;
1933 int slot;
1934 int slot_orig;
5f39d397
CM
1935 struct extent_buffer *leaf;
1936 struct btrfs_item *item;
6567e837
CM
1937 u32 nritems;
1938 unsigned int data_end;
1939 unsigned int old_data;
1940 unsigned int old_size;
1941 int i;
1942
1943 slot_orig = path->slots[0];
5f39d397 1944 leaf = path->nodes[0];
6567e837 1945
5f39d397 1946 nritems = btrfs_header_nritems(leaf);
6567e837
CM
1947 data_end = leaf_data_end(root, leaf);
1948
5f39d397
CM
1949 if (btrfs_leaf_free_space(root, leaf) < data_size) {
1950 btrfs_print_leaf(root, leaf);
6567e837 1951 BUG();
5f39d397 1952 }
6567e837 1953 slot = path->slots[0];
5f39d397 1954 old_data = btrfs_item_end_nr(leaf, slot);
6567e837
CM
1955
1956 BUG_ON(slot < 0);
1957 BUG_ON(slot >= nritems);
1958
1959 /*
1960 * item0..itemN ... dataN.offset..dataN.size .. data0.size
1961 */
1962 /* first correct the data pointers */
1963 for (i = slot; i < nritems; i++) {
5f39d397
CM
1964 u32 ioff;
1965 item = btrfs_item_nr(leaf, i);
1966 ioff = btrfs_item_offset(leaf, item);
1967 btrfs_set_item_offset(leaf, item, ioff - data_size);
6567e837 1968 }
5f39d397 1969
6567e837 1970 /* shift the data */
5f39d397 1971 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
6567e837
CM
1972 data_end - data_size, btrfs_leaf_data(leaf) +
1973 data_end, old_data - data_end);
5f39d397 1974
6567e837 1975 data_end = old_data;
5f39d397
CM
1976 old_size = btrfs_item_size_nr(leaf, slot);
1977 item = btrfs_item_nr(leaf, slot);
1978 btrfs_set_item_size(leaf, item, old_size + data_size);
1979 btrfs_mark_buffer_dirty(leaf);
6567e837
CM
1980
1981 ret = 0;
5f39d397
CM
1982 if (btrfs_leaf_free_space(root, leaf) < 0) {
1983 btrfs_print_leaf(root, leaf);
6567e837 1984 BUG();
5f39d397 1985 }
6567e837
CM
1986 check_leaf(root, path, 0);
1987 return ret;
1988}
1989
74123bd7
CM
1990/*
1991 * Given a key and some data, insert an item into the tree.
1992 * This does all the path init required, making room in the tree if needed.
1993 */
5f39d397
CM
1994int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,
1995 struct btrfs_root *root,
1996 struct btrfs_path *path,
1997 struct btrfs_key *cpu_key, u32 data_size)
be0e5c09 1998{
5f39d397
CM
1999 struct extent_buffer *leaf;
2000 struct btrfs_item *item;
aa5d6bed 2001 int ret = 0;
be0e5c09 2002 int slot;
eb60ceac 2003 int slot_orig;
7518a238 2004 u32 nritems;
be0e5c09 2005 unsigned int data_end;
e2fa7227
CM
2006 struct btrfs_disk_key disk_key;
2007
2008 btrfs_cpu_key_to_disk(&disk_key, cpu_key);
be0e5c09 2009
74123bd7 2010 /* create a root if there isn't one */
5c680ed6 2011 if (!root->node)
cfaa7295 2012 BUG();
5f39d397 2013
e089f05c 2014 ret = btrfs_search_slot(trans, root, cpu_key, path, data_size, 1);
eb60ceac 2015 if (ret == 0) {
f0930a37 2016 return -EEXIST;
aa5d6bed 2017 }
ed2ff2cb
CM
2018 if (ret < 0)
2019 goto out;
be0e5c09 2020
62e2749e 2021 slot_orig = path->slots[0];
5f39d397 2022 leaf = path->nodes[0];
74123bd7 2023
5f39d397 2024 nritems = btrfs_header_nritems(leaf);
123abc88 2025 data_end = leaf_data_end(root, leaf);
eb60ceac 2026
123abc88 2027 if (btrfs_leaf_free_space(root, leaf) <
d4dbff95 2028 sizeof(struct btrfs_item) + data_size) {
be0e5c09 2029 BUG();
d4dbff95 2030 }
5f39d397 2031
62e2749e 2032 slot = path->slots[0];
eb60ceac 2033 BUG_ON(slot < 0);
5f39d397 2034
be0e5c09
CM
2035 if (slot != nritems) {
2036 int i;
5f39d397 2037 unsigned int old_data = btrfs_item_end_nr(leaf, slot);
be0e5c09 2038
5f39d397
CM
2039 if (old_data < data_end) {
2040 btrfs_print_leaf(root, leaf);
2041 printk("slot %d old_data %d data_end %d\n",
2042 slot, old_data, data_end);
2043 BUG_ON(1);
2044 }
be0e5c09
CM
2045 /*
2046 * item0..itemN ... dataN.offset..dataN.size .. data0.size
2047 */
2048 /* first correct the data pointers */
0783fcfc 2049 for (i = slot; i < nritems; i++) {
5f39d397
CM
2050 u32 ioff;
2051 item = btrfs_item_nr(leaf, i);
2052 ioff = btrfs_item_offset(leaf, item);
2053 btrfs_set_item_offset(leaf, item, ioff - data_size);
0783fcfc 2054 }
be0e5c09
CM
2055
2056 /* shift the items */
5f39d397
CM
2057 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + 1),
2058 btrfs_item_nr_offset(slot),
d6025579 2059 (nritems - slot) * sizeof(struct btrfs_item));
be0e5c09
CM
2060
2061 /* shift the data */
5f39d397 2062 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
d6025579
CM
2063 data_end - data_size, btrfs_leaf_data(leaf) +
2064 data_end, old_data - data_end);
be0e5c09
CM
2065 data_end = old_data;
2066 }
5f39d397 2067
62e2749e 2068 /* setup the item for the new data */
5f39d397
CM
2069 btrfs_set_item_key(leaf, &disk_key, slot);
2070 item = btrfs_item_nr(leaf, slot);
2071 btrfs_set_item_offset(leaf, item, data_end - data_size);
2072 btrfs_set_item_size(leaf, item, data_size);
2073 btrfs_set_header_nritems(leaf, nritems + 1);
2074 btrfs_mark_buffer_dirty(leaf);
aa5d6bed
CM
2075
2076 ret = 0;
8e19f2cd 2077 if (slot == 0)
e089f05c 2078 ret = fixup_low_keys(trans, root, path, &disk_key, 1);
aa5d6bed 2079
5f39d397
CM
2080 if (btrfs_leaf_free_space(root, leaf) < 0) {
2081 btrfs_print_leaf(root, leaf);
be0e5c09 2082 BUG();
5f39d397 2083 }
62e2749e 2084 check_leaf(root, path, 0);
ed2ff2cb 2085out:
62e2749e
CM
2086 return ret;
2087}
2088
2089/*
2090 * Given a key and some data, insert an item into the tree.
2091 * This does all the path init required, making room in the tree if needed.
2092 */
e089f05c
CM
2093int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
2094 *root, struct btrfs_key *cpu_key, void *data, u32
2095 data_size)
62e2749e
CM
2096{
2097 int ret = 0;
2c90e5d6 2098 struct btrfs_path *path;
5f39d397
CM
2099 struct extent_buffer *leaf;
2100 unsigned long ptr;
62e2749e 2101
2c90e5d6
CM
2102 path = btrfs_alloc_path();
2103 BUG_ON(!path);
2c90e5d6 2104 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
62e2749e 2105 if (!ret) {
5f39d397
CM
2106 leaf = path->nodes[0];
2107 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
2108 write_extent_buffer(leaf, data, ptr, data_size);
2109 btrfs_mark_buffer_dirty(leaf);
62e2749e 2110 }
2c90e5d6 2111 btrfs_free_path(path);
aa5d6bed 2112 return ret;
be0e5c09
CM
2113}
2114
74123bd7 2115/*
5de08d7d 2116 * delete the pointer from a given node.
74123bd7
CM
2117 *
2118 * If the delete empties a node, the node is removed from the tree,
2119 * continuing all the way the root if required. The root is converted into
2120 * a leaf if all the nodes are emptied.
2121 */
e089f05c
CM
2122static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
2123 struct btrfs_path *path, int level, int slot)
be0e5c09 2124{
5f39d397 2125 struct extent_buffer *parent = path->nodes[level];
7518a238 2126 u32 nritems;
aa5d6bed 2127 int ret = 0;
bb803951 2128 int wret;
be0e5c09 2129
5f39d397 2130 nritems = btrfs_header_nritems(parent);
bb803951 2131 if (slot != nritems -1) {
5f39d397
CM
2132 memmove_extent_buffer(parent,
2133 btrfs_node_key_ptr_offset(slot),
2134 btrfs_node_key_ptr_offset(slot + 1),
d6025579
CM
2135 sizeof(struct btrfs_key_ptr) *
2136 (nritems - slot - 1));
bb803951 2137 }
7518a238 2138 nritems--;
5f39d397 2139 btrfs_set_header_nritems(parent, nritems);
7518a238 2140 if (nritems == 0 && parent == root->node) {
5f39d397 2141 BUG_ON(btrfs_header_level(root->node) != 1);
bb803951 2142 /* just turn the root into a leaf and break */
5f39d397 2143 btrfs_set_header_level(root->node, 0);
bb803951 2144 } else if (slot == 0) {
5f39d397
CM
2145 struct btrfs_disk_key disk_key;
2146
2147 btrfs_node_key(parent, &disk_key, 0);
2148 wret = fixup_low_keys(trans, root, path, &disk_key, level + 1);
0f70abe2
CM
2149 if (wret)
2150 ret = wret;
be0e5c09 2151 }
d6025579 2152 btrfs_mark_buffer_dirty(parent);
aa5d6bed 2153 return ret;
be0e5c09
CM
2154}
2155
74123bd7
CM
2156/*
2157 * delete the item at the leaf level in path. If that empties
2158 * the leaf, remove it from the tree
2159 */
e089f05c
CM
2160int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
2161 struct btrfs_path *path)
be0e5c09 2162{
be0e5c09 2163 int slot;
5f39d397
CM
2164 struct extent_buffer *leaf;
2165 struct btrfs_item *item;
be0e5c09
CM
2166 int doff;
2167 int dsize;
aa5d6bed
CM
2168 int ret = 0;
2169 int wret;
7518a238 2170 u32 nritems;
be0e5c09 2171
5f39d397 2172 leaf = path->nodes[0];
4920c9ac 2173 slot = path->slots[0];
5f39d397
CM
2174 doff = btrfs_item_offset_nr(leaf, slot);
2175 dsize = btrfs_item_size_nr(leaf, slot);
2176 nritems = btrfs_header_nritems(leaf);
be0e5c09 2177
7518a238 2178 if (slot != nritems - 1) {
be0e5c09 2179 int i;
123abc88 2180 int data_end = leaf_data_end(root, leaf);
5f39d397
CM
2181
2182 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
d6025579
CM
2183 data_end + dsize,
2184 btrfs_leaf_data(leaf) + data_end,
2185 doff - data_end);
5f39d397 2186
0783fcfc 2187 for (i = slot + 1; i < nritems; i++) {
5f39d397
CM
2188 u32 ioff;
2189 item = btrfs_item_nr(leaf, i);
2190 ioff = btrfs_item_offset(leaf, item);
2191 btrfs_set_item_offset(leaf, item, ioff + dsize);
0783fcfc 2192 }
5f39d397
CM
2193 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
2194 btrfs_item_nr_offset(slot + 1),
d6025579
CM
2195 sizeof(struct btrfs_item) *
2196 (nritems - slot - 1));
be0e5c09 2197 }
5f39d397 2198 btrfs_set_header_nritems(leaf, nritems - 1);
7518a238 2199 nritems--;
5f39d397 2200
74123bd7 2201 /* delete the leaf if we've emptied it */
7518a238 2202 if (nritems == 0) {
5f39d397
CM
2203 if (leaf == root->node) {
2204 btrfs_set_header_level(leaf, 0);
9a8dd150 2205 } else {
5f39d397
CM
2206 clean_tree_block(trans, root, leaf);
2207 wait_on_tree_block_writeback(root, leaf);
e089f05c 2208 wret = del_ptr(trans, root, path, 1, path->slots[1]);
aa5d6bed
CM
2209 if (wret)
2210 ret = wret;
e089f05c 2211 wret = btrfs_free_extent(trans, root,
5f39d397
CM
2212 extent_buffer_blocknr(leaf),
2213 1, 1);
0f70abe2
CM
2214 if (wret)
2215 ret = wret;
9a8dd150 2216 }
be0e5c09 2217 } else {
7518a238 2218 int used = leaf_space_used(leaf, 0, nritems);
aa5d6bed 2219 if (slot == 0) {
5f39d397
CM
2220 struct btrfs_disk_key disk_key;
2221
2222 btrfs_item_key(leaf, &disk_key, 0);
e089f05c 2223 wret = fixup_low_keys(trans, root, path,
5f39d397 2224 &disk_key, 1);
aa5d6bed
CM
2225 if (wret)
2226 ret = wret;
2227 }
aa5d6bed 2228
74123bd7 2229 /* delete the leaf if it is mostly empty */
123abc88 2230 if (used < BTRFS_LEAF_DATA_SIZE(root) / 3) {
be0e5c09
CM
2231 /* push_leaf_left fixes the path.
2232 * make sure the path still points to our leaf
2233 * for possible call to del_ptr below
2234 */
4920c9ac 2235 slot = path->slots[1];
5f39d397
CM
2236 extent_buffer_get(leaf);
2237
e089f05c 2238 wret = push_leaf_left(trans, root, path, 1);
54aa1f4d 2239 if (wret < 0 && wret != -ENOSPC)
aa5d6bed 2240 ret = wret;
5f39d397
CM
2241
2242 if (path->nodes[0] == leaf &&
2243 btrfs_header_nritems(leaf)) {
e089f05c 2244 wret = push_leaf_right(trans, root, path, 1);
54aa1f4d 2245 if (wret < 0 && wret != -ENOSPC)
aa5d6bed
CM
2246 ret = wret;
2247 }
5f39d397
CM
2248
2249 if (btrfs_header_nritems(leaf) == 0) {
2250 u64 blocknr = extent_buffer_blocknr(leaf);
2251
2252 clean_tree_block(trans, root, leaf);
2253 wait_on_tree_block_writeback(root, leaf);
2254
e089f05c 2255 wret = del_ptr(trans, root, path, 1, slot);
aa5d6bed
CM
2256 if (wret)
2257 ret = wret;
5f39d397
CM
2258
2259 free_extent_buffer(leaf);
e089f05c
CM
2260 wret = btrfs_free_extent(trans, root, blocknr,
2261 1, 1);
0f70abe2
CM
2262 if (wret)
2263 ret = wret;
5de08d7d 2264 } else {
5f39d397
CM
2265 btrfs_mark_buffer_dirty(leaf);
2266 free_extent_buffer(leaf);
be0e5c09 2267 }
d5719762 2268 } else {
5f39d397 2269 btrfs_mark_buffer_dirty(leaf);
be0e5c09
CM
2270 }
2271 }
aa5d6bed 2272 return ret;
be0e5c09
CM
2273}
2274
97571fd0
CM
2275/*
2276 * walk up the tree as far as required to find the next leaf.
0f70abe2
CM
2277 * returns 0 if it found something or 1 if there are no greater leaves.
2278 * returns < 0 on io errors.
97571fd0 2279 */
234b63a0 2280int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
d97e63b6
CM
2281{
2282 int slot;
2283 int level = 1;
2284 u64 blocknr;
5f39d397
CM
2285 struct extent_buffer *c;
2286 struct extent_buffer *next = NULL;
d97e63b6 2287
234b63a0 2288 while(level < BTRFS_MAX_LEVEL) {
d97e63b6 2289 if (!path->nodes[level])
0f70abe2 2290 return 1;
5f39d397 2291
d97e63b6
CM
2292 slot = path->slots[level] + 1;
2293 c = path->nodes[level];
5f39d397 2294 if (slot >= btrfs_header_nritems(c)) {
d97e63b6
CM
2295 level++;
2296 continue;
2297 }
5f39d397
CM
2298
2299 blocknr = btrfs_node_blockptr(c, slot);
cfaa7295 2300 if (next)
5f39d397
CM
2301 free_extent_buffer(next);
2302
6702ed49
CM
2303 if (path->reada)
2304 reada_for_search(root, path, level, slot);
5f39d397 2305
d97e63b6
CM
2306 next = read_tree_block(root, blocknr);
2307 break;
2308 }
2309 path->slots[level] = slot;
2310 while(1) {
2311 level--;
2312 c = path->nodes[level];
5f39d397 2313 free_extent_buffer(c);
d97e63b6
CM
2314 path->nodes[level] = next;
2315 path->slots[level] = 0;
2316 if (!level)
2317 break;
6702ed49 2318 if (path->reada)
32020611 2319 reada_for_search(root, path, level, 0);
5f39d397 2320 next = read_tree_block(root, btrfs_node_blockptr(next, 0));
d97e63b6
CM
2321 }
2322 return 0;
2323}