Btrfs: Do snapshot deletion in smaller chunks.
[deliverable/linux.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
eb60ceac
CM
19#include "ctree.h"
20#include "disk-io.h"
7f5c1516 21#include "transaction.h"
9a8dd150 22
e089f05c
CM
23static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
24 *root, struct btrfs_path *path, int level);
25static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
d4dbff95
CM
26 *root, struct btrfs_key *ins_key,
27 struct btrfs_path *path, int data_size);
e089f05c 28static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root
e20d96d6 29 *root, struct buffer_head *dst, struct buffer_head
e089f05c
CM
30 *src);
31static int balance_node_right(struct btrfs_trans_handle *trans, struct
e20d96d6
CM
32 btrfs_root *root, struct buffer_head *dst_buf,
33 struct buffer_head *src_buf);
e089f05c
CM
34static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
35 struct btrfs_path *path, int level, int slot);
d97e63b6 36
df24a2b9 37inline void btrfs_init_path(struct btrfs_path *p)
2c90e5d6 38{
df24a2b9 39 memset(p, 0, sizeof(*p));
2c90e5d6
CM
40}
41
df24a2b9 42struct btrfs_path *btrfs_alloc_path(void)
2c90e5d6 43{
df24a2b9
CM
44 struct btrfs_path *path;
45 path = kmem_cache_alloc(btrfs_path_cachep, GFP_NOFS);
46 if (path)
47 btrfs_init_path(path);
48 return path;
2c90e5d6
CM
49}
50
df24a2b9 51void btrfs_free_path(struct btrfs_path *p)
be0e5c09 52{
df24a2b9
CM
53 btrfs_release_path(NULL, p);
54 kmem_cache_free(btrfs_path_cachep, p);
be0e5c09
CM
55}
56
234b63a0 57void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p)
eb60ceac
CM
58{
59 int i;
234b63a0 60 for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
eb60ceac
CM
61 if (!p->nodes[i])
62 break;
234b63a0 63 btrfs_block_release(root, p->nodes[i]);
eb60ceac 64 }
aa5d6bed 65 memset(p, 0, sizeof(*p));
eb60ceac
CM
66}
67
e089f05c 68static int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root
e20d96d6
CM
69 *root, struct buffer_head *buf, struct buffer_head
70 *parent, int parent_slot, struct buffer_head
e089f05c 71 **cow_ret)
02217ed2 72{
e20d96d6
CM
73 struct buffer_head *cow;
74 struct btrfs_node *cow_node;
54aa1f4d 75 int ret;
02217ed2 76
ccd467d6
CM
77 WARN_ON(!buffer_uptodate(buf));
78 if (trans->transaction != root->fs_info->running_transaction) {
79 printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
80 root->fs_info->running_transaction->transid);
81 WARN_ON(1);
82 }
83 if (trans->transid != root->fs_info->generation) {
84 printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
85 root->fs_info->generation);
86 WARN_ON(1);
87 }
7f5c1516
CM
88 if (btrfs_header_generation(btrfs_buffer_header(buf)) ==
89 trans->transid) {
02217ed2
CM
90 *cow_ret = buf;
91 return 0;
92 }
31f3c99b 93 cow = btrfs_alloc_free_block(trans, root, buf->b_blocknr);
54aa1f4d
CM
94 if (IS_ERR(cow))
95 return PTR_ERR(cow);
e20d96d6 96 cow_node = btrfs_buffer_node(cow);
2c90e5d6
CM
97 if (buf->b_size != root->blocksize || cow->b_size != root->blocksize)
98 WARN_ON(1);
e20d96d6 99 memcpy(cow_node, btrfs_buffer_node(buf), root->blocksize);
7eccb903 100 btrfs_set_header_blocknr(&cow_node->header, bh_blocknr(cow));
7f5c1516 101 btrfs_set_header_generation(&cow_node->header, trans->transid);
4d775673 102 btrfs_set_header_owner(&cow_node->header, root->root_key.objectid);
54aa1f4d
CM
103 ret = btrfs_inc_ref(trans, root, buf);
104 if (ret)
105 return ret;
02217ed2
CM
106 if (buf == root->node) {
107 root->node = cow;
e20d96d6 108 get_bh(cow);
2c90e5d6 109 if (buf != root->commit_root) {
7eccb903 110 btrfs_free_extent(trans, root, bh_blocknr(buf), 1, 1);
2c90e5d6 111 }
234b63a0 112 btrfs_block_release(root, buf);
02217ed2 113 } else {
e20d96d6 114 btrfs_set_node_blockptr(btrfs_buffer_node(parent), parent_slot,
7eccb903 115 bh_blocknr(cow));
d6025579 116 btrfs_mark_buffer_dirty(parent);
7eccb903 117 btrfs_free_extent(trans, root, bh_blocknr(buf), 1, 1);
02217ed2 118 }
234b63a0 119 btrfs_block_release(root, buf);
ccd467d6 120 btrfs_mark_buffer_dirty(cow);
2c90e5d6 121 *cow_ret = cow;
02217ed2
CM
122 return 0;
123}
124
74123bd7
CM
125/*
126 * The leaf data grows from end-to-front in the node.
127 * this returns the address of the start of the last item,
128 * which is the stop of the leaf data stack
129 */
123abc88
CM
130static inline unsigned int leaf_data_end(struct btrfs_root *root,
131 struct btrfs_leaf *leaf)
be0e5c09 132{
7518a238 133 u32 nr = btrfs_header_nritems(&leaf->header);
be0e5c09 134 if (nr == 0)
123abc88 135 return BTRFS_LEAF_DATA_SIZE(root);
0783fcfc 136 return btrfs_item_offset(leaf->items + nr - 1);
be0e5c09
CM
137}
138
74123bd7
CM
139/*
140 * compare two keys in a memcmp fashion
141 */
9aca1d51 142static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
be0e5c09 143{
e2fa7227
CM
144 struct btrfs_key k1;
145
146 btrfs_disk_key_to_cpu(&k1, disk);
147
148 if (k1.objectid > k2->objectid)
be0e5c09 149 return 1;
e2fa7227 150 if (k1.objectid < k2->objectid)
be0e5c09 151 return -1;
f254e52c
CM
152 if (k1.flags > k2->flags)
153 return 1;
154 if (k1.flags < k2->flags)
155 return -1;
70b2befd
CM
156 if (k1.offset > k2->offset)
157 return 1;
158 if (k1.offset < k2->offset)
159 return -1;
be0e5c09
CM
160 return 0;
161}
74123bd7 162
123abc88
CM
163static int check_node(struct btrfs_root *root, struct btrfs_path *path,
164 int level)
aa5d6bed 165{
234b63a0 166 struct btrfs_node *parent = NULL;
e20d96d6 167 struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]);
aa5d6bed 168 int parent_slot;
8d7be552
CM
169 int slot;
170 struct btrfs_key cpukey;
7518a238 171 u32 nritems = btrfs_header_nritems(&node->header);
aa5d6bed
CM
172
173 if (path->nodes[level + 1])
e20d96d6 174 parent = btrfs_buffer_node(path->nodes[level + 1]);
a1f39630 175
8d7be552 176 slot = path->slots[level];
7518a238
CM
177 BUG_ON(nritems == 0);
178 if (parent) {
e2fa7227 179 struct btrfs_disk_key *parent_key;
a1f39630
A
180
181 parent_slot = path->slots[level + 1];
123abc88
CM
182 parent_key = &parent->ptrs[parent_slot].key;
183 BUG_ON(memcmp(parent_key, &node->ptrs[0].key,
e2fa7227 184 sizeof(struct btrfs_disk_key)));
1d4f8a0c 185 BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
7518a238 186 btrfs_header_blocknr(&node->header));
aa5d6bed 187 }
123abc88 188 BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root));
8d7be552
CM
189 if (slot != 0) {
190 btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot - 1].key);
191 BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) <= 0);
192 }
193 if (slot < nritems - 1) {
194 btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot + 1].key);
195 BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) >= 0);
aa5d6bed
CM
196 }
197 return 0;
198}
199
123abc88
CM
200static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
201 int level)
aa5d6bed 202{
e20d96d6 203 struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[level]);
234b63a0 204 struct btrfs_node *parent = NULL;
aa5d6bed 205 int parent_slot;
8d7be552
CM
206 int slot = path->slots[0];
207 struct btrfs_key cpukey;
208
7518a238 209 u32 nritems = btrfs_header_nritems(&leaf->header);
aa5d6bed
CM
210
211 if (path->nodes[level + 1])
e20d96d6 212 parent = btrfs_buffer_node(path->nodes[level + 1]);
a1f39630 213
123abc88 214 BUG_ON(btrfs_leaf_free_space(root, leaf) < 0);
7518a238
CM
215
216 if (nritems == 0)
217 return 0;
218
219 if (parent) {
e2fa7227 220 struct btrfs_disk_key *parent_key;
a1f39630
A
221
222 parent_slot = path->slots[level + 1];
123abc88 223 parent_key = &parent->ptrs[parent_slot].key;
aa5d6bed 224 BUG_ON(memcmp(parent_key, &leaf->items[0].key,
e2fa7227 225 sizeof(struct btrfs_disk_key)));
1d4f8a0c 226 BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
7518a238 227 btrfs_header_blocknr(&leaf->header));
aa5d6bed 228 }
8d7be552
CM
229 if (slot != 0) {
230 btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot - 1].key);
231 BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) <= 0);
232 BUG_ON(btrfs_item_offset(leaf->items + slot - 1) !=
233 btrfs_item_end(leaf->items + slot));
234 }
235 if (slot < nritems - 1) {
236 btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot + 1].key);
237 BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) >= 0);
238 BUG_ON(btrfs_item_offset(leaf->items + slot) !=
239 btrfs_item_end(leaf->items + slot + 1));
aa5d6bed 240 }
8d7be552
CM
241 BUG_ON(btrfs_item_offset(leaf->items) +
242 btrfs_item_size(leaf->items) != BTRFS_LEAF_DATA_SIZE(root));
aa5d6bed
CM
243 return 0;
244}
245
123abc88
CM
246static int check_block(struct btrfs_root *root, struct btrfs_path *path,
247 int level)
aa5d6bed 248{
3eb0314d
CM
249 struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]);
250 if (memcmp(node->header.fsid, root->fs_info->disk_super->fsid,
251 sizeof(node->header.fsid)))
252 BUG();
aa5d6bed 253 if (level == 0)
123abc88
CM
254 return check_leaf(root, path, level);
255 return check_node(root, path, level);
aa5d6bed
CM
256}
257
74123bd7
CM
258/*
259 * search for key in the array p. items p are item_size apart
260 * and there are 'max' items in p
261 * the slot in the array is returned via slot, and it points to
262 * the place where you would insert key if it is not found in
263 * the array.
264 *
265 * slot may point to max if the key is bigger than all of the keys
266 */
9aca1d51 267static int generic_bin_search(char *p, int item_size, struct btrfs_key *key,
be0e5c09
CM
268 int max, int *slot)
269{
270 int low = 0;
271 int high = max;
272 int mid;
273 int ret;
e2fa7227 274 struct btrfs_disk_key *tmp;
be0e5c09
CM
275
276 while(low < high) {
277 mid = (low + high) / 2;
e2fa7227 278 tmp = (struct btrfs_disk_key *)(p + mid * item_size);
be0e5c09
CM
279 ret = comp_keys(tmp, key);
280
281 if (ret < 0)
282 low = mid + 1;
283 else if (ret > 0)
284 high = mid;
285 else {
286 *slot = mid;
287 return 0;
288 }
289 }
290 *slot = low;
291 return 1;
292}
293
97571fd0
CM
294/*
295 * simple bin_search frontend that does the right thing for
296 * leaves vs nodes
297 */
9aca1d51 298static int bin_search(struct btrfs_node *c, struct btrfs_key *key, int *slot)
be0e5c09 299{
7518a238 300 if (btrfs_is_leaf(c)) {
234b63a0 301 struct btrfs_leaf *l = (struct btrfs_leaf *)c;
0783fcfc
CM
302 return generic_bin_search((void *)l->items,
303 sizeof(struct btrfs_item),
7518a238
CM
304 key, btrfs_header_nritems(&c->header),
305 slot);
be0e5c09 306 } else {
123abc88
CM
307 return generic_bin_search((void *)c->ptrs,
308 sizeof(struct btrfs_key_ptr),
7518a238
CM
309 key, btrfs_header_nritems(&c->header),
310 slot);
be0e5c09
CM
311 }
312 return -1;
313}
314
e20d96d6
CM
315static struct buffer_head *read_node_slot(struct btrfs_root *root,
316 struct buffer_head *parent_buf,
bb803951
CM
317 int slot)
318{
e20d96d6 319 struct btrfs_node *node = btrfs_buffer_node(parent_buf);
bb803951
CM
320 if (slot < 0)
321 return NULL;
7518a238 322 if (slot >= btrfs_header_nritems(&node->header))
bb803951 323 return NULL;
1d4f8a0c 324 return read_tree_block(root, btrfs_node_blockptr(node, slot));
bb803951
CM
325}
326
e089f05c
CM
327static int balance_level(struct btrfs_trans_handle *trans, struct btrfs_root
328 *root, struct btrfs_path *path, int level)
bb803951 329{
e20d96d6
CM
330 struct buffer_head *right_buf;
331 struct buffer_head *mid_buf;
332 struct buffer_head *left_buf;
333 struct buffer_head *parent_buf = NULL;
234b63a0
CM
334 struct btrfs_node *right = NULL;
335 struct btrfs_node *mid;
336 struct btrfs_node *left = NULL;
337 struct btrfs_node *parent = NULL;
bb803951
CM
338 int ret = 0;
339 int wret;
340 int pslot;
bb803951 341 int orig_slot = path->slots[level];
54aa1f4d 342 int err_on_enospc = 0;
79f95c82 343 u64 orig_ptr;
bb803951
CM
344
345 if (level == 0)
346 return 0;
347
348 mid_buf = path->nodes[level];
e20d96d6 349 mid = btrfs_buffer_node(mid_buf);
1d4f8a0c 350 orig_ptr = btrfs_node_blockptr(mid, orig_slot);
79f95c82 351
234b63a0 352 if (level < BTRFS_MAX_LEVEL - 1)
bb803951
CM
353 parent_buf = path->nodes[level + 1];
354 pslot = path->slots[level + 1];
355
40689478
CM
356 /*
357 * deal with the case where there is only one pointer in the root
358 * by promoting the node below to a root
359 */
bb803951 360 if (!parent_buf) {
e20d96d6 361 struct buffer_head *child;
7eccb903 362 u64 blocknr = bh_blocknr(mid_buf);
bb803951 363
7518a238 364 if (btrfs_header_nritems(&mid->header) != 1)
bb803951
CM
365 return 0;
366
367 /* promote the child to a root */
368 child = read_node_slot(root, mid_buf, 0);
369 BUG_ON(!child);
370 root->node = child;
371 path->nodes[level] = NULL;
d6025579
CM
372 clean_tree_block(trans, root, mid_buf);
373 wait_on_buffer(mid_buf);
bb803951 374 /* once for the path */
234b63a0 375 btrfs_block_release(root, mid_buf);
bb803951 376 /* once for the root ptr */
234b63a0 377 btrfs_block_release(root, mid_buf);
e089f05c 378 return btrfs_free_extent(trans, root, blocknr, 1, 1);
bb803951 379 }
e20d96d6 380 parent = btrfs_buffer_node(parent_buf);
bb803951 381
123abc88
CM
382 if (btrfs_header_nritems(&mid->header) >
383 BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
bb803951
CM
384 return 0;
385
54aa1f4d
CM
386 if (btrfs_header_nritems(&mid->header) < 2)
387 err_on_enospc = 1;
388
bb803951
CM
389 left_buf = read_node_slot(root, parent_buf, pslot - 1);
390 right_buf = read_node_slot(root, parent_buf, pslot + 1);
79f95c82
CM
391
392 /* first, try to make some room in the middle buffer */
bb803951 393 if (left_buf) {
54aa1f4d
CM
394 wret = btrfs_cow_block(trans, root, left_buf,
395 parent_buf, pslot - 1, &left_buf);
396 if (wret) {
397 ret = wret;
398 goto enospc;
399 }
e20d96d6 400 left = btrfs_buffer_node(left_buf);
7518a238 401 orig_slot += btrfs_header_nritems(&left->header);
e089f05c 402 wret = push_node_left(trans, root, left_buf, mid_buf);
79f95c82
CM
403 if (wret < 0)
404 ret = wret;
54aa1f4d
CM
405 if (btrfs_header_nritems(&mid->header) < 2)
406 err_on_enospc = 1;
bb803951 407 }
79f95c82
CM
408
409 /*
410 * then try to empty the right most buffer into the middle
411 */
bb803951 412 if (right_buf) {
54aa1f4d
CM
413 wret = btrfs_cow_block(trans, root, right_buf,
414 parent_buf, pslot + 1, &right_buf);
415 if (wret) {
416 ret = wret;
417 goto enospc;
418 }
419
e20d96d6 420 right = btrfs_buffer_node(right_buf);
e089f05c 421 wret = push_node_left(trans, root, mid_buf, right_buf);
54aa1f4d 422 if (wret < 0 && wret != -ENOSPC)
79f95c82 423 ret = wret;
7518a238 424 if (btrfs_header_nritems(&right->header) == 0) {
7eccb903 425 u64 blocknr = bh_blocknr(right_buf);
e089f05c 426 clean_tree_block(trans, root, right_buf);
d6025579
CM
427 wait_on_buffer(right_buf);
428 btrfs_block_release(root, right_buf);
bb803951
CM
429 right_buf = NULL;
430 right = NULL;
e089f05c
CM
431 wret = del_ptr(trans, root, path, level + 1, pslot +
432 1);
bb803951
CM
433 if (wret)
434 ret = wret;
e089f05c 435 wret = btrfs_free_extent(trans, root, blocknr, 1, 1);
bb803951
CM
436 if (wret)
437 ret = wret;
438 } else {
d6025579
CM
439 btrfs_memcpy(root, parent,
440 &parent->ptrs[pslot + 1].key,
441 &right->ptrs[0].key,
442 sizeof(struct btrfs_disk_key));
443 btrfs_mark_buffer_dirty(parent_buf);
bb803951
CM
444 }
445 }
7518a238 446 if (btrfs_header_nritems(&mid->header) == 1) {
79f95c82
CM
447 /*
448 * we're not allowed to leave a node with one item in the
449 * tree during a delete. A deletion from lower in the tree
450 * could try to delete the only pointer in this node.
451 * So, pull some keys from the left.
452 * There has to be a left pointer at this point because
453 * otherwise we would have pulled some pointers from the
454 * right
455 */
456 BUG_ON(!left_buf);
e089f05c 457 wret = balance_node_right(trans, root, mid_buf, left_buf);
54aa1f4d 458 if (wret < 0) {
79f95c82 459 ret = wret;
54aa1f4d
CM
460 goto enospc;
461 }
79f95c82
CM
462 BUG_ON(wret == 1);
463 }
7518a238 464 if (btrfs_header_nritems(&mid->header) == 0) {
79f95c82 465 /* we've managed to empty the middle node, drop it */
7eccb903 466 u64 blocknr = bh_blocknr(mid_buf);
e089f05c 467 clean_tree_block(trans, root, mid_buf);
d6025579
CM
468 wait_on_buffer(mid_buf);
469 btrfs_block_release(root, mid_buf);
bb803951
CM
470 mid_buf = NULL;
471 mid = NULL;
e089f05c 472 wret = del_ptr(trans, root, path, level + 1, pslot);
bb803951
CM
473 if (wret)
474 ret = wret;
e089f05c 475 wret = btrfs_free_extent(trans, root, blocknr, 1, 1);
bb803951
CM
476 if (wret)
477 ret = wret;
79f95c82
CM
478 } else {
479 /* update the parent key to reflect our changes */
d6025579
CM
480 btrfs_memcpy(root, parent,
481 &parent->ptrs[pslot].key, &mid->ptrs[0].key,
482 sizeof(struct btrfs_disk_key));
483 btrfs_mark_buffer_dirty(parent_buf);
79f95c82 484 }
bb803951 485
79f95c82 486 /* update the path */
bb803951 487 if (left_buf) {
7518a238 488 if (btrfs_header_nritems(&left->header) > orig_slot) {
e20d96d6 489 get_bh(left_buf);
bb803951
CM
490 path->nodes[level] = left_buf;
491 path->slots[level + 1] -= 1;
492 path->slots[level] = orig_slot;
493 if (mid_buf)
234b63a0 494 btrfs_block_release(root, mid_buf);
bb803951 495 } else {
7518a238 496 orig_slot -= btrfs_header_nritems(&left->header);
bb803951
CM
497 path->slots[level] = orig_slot;
498 }
499 }
79f95c82 500 /* double check we haven't messed things up */
123abc88 501 check_block(root, path, level);
e20d96d6
CM
502 if (orig_ptr !=
503 btrfs_node_blockptr(btrfs_buffer_node(path->nodes[level]),
504 path->slots[level]))
79f95c82 505 BUG();
54aa1f4d 506enospc:
bb803951 507 if (right_buf)
234b63a0 508 btrfs_block_release(root, right_buf);
bb803951 509 if (left_buf)
234b63a0 510 btrfs_block_release(root, left_buf);
bb803951
CM
511 return ret;
512}
513
e66f709b
CM
514/* returns zero if the push worked, non-zero otherwise */
515static int push_nodes_for_insert(struct btrfs_trans_handle *trans,
516 struct btrfs_root *root,
517 struct btrfs_path *path, int level)
518{
519 struct buffer_head *right_buf;
520 struct buffer_head *mid_buf;
521 struct buffer_head *left_buf;
522 struct buffer_head *parent_buf = NULL;
523 struct btrfs_node *right = NULL;
524 struct btrfs_node *mid;
525 struct btrfs_node *left = NULL;
526 struct btrfs_node *parent = NULL;
527 int ret = 0;
528 int wret;
529 int pslot;
530 int orig_slot = path->slots[level];
531 u64 orig_ptr;
532
533 if (level == 0)
534 return 1;
535
536 mid_buf = path->nodes[level];
537 mid = btrfs_buffer_node(mid_buf);
538 orig_ptr = btrfs_node_blockptr(mid, orig_slot);
539
540 if (level < BTRFS_MAX_LEVEL - 1)
541 parent_buf = path->nodes[level + 1];
542 pslot = path->slots[level + 1];
543
544 if (!parent_buf)
545 return 1;
546 parent = btrfs_buffer_node(parent_buf);
547
548 left_buf = read_node_slot(root, parent_buf, pslot - 1);
549
550 /* first, try to make some room in the middle buffer */
551 if (left_buf) {
552 u32 left_nr;
e66f709b
CM
553 left = btrfs_buffer_node(left_buf);
554 left_nr = btrfs_header_nritems(&left->header);
33ade1f8
CM
555 if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
556 wret = 1;
557 } else {
54aa1f4d
CM
558 ret = btrfs_cow_block(trans, root, left_buf, parent_buf,
559 pslot - 1, &left_buf);
560 if (ret)
561 wret = 1;
562 else {
563 left = btrfs_buffer_node(left_buf);
564 wret = push_node_left(trans, root,
565 left_buf, mid_buf);
566 }
33ade1f8 567 }
e66f709b
CM
568 if (wret < 0)
569 ret = wret;
570 if (wret == 0) {
571 orig_slot += left_nr;
572 btrfs_memcpy(root, parent,
573 &parent->ptrs[pslot].key,
574 &mid->ptrs[0].key,
575 sizeof(struct btrfs_disk_key));
576 btrfs_mark_buffer_dirty(parent_buf);
577 if (btrfs_header_nritems(&left->header) > orig_slot) {
578 path->nodes[level] = left_buf;
579 path->slots[level + 1] -= 1;
580 path->slots[level] = orig_slot;
581 btrfs_block_release(root, mid_buf);
582 } else {
583 orig_slot -=
584 btrfs_header_nritems(&left->header);
585 path->slots[level] = orig_slot;
586 btrfs_block_release(root, left_buf);
587 }
588 check_node(root, path, level);
589 return 0;
590 }
591 btrfs_block_release(root, left_buf);
592 }
593 right_buf = read_node_slot(root, parent_buf, pslot + 1);
594
595 /*
596 * then try to empty the right most buffer into the middle
597 */
598 if (right_buf) {
33ade1f8 599 u32 right_nr;
e66f709b 600 right = btrfs_buffer_node(right_buf);
33ade1f8
CM
601 right_nr = btrfs_header_nritems(&right->header);
602 if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
603 wret = 1;
604 } else {
54aa1f4d
CM
605 ret = btrfs_cow_block(trans, root, right_buf,
606 parent_buf, pslot + 1,
607 &right_buf);
608 if (ret)
609 wret = 1;
610 else {
611 right = btrfs_buffer_node(right_buf);
612 wret = balance_node_right(trans, root,
613 right_buf, mid_buf);
614 }
33ade1f8 615 }
e66f709b
CM
616 if (wret < 0)
617 ret = wret;
618 if (wret == 0) {
619 btrfs_memcpy(root, parent,
620 &parent->ptrs[pslot + 1].key,
621 &right->ptrs[0].key,
622 sizeof(struct btrfs_disk_key));
623 btrfs_mark_buffer_dirty(parent_buf);
624 if (btrfs_header_nritems(&mid->header) <= orig_slot) {
625 path->nodes[level] = right_buf;
626 path->slots[level + 1] += 1;
627 path->slots[level] = orig_slot -
628 btrfs_header_nritems(&mid->header);
629 btrfs_block_release(root, mid_buf);
630 } else {
631 btrfs_block_release(root, right_buf);
632 }
633 check_node(root, path, level);
634 return 0;
635 }
636 btrfs_block_release(root, right_buf);
637 }
638 check_node(root, path, level);
639 return 1;
640}
641
74123bd7
CM
642/*
643 * look for key in the tree. path is filled in with nodes along the way
644 * if key is found, we return zero and you can find the item in the leaf
645 * level of the path (level 0)
646 *
647 * If the key isn't found, the path points to the slot where it should
aa5d6bed
CM
648 * be inserted, and 1 is returned. If there are other errors during the
649 * search a negative error number is returned.
97571fd0
CM
650 *
651 * if ins_len > 0, nodes and leaves will be split as we walk down the
652 * tree. if ins_len < 0, nodes will be merged as we walk down the tree (if
653 * possible)
74123bd7 654 */
e089f05c
CM
655int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
656 *root, struct btrfs_key *key, struct btrfs_path *p, int
657 ins_len, int cow)
be0e5c09 658{
e20d96d6
CM
659 struct buffer_head *b;
660 struct buffer_head *cow_buf;
234b63a0 661 struct btrfs_node *c;
9f3a7427 662 struct btrfs_root_item *root_item = &root->root_item;
be0e5c09
CM
663 int slot;
664 int ret;
665 int level;
9f3a7427
CM
666 u8 lowest_level = 0;
667
668 if (btrfs_root_refs(root_item) == 0 && root->ref_cows) {
669 lowest_level = root_item->drop_level;
670 WARN_ON(ins_len || cow);
671 }
5c680ed6 672
22b0ebda
CM
673 WARN_ON(p->nodes[0] != NULL);
674 WARN_ON(!mutex_is_locked(&root->fs_info->fs_mutex));
bb803951
CM
675again:
676 b = root->node;
e20d96d6 677 get_bh(b);
eb60ceac 678 while (b) {
e20d96d6
CM
679 c = btrfs_buffer_node(b);
680 level = btrfs_header_level(&c->header);
02217ed2
CM
681 if (cow) {
682 int wret;
e20d96d6
CM
683 wret = btrfs_cow_block(trans, root, b,
684 p->nodes[level + 1],
685 p->slots[level + 1],
e089f05c 686 &cow_buf);
54aa1f4d
CM
687 if (wret) {
688 btrfs_block_release(root, cow_buf);
689 return wret;
690 }
02217ed2 691 b = cow_buf;
2c90e5d6 692 c = btrfs_buffer_node(b);
02217ed2
CM
693 }
694 BUG_ON(!cow && ins_len);
2c90e5d6
CM
695 if (level != btrfs_header_level(&c->header))
696 WARN_ON(1);
697 level = btrfs_header_level(&c->header);
eb60ceac 698 p->nodes[level] = b;
123abc88 699 ret = check_block(root, p, level);
aa5d6bed
CM
700 if (ret)
701 return -1;
be0e5c09 702 ret = bin_search(c, key, &slot);
7518a238 703 if (!btrfs_is_leaf(c)) {
be0e5c09
CM
704 if (ret && slot > 0)
705 slot -= 1;
706 p->slots[level] = slot;
d4dbff95
CM
707 if (ins_len > 0 && btrfs_header_nritems(&c->header) >=
708 BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
e089f05c 709 int sret = split_node(trans, root, p, level);
5c680ed6
CM
710 BUG_ON(sret > 0);
711 if (sret)
712 return sret;
713 b = p->nodes[level];
e20d96d6 714 c = btrfs_buffer_node(b);
5c680ed6 715 slot = p->slots[level];
bb803951 716 } else if (ins_len < 0) {
e089f05c
CM
717 int sret = balance_level(trans, root, p,
718 level);
bb803951
CM
719 if (sret)
720 return sret;
721 b = p->nodes[level];
722 if (!b)
723 goto again;
e20d96d6 724 c = btrfs_buffer_node(b);
bb803951 725 slot = p->slots[level];
7518a238 726 BUG_ON(btrfs_header_nritems(&c->header) == 1);
5c680ed6 727 }
9f3a7427
CM
728 /* this is only true while dropping a snapshot */
729 if (level == lowest_level)
730 break;
1d4f8a0c 731 b = read_tree_block(root, btrfs_node_blockptr(c, slot));
be0e5c09 732 } else {
234b63a0 733 struct btrfs_leaf *l = (struct btrfs_leaf *)c;
be0e5c09 734 p->slots[level] = slot;
123abc88 735 if (ins_len > 0 && btrfs_leaf_free_space(root, l) <
0783fcfc 736 sizeof(struct btrfs_item) + ins_len) {
d4dbff95
CM
737 int sret = split_leaf(trans, root, key,
738 p, ins_len);
5c680ed6
CM
739 BUG_ON(sret > 0);
740 if (sret)
741 return sret;
742 }
be0e5c09
CM
743 return ret;
744 }
745 }
aa5d6bed 746 return 1;
be0e5c09
CM
747}
748
74123bd7
CM
749/*
750 * adjust the pointers going up the tree, starting at level
751 * making sure the right key of each node is points to 'key'.
752 * This is used after shifting pointers to the left, so it stops
753 * fixing up pointers when a given leaf/node is not in slot 0 of the
754 * higher levels
aa5d6bed
CM
755 *
756 * If this fails to write a tree block, it returns -1, but continues
757 * fixing up the blocks in ram so the tree is consistent.
74123bd7 758 */
e089f05c
CM
759static int fixup_low_keys(struct btrfs_trans_handle *trans, struct btrfs_root
760 *root, struct btrfs_path *path, struct btrfs_disk_key
761 *key, int level)
be0e5c09
CM
762{
763 int i;
aa5d6bed 764 int ret = 0;
234b63a0
CM
765 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
766 struct btrfs_node *t;
be0e5c09 767 int tslot = path->slots[i];
eb60ceac 768 if (!path->nodes[i])
be0e5c09 769 break;
e20d96d6 770 t = btrfs_buffer_node(path->nodes[i]);
d6025579
CM
771 btrfs_memcpy(root, t, &t->ptrs[tslot].key, key, sizeof(*key));
772 btrfs_mark_buffer_dirty(path->nodes[i]);
be0e5c09
CM
773 if (tslot != 0)
774 break;
775 }
aa5d6bed 776 return ret;
be0e5c09
CM
777}
778
74123bd7
CM
779/*
780 * try to push data from one node into the next node left in the
79f95c82 781 * tree.
aa5d6bed
CM
782 *
783 * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
784 * error, and > 0 if there was no room in the left hand block.
74123bd7 785 */
e089f05c 786static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root
e20d96d6
CM
787 *root, struct buffer_head *dst_buf, struct
788 buffer_head *src_buf)
be0e5c09 789{
e20d96d6
CM
790 struct btrfs_node *src = btrfs_buffer_node(src_buf);
791 struct btrfs_node *dst = btrfs_buffer_node(dst_buf);
be0e5c09 792 int push_items = 0;
bb803951
CM
793 int src_nritems;
794 int dst_nritems;
aa5d6bed 795 int ret = 0;
be0e5c09 796
7518a238
CM
797 src_nritems = btrfs_header_nritems(&src->header);
798 dst_nritems = btrfs_header_nritems(&dst->header);
123abc88 799 push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
54aa1f4d 800
eb60ceac 801 if (push_items <= 0) {
be0e5c09 802 return 1;
eb60ceac 803 }
be0e5c09 804
bb803951 805 if (src_nritems < push_items)
79f95c82
CM
806 push_items = src_nritems;
807
d6025579
CM
808 btrfs_memcpy(root, dst, dst->ptrs + dst_nritems, src->ptrs,
809 push_items * sizeof(struct btrfs_key_ptr));
bb803951 810 if (push_items < src_nritems) {
d6025579 811 btrfs_memmove(root, src, src->ptrs, src->ptrs + push_items,
e2fa7227 812 (src_nritems - push_items) *
123abc88 813 sizeof(struct btrfs_key_ptr));
bb803951 814 }
7518a238
CM
815 btrfs_set_header_nritems(&src->header, src_nritems - push_items);
816 btrfs_set_header_nritems(&dst->header, dst_nritems + push_items);
d6025579
CM
817 btrfs_mark_buffer_dirty(src_buf);
818 btrfs_mark_buffer_dirty(dst_buf);
79f95c82
CM
819 return ret;
820}
821
822/*
823 * try to push data from one node into the next node right in the
824 * tree.
825 *
826 * returns 0 if some ptrs were pushed, < 0 if there was some horrible
827 * error, and > 0 if there was no room in the right hand block.
828 *
829 * this will only push up to 1/2 the contents of the left node over
830 */
e089f05c 831static int balance_node_right(struct btrfs_trans_handle *trans, struct
e20d96d6
CM
832 btrfs_root *root, struct buffer_head *dst_buf,
833 struct buffer_head *src_buf)
79f95c82 834{
e20d96d6
CM
835 struct btrfs_node *src = btrfs_buffer_node(src_buf);
836 struct btrfs_node *dst = btrfs_buffer_node(dst_buf);
79f95c82
CM
837 int push_items = 0;
838 int max_push;
839 int src_nritems;
840 int dst_nritems;
841 int ret = 0;
79f95c82 842
7518a238
CM
843 src_nritems = btrfs_header_nritems(&src->header);
844 dst_nritems = btrfs_header_nritems(&dst->header);
123abc88 845 push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
79f95c82
CM
846 if (push_items <= 0) {
847 return 1;
848 }
849
850 max_push = src_nritems / 2 + 1;
851 /* don't try to empty the node */
852 if (max_push > src_nritems)
853 return 1;
854 if (max_push < push_items)
855 push_items = max_push;
856
d6025579
CM
857 btrfs_memmove(root, dst, dst->ptrs + push_items, dst->ptrs,
858 dst_nritems * sizeof(struct btrfs_key_ptr));
859
860 btrfs_memcpy(root, dst, dst->ptrs,
861 src->ptrs + src_nritems - push_items,
862 push_items * sizeof(struct btrfs_key_ptr));
79f95c82 863
7518a238
CM
864 btrfs_set_header_nritems(&src->header, src_nritems - push_items);
865 btrfs_set_header_nritems(&dst->header, dst_nritems + push_items);
79f95c82 866
d6025579
CM
867 btrfs_mark_buffer_dirty(src_buf);
868 btrfs_mark_buffer_dirty(dst_buf);
aa5d6bed 869 return ret;
be0e5c09
CM
870}
871
97571fd0
CM
872/*
873 * helper function to insert a new root level in the tree.
874 * A new node is allocated, and a single item is inserted to
875 * point to the existing root
aa5d6bed
CM
876 *
877 * returns zero on success or < 0 on failure.
97571fd0 878 */
e089f05c
CM
879static int insert_new_root(struct btrfs_trans_handle *trans, struct btrfs_root
880 *root, struct btrfs_path *path, int level)
5c680ed6 881{
e20d96d6 882 struct buffer_head *t;
234b63a0
CM
883 struct btrfs_node *lower;
884 struct btrfs_node *c;
e2fa7227 885 struct btrfs_disk_key *lower_key;
5c680ed6
CM
886
887 BUG_ON(path->nodes[level]);
888 BUG_ON(path->nodes[level-1] != root->node);
889
31f3c99b 890 t = btrfs_alloc_free_block(trans, root, root->node->b_blocknr);
54aa1f4d
CM
891 if (IS_ERR(t))
892 return PTR_ERR(t);
e20d96d6 893 c = btrfs_buffer_node(t);
123abc88 894 memset(c, 0, root->blocksize);
7518a238
CM
895 btrfs_set_header_nritems(&c->header, 1);
896 btrfs_set_header_level(&c->header, level);
7eccb903 897 btrfs_set_header_blocknr(&c->header, bh_blocknr(t));
7f5c1516 898 btrfs_set_header_generation(&c->header, trans->transid);
4d775673 899 btrfs_set_header_owner(&c->header, root->root_key.objectid);
e20d96d6 900 lower = btrfs_buffer_node(path->nodes[level-1]);
3eb0314d
CM
901 memcpy(c->header.fsid, root->fs_info->disk_super->fsid,
902 sizeof(c->header.fsid));
7518a238 903 if (btrfs_is_leaf(lower))
234b63a0 904 lower_key = &((struct btrfs_leaf *)lower)->items[0].key;
5c680ed6 905 else
123abc88 906 lower_key = &lower->ptrs[0].key;
d6025579
CM
907 btrfs_memcpy(root, c, &c->ptrs[0].key, lower_key,
908 sizeof(struct btrfs_disk_key));
7eccb903 909 btrfs_set_node_blockptr(c, 0, bh_blocknr(path->nodes[level - 1]));
d5719762 910
d6025579 911 btrfs_mark_buffer_dirty(t);
d5719762 912
5c680ed6 913 /* the super has an extra ref to root->node */
234b63a0 914 btrfs_block_release(root, root->node);
5c680ed6 915 root->node = t;
e20d96d6 916 get_bh(t);
5c680ed6
CM
917 path->nodes[level] = t;
918 path->slots[level] = 0;
919 return 0;
920}
921
74123bd7
CM
922/*
923 * worker function to insert a single pointer in a node.
924 * the node should have enough room for the pointer already
97571fd0 925 *
74123bd7
CM
926 * slot and level indicate where you want the key to go, and
927 * blocknr is the block the key points to.
aa5d6bed
CM
928 *
929 * returns zero on success and < 0 on any error
74123bd7 930 */
e089f05c
CM
931static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
932 *root, struct btrfs_path *path, struct btrfs_disk_key
933 *key, u64 blocknr, int slot, int level)
74123bd7 934{
234b63a0 935 struct btrfs_node *lower;
74123bd7 936 int nritems;
5c680ed6
CM
937
938 BUG_ON(!path->nodes[level]);
e20d96d6 939 lower = btrfs_buffer_node(path->nodes[level]);
7518a238 940 nritems = btrfs_header_nritems(&lower->header);
74123bd7
CM
941 if (slot > nritems)
942 BUG();
123abc88 943 if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
74123bd7
CM
944 BUG();
945 if (slot != nritems) {
d6025579
CM
946 btrfs_memmove(root, lower, lower->ptrs + slot + 1,
947 lower->ptrs + slot,
948 (nritems - slot) * sizeof(struct btrfs_key_ptr));
74123bd7 949 }
d6025579
CM
950 btrfs_memcpy(root, lower, &lower->ptrs[slot].key,
951 key, sizeof(struct btrfs_disk_key));
1d4f8a0c 952 btrfs_set_node_blockptr(lower, slot, blocknr);
7518a238 953 btrfs_set_header_nritems(&lower->header, nritems + 1);
d6025579 954 btrfs_mark_buffer_dirty(path->nodes[level]);
098f59c2 955 check_node(root, path, level);
74123bd7
CM
956 return 0;
957}
958
97571fd0
CM
959/*
960 * split the node at the specified level in path in two.
961 * The path is corrected to point to the appropriate node after the split
962 *
963 * Before splitting this tries to make some room in the node by pushing
964 * left and right, if either one works, it returns right away.
aa5d6bed
CM
965 *
966 * returns 0 on success and < 0 on failure
97571fd0 967 */
e089f05c
CM
968static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
969 *root, struct btrfs_path *path, int level)
be0e5c09 970{
e20d96d6 971 struct buffer_head *t;
234b63a0 972 struct btrfs_node *c;
e20d96d6 973 struct buffer_head *split_buffer;
234b63a0 974 struct btrfs_node *split;
be0e5c09 975 int mid;
5c680ed6 976 int ret;
aa5d6bed 977 int wret;
7518a238 978 u32 c_nritems;
eb60ceac 979
5c680ed6 980 t = path->nodes[level];
e20d96d6 981 c = btrfs_buffer_node(t);
5c680ed6
CM
982 if (t == root->node) {
983 /* trying to split the root, lets make a new one */
e089f05c 984 ret = insert_new_root(trans, root, path, level + 1);
5c680ed6
CM
985 if (ret)
986 return ret;
e66f709b
CM
987 } else {
988 ret = push_nodes_for_insert(trans, root, path, level);
989 t = path->nodes[level];
990 c = btrfs_buffer_node(t);
991 if (!ret &&
992 btrfs_header_nritems(&c->header) <
993 BTRFS_NODEPTRS_PER_BLOCK(root) - 1)
994 return 0;
54aa1f4d
CM
995 if (ret < 0)
996 return ret;
be0e5c09 997 }
e66f709b 998
7518a238 999 c_nritems = btrfs_header_nritems(&c->header);
31f3c99b 1000 split_buffer = btrfs_alloc_free_block(trans, root, t->b_blocknr);
54aa1f4d
CM
1001 if (IS_ERR(split_buffer))
1002 return PTR_ERR(split_buffer);
1003
e20d96d6 1004 split = btrfs_buffer_node(split_buffer);
7518a238 1005 btrfs_set_header_flags(&split->header, btrfs_header_flags(&c->header));
9a6f11ed 1006 btrfs_set_header_level(&split->header, btrfs_header_level(&c->header));
7eccb903 1007 btrfs_set_header_blocknr(&split->header, bh_blocknr(split_buffer));
7f5c1516 1008 btrfs_set_header_generation(&split->header, trans->transid);
4d775673 1009 btrfs_set_header_owner(&split->header, root->root_key.objectid);
3eb0314d
CM
1010 memcpy(split->header.fsid, root->fs_info->disk_super->fsid,
1011 sizeof(split->header.fsid));
7518a238 1012 mid = (c_nritems + 1) / 2;
d6025579
CM
1013 btrfs_memcpy(root, split, split->ptrs, c->ptrs + mid,
1014 (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
7518a238
CM
1015 btrfs_set_header_nritems(&split->header, c_nritems - mid);
1016 btrfs_set_header_nritems(&c->header, mid);
aa5d6bed
CM
1017 ret = 0;
1018
d6025579
CM
1019 btrfs_mark_buffer_dirty(t);
1020 btrfs_mark_buffer_dirty(split_buffer);
e089f05c 1021 wret = insert_ptr(trans, root, path, &split->ptrs[0].key,
7eccb903 1022 bh_blocknr(split_buffer), path->slots[level + 1] + 1,
123abc88 1023 level + 1);
aa5d6bed
CM
1024 if (wret)
1025 ret = wret;
1026
5de08d7d 1027 if (path->slots[level] >= mid) {
5c680ed6 1028 path->slots[level] -= mid;
234b63a0 1029 btrfs_block_release(root, t);
5c680ed6
CM
1030 path->nodes[level] = split_buffer;
1031 path->slots[level + 1] += 1;
1032 } else {
234b63a0 1033 btrfs_block_release(root, split_buffer);
be0e5c09 1034 }
aa5d6bed 1035 return ret;
be0e5c09
CM
1036}
1037
74123bd7
CM
1038/*
1039 * how many bytes are required to store the items in a leaf. start
1040 * and nr indicate which items in the leaf to check. This totals up the
1041 * space used both by the item structs and the item data
1042 */
234b63a0 1043static int leaf_space_used(struct btrfs_leaf *l, int start, int nr)
be0e5c09
CM
1044{
1045 int data_len;
d4dbff95
CM
1046 int nritems = btrfs_header_nritems(&l->header);
1047 int end = min(nritems, start + nr) - 1;
be0e5c09
CM
1048
1049 if (!nr)
1050 return 0;
0783fcfc
CM
1051 data_len = btrfs_item_end(l->items + start);
1052 data_len = data_len - btrfs_item_offset(l->items + end);
1053 data_len += sizeof(struct btrfs_item) * nr;
d4dbff95 1054 WARN_ON(data_len < 0);
be0e5c09
CM
1055 return data_len;
1056}
1057
d4dbff95
CM
1058/*
1059 * The space between the end of the leaf items and
1060 * the start of the leaf data. IOW, how much room
1061 * the leaf has left for both items and data
1062 */
1063int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf)
1064{
1065 int nritems = btrfs_header_nritems(&leaf->header);
1066 return BTRFS_LEAF_DATA_SIZE(root) - leaf_space_used(leaf, 0, nritems);
1067}
1068
00ec4c51
CM
1069/*
1070 * push some data in the path leaf to the right, trying to free up at
1071 * least data_size bytes. returns zero if the push worked, nonzero otherwise
aa5d6bed
CM
1072 *
1073 * returns 1 if the push failed because the other node didn't have enough
1074 * room, 0 if everything worked out and < 0 if there were major errors.
00ec4c51 1075 */
e089f05c
CM
1076static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
1077 *root, struct btrfs_path *path, int data_size)
00ec4c51 1078{
e20d96d6
CM
1079 struct buffer_head *left_buf = path->nodes[0];
1080 struct btrfs_leaf *left = btrfs_buffer_leaf(left_buf);
234b63a0 1081 struct btrfs_leaf *right;
e20d96d6
CM
1082 struct buffer_head *right_buf;
1083 struct buffer_head *upper;
1084 struct btrfs_node *upper_node;
00ec4c51
CM
1085 int slot;
1086 int i;
1087 int free_space;
1088 int push_space = 0;
1089 int push_items = 0;
0783fcfc 1090 struct btrfs_item *item;
7518a238
CM
1091 u32 left_nritems;
1092 u32 right_nritems;
54aa1f4d 1093 int ret;
00ec4c51
CM
1094
1095 slot = path->slots[1];
1096 if (!path->nodes[1]) {
1097 return 1;
1098 }
1099 upper = path->nodes[1];
e20d96d6
CM
1100 upper_node = btrfs_buffer_node(upper);
1101 if (slot >= btrfs_header_nritems(&upper_node->header) - 1) {
00ec4c51
CM
1102 return 1;
1103 }
e20d96d6
CM
1104 right_buf = read_tree_block(root,
1105 btrfs_node_blockptr(btrfs_buffer_node(upper), slot + 1));
1106 right = btrfs_buffer_leaf(right_buf);
123abc88 1107 free_space = btrfs_leaf_free_space(root, right);
0783fcfc 1108 if (free_space < data_size + sizeof(struct btrfs_item)) {
234b63a0 1109 btrfs_block_release(root, right_buf);
00ec4c51
CM
1110 return 1;
1111 }
02217ed2 1112 /* cow and double check */
54aa1f4d
CM
1113 ret = btrfs_cow_block(trans, root, right_buf, upper,
1114 slot + 1, &right_buf);
1115 if (ret) {
1116 btrfs_block_release(root, right_buf);
1117 return 1;
1118 }
e20d96d6 1119 right = btrfs_buffer_leaf(right_buf);
123abc88 1120 free_space = btrfs_leaf_free_space(root, right);
0783fcfc 1121 if (free_space < data_size + sizeof(struct btrfs_item)) {
234b63a0 1122 btrfs_block_release(root, right_buf);
02217ed2
CM
1123 return 1;
1124 }
1125
7518a238 1126 left_nritems = btrfs_header_nritems(&left->header);
a429e513
CM
1127 if (left_nritems == 0) {
1128 btrfs_block_release(root, right_buf);
1129 return 1;
1130 }
1131 for (i = left_nritems - 1; i >= 1; i--) {
00ec4c51
CM
1132 item = left->items + i;
1133 if (path->slots[0] == i)
1134 push_space += data_size + sizeof(*item);
0783fcfc
CM
1135 if (btrfs_item_size(item) + sizeof(*item) + push_space >
1136 free_space)
00ec4c51
CM
1137 break;
1138 push_items++;
0783fcfc 1139 push_space += btrfs_item_size(item) + sizeof(*item);
00ec4c51
CM
1140 }
1141 if (push_items == 0) {
234b63a0 1142 btrfs_block_release(root, right_buf);
00ec4c51
CM
1143 return 1;
1144 }
a429e513
CM
1145 if (push_items == left_nritems)
1146 WARN_ON(1);
7518a238 1147 right_nritems = btrfs_header_nritems(&right->header);
00ec4c51 1148 /* push left to right */
0783fcfc 1149 push_space = btrfs_item_end(left->items + left_nritems - push_items);
123abc88 1150 push_space -= leaf_data_end(root, left);
00ec4c51 1151 /* make room in the right data area */
d6025579
CM
1152 btrfs_memmove(root, right, btrfs_leaf_data(right) +
1153 leaf_data_end(root, right) - push_space,
1154 btrfs_leaf_data(right) +
1155 leaf_data_end(root, right), BTRFS_LEAF_DATA_SIZE(root) -
1156 leaf_data_end(root, right));
00ec4c51 1157 /* copy from the left data area */
d6025579
CM
1158 btrfs_memcpy(root, right, btrfs_leaf_data(right) +
1159 BTRFS_LEAF_DATA_SIZE(root) - push_space,
1160 btrfs_leaf_data(left) + leaf_data_end(root, left),
1161 push_space);
1162 btrfs_memmove(root, right, right->items + push_items, right->items,
0783fcfc 1163 right_nritems * sizeof(struct btrfs_item));
00ec4c51 1164 /* copy the items from left to right */
d6025579
CM
1165 btrfs_memcpy(root, right, right->items, left->items +
1166 left_nritems - push_items,
1167 push_items * sizeof(struct btrfs_item));
00ec4c51
CM
1168
1169 /* update the item pointers */
7518a238
CM
1170 right_nritems += push_items;
1171 btrfs_set_header_nritems(&right->header, right_nritems);
123abc88 1172 push_space = BTRFS_LEAF_DATA_SIZE(root);
7518a238 1173 for (i = 0; i < right_nritems; i++) {
0783fcfc
CM
1174 btrfs_set_item_offset(right->items + i, push_space -
1175 btrfs_item_size(right->items + i));
1176 push_space = btrfs_item_offset(right->items + i);
00ec4c51 1177 }
7518a238
CM
1178 left_nritems -= push_items;
1179 btrfs_set_header_nritems(&left->header, left_nritems);
00ec4c51 1180
d6025579
CM
1181 btrfs_mark_buffer_dirty(left_buf);
1182 btrfs_mark_buffer_dirty(right_buf);
a429e513 1183
d6025579 1184 btrfs_memcpy(root, upper_node, &upper_node->ptrs[slot + 1].key,
e2fa7227 1185 &right->items[0].key, sizeof(struct btrfs_disk_key));
d6025579 1186 btrfs_mark_buffer_dirty(upper);
02217ed2 1187
00ec4c51 1188 /* then fixup the leaf pointer in the path */
7518a238
CM
1189 if (path->slots[0] >= left_nritems) {
1190 path->slots[0] -= left_nritems;
234b63a0 1191 btrfs_block_release(root, path->nodes[0]);
00ec4c51
CM
1192 path->nodes[0] = right_buf;
1193 path->slots[1] += 1;
1194 } else {
234b63a0 1195 btrfs_block_release(root, right_buf);
00ec4c51 1196 }
098f59c2
CM
1197 if (path->nodes[1])
1198 check_node(root, path, 1);
00ec4c51
CM
1199 return 0;
1200}
74123bd7
CM
1201/*
1202 * push some data in the path leaf to the left, trying to free up at
1203 * least data_size bytes. returns zero if the push worked, nonzero otherwise
1204 */
e089f05c
CM
1205static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
1206 *root, struct btrfs_path *path, int data_size)
be0e5c09 1207{
e20d96d6
CM
1208 struct buffer_head *right_buf = path->nodes[0];
1209 struct btrfs_leaf *right = btrfs_buffer_leaf(right_buf);
1210 struct buffer_head *t;
234b63a0 1211 struct btrfs_leaf *left;
be0e5c09
CM
1212 int slot;
1213 int i;
1214 int free_space;
1215 int push_space = 0;
1216 int push_items = 0;
0783fcfc 1217 struct btrfs_item *item;
7518a238 1218 u32 old_left_nritems;
aa5d6bed
CM
1219 int ret = 0;
1220 int wret;
be0e5c09
CM
1221
1222 slot = path->slots[1];
1223 if (slot == 0) {
1224 return 1;
1225 }
1226 if (!path->nodes[1]) {
1227 return 1;
1228 }
e20d96d6
CM
1229 t = read_tree_block(root,
1230 btrfs_node_blockptr(btrfs_buffer_node(path->nodes[1]), slot - 1));
1231 left = btrfs_buffer_leaf(t);
123abc88 1232 free_space = btrfs_leaf_free_space(root, left);
0783fcfc 1233 if (free_space < data_size + sizeof(struct btrfs_item)) {
234b63a0 1234 btrfs_block_release(root, t);
be0e5c09
CM
1235 return 1;
1236 }
02217ed2
CM
1237
1238 /* cow and double check */
54aa1f4d
CM
1239 ret = btrfs_cow_block(trans, root, t, path->nodes[1], slot - 1, &t);
1240 if (ret) {
1241 /* we hit -ENOSPC, but it isn't fatal here */
1242 return 1;
1243 }
e20d96d6 1244 left = btrfs_buffer_leaf(t);
123abc88 1245 free_space = btrfs_leaf_free_space(root, left);
0783fcfc 1246 if (free_space < data_size + sizeof(struct btrfs_item)) {
234b63a0 1247 btrfs_block_release(root, t);
02217ed2
CM
1248 return 1;
1249 }
1250
a429e513
CM
1251 if (btrfs_header_nritems(&right->header) == 0) {
1252 btrfs_block_release(root, t);
1253 return 1;
1254 }
1255
1256 for (i = 0; i < btrfs_header_nritems(&right->header) - 1; i++) {
be0e5c09
CM
1257 item = right->items + i;
1258 if (path->slots[0] == i)
1259 push_space += data_size + sizeof(*item);
0783fcfc
CM
1260 if (btrfs_item_size(item) + sizeof(*item) + push_space >
1261 free_space)
be0e5c09
CM
1262 break;
1263 push_items++;
0783fcfc 1264 push_space += btrfs_item_size(item) + sizeof(*item);
be0e5c09
CM
1265 }
1266 if (push_items == 0) {
234b63a0 1267 btrfs_block_release(root, t);
be0e5c09
CM
1268 return 1;
1269 }
a429e513
CM
1270 if (push_items == btrfs_header_nritems(&right->header))
1271 WARN_ON(1);
be0e5c09 1272 /* push data from right to left */
d6025579
CM
1273 btrfs_memcpy(root, left, left->items +
1274 btrfs_header_nritems(&left->header),
1275 right->items, push_items * sizeof(struct btrfs_item));
123abc88 1276 push_space = BTRFS_LEAF_DATA_SIZE(root) -
0783fcfc 1277 btrfs_item_offset(right->items + push_items -1);
d6025579
CM
1278 btrfs_memcpy(root, left, btrfs_leaf_data(left) +
1279 leaf_data_end(root, left) - push_space,
1280 btrfs_leaf_data(right) +
1281 btrfs_item_offset(right->items + push_items - 1),
1282 push_space);
7518a238 1283 old_left_nritems = btrfs_header_nritems(&left->header);
eb60ceac
CM
1284 BUG_ON(old_left_nritems < 0);
1285
0783fcfc 1286 for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
123abc88
CM
1287 u32 ioff = btrfs_item_offset(left->items + i);
1288 btrfs_set_item_offset(left->items + i, ioff -
1289 (BTRFS_LEAF_DATA_SIZE(root) -
0783fcfc
CM
1290 btrfs_item_offset(left->items +
1291 old_left_nritems - 1)));
be0e5c09 1292 }
7518a238 1293 btrfs_set_header_nritems(&left->header, old_left_nritems + push_items);
be0e5c09
CM
1294
1295 /* fixup right node */
0783fcfc 1296 push_space = btrfs_item_offset(right->items + push_items - 1) -
123abc88 1297 leaf_data_end(root, right);
d6025579
CM
1298 btrfs_memmove(root, right, btrfs_leaf_data(right) +
1299 BTRFS_LEAF_DATA_SIZE(root) - push_space,
1300 btrfs_leaf_data(right) +
1301 leaf_data_end(root, right), push_space);
1302 btrfs_memmove(root, right, right->items, right->items + push_items,
7518a238 1303 (btrfs_header_nritems(&right->header) - push_items) *
0783fcfc 1304 sizeof(struct btrfs_item));
7518a238
CM
1305 btrfs_set_header_nritems(&right->header,
1306 btrfs_header_nritems(&right->header) -
1307 push_items);
123abc88 1308 push_space = BTRFS_LEAF_DATA_SIZE(root);
eb60ceac 1309
7518a238 1310 for (i = 0; i < btrfs_header_nritems(&right->header); i++) {
0783fcfc
CM
1311 btrfs_set_item_offset(right->items + i, push_space -
1312 btrfs_item_size(right->items + i));
1313 push_space = btrfs_item_offset(right->items + i);
be0e5c09 1314 }
eb60ceac 1315
d6025579
CM
1316 btrfs_mark_buffer_dirty(t);
1317 btrfs_mark_buffer_dirty(right_buf);
098f59c2 1318
e089f05c 1319 wret = fixup_low_keys(trans, root, path, &right->items[0].key, 1);
aa5d6bed
CM
1320 if (wret)
1321 ret = wret;
be0e5c09
CM
1322
1323 /* then fixup the leaf pointer in the path */
1324 if (path->slots[0] < push_items) {
1325 path->slots[0] += old_left_nritems;
234b63a0 1326 btrfs_block_release(root, path->nodes[0]);
eb60ceac 1327 path->nodes[0] = t;
be0e5c09
CM
1328 path->slots[1] -= 1;
1329 } else {
234b63a0 1330 btrfs_block_release(root, t);
be0e5c09
CM
1331 path->slots[0] -= push_items;
1332 }
eb60ceac 1333 BUG_ON(path->slots[0] < 0);
098f59c2
CM
1334 if (path->nodes[1])
1335 check_node(root, path, 1);
aa5d6bed 1336 return ret;
be0e5c09
CM
1337}
1338
74123bd7
CM
1339/*
1340 * split the path's leaf in two, making sure there is at least data_size
1341 * available for the resulting leaf level of the path.
aa5d6bed
CM
1342 *
1343 * returns 0 if all went well and < 0 on failure.
74123bd7 1344 */
e089f05c 1345static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
d4dbff95
CM
1346 *root, struct btrfs_key *ins_key,
1347 struct btrfs_path *path, int data_size)
be0e5c09 1348{
e20d96d6 1349 struct buffer_head *l_buf;
234b63a0 1350 struct btrfs_leaf *l;
7518a238 1351 u32 nritems;
eb60ceac
CM
1352 int mid;
1353 int slot;
234b63a0 1354 struct btrfs_leaf *right;
e20d96d6 1355 struct buffer_head *right_buffer;
0783fcfc 1356 int space_needed = data_size + sizeof(struct btrfs_item);
be0e5c09
CM
1357 int data_copy_size;
1358 int rt_data_off;
1359 int i;
d4dbff95 1360 int ret = 0;
aa5d6bed 1361 int wret;
d4dbff95
CM
1362 int double_split = 0;
1363 struct btrfs_disk_key disk_key;
aa5d6bed 1364
40689478 1365 /* first try to make some room by pushing left and right */
e089f05c 1366 wret = push_leaf_left(trans, root, path, data_size);
eaee50e8
CM
1367 if (wret < 0)
1368 return wret;
1369 if (wret) {
e089f05c 1370 wret = push_leaf_right(trans, root, path, data_size);
eaee50e8
CM
1371 if (wret < 0)
1372 return wret;
1373 }
aa5d6bed 1374 l_buf = path->nodes[0];
e20d96d6 1375 l = btrfs_buffer_leaf(l_buf);
aa5d6bed
CM
1376
1377 /* did the pushes work? */
123abc88
CM
1378 if (btrfs_leaf_free_space(root, l) >=
1379 sizeof(struct btrfs_item) + data_size)
aa5d6bed
CM
1380 return 0;
1381
5c680ed6 1382 if (!path->nodes[1]) {
e089f05c 1383 ret = insert_new_root(trans, root, path, 1);
5c680ed6
CM
1384 if (ret)
1385 return ret;
1386 }
eb60ceac 1387 slot = path->slots[0];
7518a238 1388 nritems = btrfs_header_nritems(&l->header);
eb60ceac 1389 mid = (nritems + 1)/ 2;
54aa1f4d 1390
31f3c99b 1391 right_buffer = btrfs_alloc_free_block(trans, root, l_buf->b_blocknr);
54aa1f4d
CM
1392 if (IS_ERR(right_buffer))
1393 return PTR_ERR(right_buffer);
1394
e20d96d6 1395 right = btrfs_buffer_leaf(right_buffer);
123abc88 1396 memset(&right->header, 0, sizeof(right->header));
7eccb903 1397 btrfs_set_header_blocknr(&right->header, bh_blocknr(right_buffer));
7f5c1516 1398 btrfs_set_header_generation(&right->header, trans->transid);
4d775673 1399 btrfs_set_header_owner(&right->header, root->root_key.objectid);
7518a238 1400 btrfs_set_header_level(&right->header, 0);
3eb0314d
CM
1401 memcpy(right->header.fsid, root->fs_info->disk_super->fsid,
1402 sizeof(right->header.fsid));
d4dbff95
CM
1403 if (mid <= slot) {
1404 if (nritems == 1 ||
1405 leaf_space_used(l, mid, nritems - mid) + space_needed >
1406 BTRFS_LEAF_DATA_SIZE(root)) {
1407 if (slot >= nritems) {
1408 btrfs_cpu_key_to_disk(&disk_key, ins_key);
1409 btrfs_set_header_nritems(&right->header, 0);
1410 wret = insert_ptr(trans, root, path,
1411 &disk_key,
7eccb903 1412 bh_blocknr(right_buffer),
d4dbff95
CM
1413 path->slots[1] + 1, 1);
1414 if (wret)
1415 ret = wret;
1416 btrfs_block_release(root, path->nodes[0]);
1417 path->nodes[0] = right_buffer;
1418 path->slots[0] = 0;
1419 path->slots[1] += 1;
1420 return ret;
1421 }
1422 mid = slot;
1423 double_split = 1;
1424 }
1425 } else {
1426 if (leaf_space_used(l, 0, mid + 1) + space_needed >
1427 BTRFS_LEAF_DATA_SIZE(root)) {
1428 if (slot == 0) {
1429 btrfs_cpu_key_to_disk(&disk_key, ins_key);
1430 btrfs_set_header_nritems(&right->header, 0);
1431 wret = insert_ptr(trans, root, path,
1432 &disk_key,
7eccb903 1433 bh_blocknr(right_buffer),
098f59c2 1434 path->slots[1], 1);
d4dbff95
CM
1435 if (wret)
1436 ret = wret;
1437 btrfs_block_release(root, path->nodes[0]);
1438 path->nodes[0] = right_buffer;
1439 path->slots[0] = 0;
a429e513
CM
1440 if (path->slots[1] == 0) {
1441 wret = fixup_low_keys(trans, root,
1442 path, &disk_key, 1);
1443 if (wret)
1444 ret = wret;
1445 }
d4dbff95
CM
1446 return ret;
1447 }
1448 mid = slot;
1449 double_split = 1;
1450 }
1451 }
1452 btrfs_set_header_nritems(&right->header, nritems - mid);
123abc88
CM
1453 data_copy_size = btrfs_item_end(l->items + mid) -
1454 leaf_data_end(root, l);
d6025579
CM
1455 btrfs_memcpy(root, right, right->items, l->items + mid,
1456 (nritems - mid) * sizeof(struct btrfs_item));
1457 btrfs_memcpy(root, right,
1458 btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
1459 data_copy_size, btrfs_leaf_data(l) +
1460 leaf_data_end(root, l), data_copy_size);
123abc88
CM
1461 rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
1462 btrfs_item_end(l->items + mid);
74123bd7 1463
0783fcfc 1464 for (i = 0; i < btrfs_header_nritems(&right->header); i++) {
123abc88 1465 u32 ioff = btrfs_item_offset(right->items + i);
0783fcfc
CM
1466 btrfs_set_item_offset(right->items + i, ioff + rt_data_off);
1467 }
74123bd7 1468
7518a238 1469 btrfs_set_header_nritems(&l->header, mid);
aa5d6bed 1470 ret = 0;
e089f05c 1471 wret = insert_ptr(trans, root, path, &right->items[0].key,
7eccb903 1472 bh_blocknr(right_buffer), path->slots[1] + 1, 1);
aa5d6bed
CM
1473 if (wret)
1474 ret = wret;
d6025579
CM
1475 btrfs_mark_buffer_dirty(right_buffer);
1476 btrfs_mark_buffer_dirty(l_buf);
eb60ceac 1477 BUG_ON(path->slots[0] != slot);
be0e5c09 1478 if (mid <= slot) {
234b63a0 1479 btrfs_block_release(root, path->nodes[0]);
eb60ceac 1480 path->nodes[0] = right_buffer;
be0e5c09
CM
1481 path->slots[0] -= mid;
1482 path->slots[1] += 1;
eb60ceac 1483 } else
234b63a0 1484 btrfs_block_release(root, right_buffer);
eb60ceac 1485 BUG_ON(path->slots[0] < 0);
098f59c2 1486 check_node(root, path, 1);
d4dbff95
CM
1487
1488 if (!double_split)
1489 return ret;
31f3c99b 1490 right_buffer = btrfs_alloc_free_block(trans, root, l_buf->b_blocknr);
54aa1f4d
CM
1491 if (IS_ERR(right_buffer))
1492 return PTR_ERR(right_buffer);
1493
d4dbff95
CM
1494 right = btrfs_buffer_leaf(right_buffer);
1495 memset(&right->header, 0, sizeof(right->header));
7eccb903 1496 btrfs_set_header_blocknr(&right->header, bh_blocknr(right_buffer));
d4dbff95 1497 btrfs_set_header_generation(&right->header, trans->transid);
4d775673 1498 btrfs_set_header_owner(&right->header, root->root_key.objectid);
d4dbff95 1499 btrfs_set_header_level(&right->header, 0);
3eb0314d
CM
1500 memcpy(right->header.fsid, root->fs_info->disk_super->fsid,
1501 sizeof(right->header.fsid));
d4dbff95
CM
1502 btrfs_cpu_key_to_disk(&disk_key, ins_key);
1503 btrfs_set_header_nritems(&right->header, 0);
1504 wret = insert_ptr(trans, root, path,
1505 &disk_key,
7eccb903 1506 bh_blocknr(right_buffer),
d4dbff95
CM
1507 path->slots[1], 1);
1508 if (wret)
1509 ret = wret;
a429e513
CM
1510 if (path->slots[1] == 0) {
1511 wret = fixup_low_keys(trans, root, path, &disk_key, 1);
1512 if (wret)
1513 ret = wret;
1514 }
d4dbff95
CM
1515 btrfs_block_release(root, path->nodes[0]);
1516 path->nodes[0] = right_buffer;
1517 path->slots[0] = 0;
1518 check_node(root, path, 1);
1519 check_leaf(root, path, 0);
be0e5c09
CM
1520 return ret;
1521}
1522
b18c6685
CM
1523int btrfs_truncate_item(struct btrfs_trans_handle *trans,
1524 struct btrfs_root *root,
1525 struct btrfs_path *path,
1526 u32 new_size)
1527{
1528 int ret = 0;
1529 int slot;
1530 int slot_orig;
1531 struct btrfs_leaf *leaf;
1532 struct buffer_head *leaf_buf;
1533 u32 nritems;
1534 unsigned int data_end;
1535 unsigned int old_data_start;
1536 unsigned int old_size;
1537 unsigned int size_diff;
1538 int i;
1539
1540 slot_orig = path->slots[0];
1541 leaf_buf = path->nodes[0];
1542 leaf = btrfs_buffer_leaf(leaf_buf);
1543
1544 nritems = btrfs_header_nritems(&leaf->header);
1545 data_end = leaf_data_end(root, leaf);
1546
1547 slot = path->slots[0];
1548 old_data_start = btrfs_item_offset(leaf->items + slot);
1549 old_size = btrfs_item_size(leaf->items + slot);
1550 BUG_ON(old_size <= new_size);
1551 size_diff = old_size - new_size;
1552
1553 BUG_ON(slot < 0);
1554 BUG_ON(slot >= nritems);
1555
1556 /*
1557 * item0..itemN ... dataN.offset..dataN.size .. data0.size
1558 */
1559 /* first correct the data pointers */
1560 for (i = slot; i < nritems; i++) {
1561 u32 ioff = btrfs_item_offset(leaf->items + i);
1562 btrfs_set_item_offset(leaf->items + i,
1563 ioff + size_diff);
1564 }
1565 /* shift the data */
b18c6685
CM
1566 btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) +
1567 data_end + size_diff, btrfs_leaf_data(leaf) +
1568 data_end, old_data_start + new_size - data_end);
1569 btrfs_set_item_size(leaf->items + slot, new_size);
1570 btrfs_mark_buffer_dirty(leaf_buf);
1571
1572 ret = 0;
1573 if (btrfs_leaf_free_space(root, leaf) < 0)
1574 BUG();
1575 check_leaf(root, path, 0);
1576 return ret;
1577}
1578
6567e837
CM
1579int btrfs_extend_item(struct btrfs_trans_handle *trans, struct btrfs_root
1580 *root, struct btrfs_path *path, u32 data_size)
1581{
1582 int ret = 0;
1583 int slot;
1584 int slot_orig;
1585 struct btrfs_leaf *leaf;
1586 struct buffer_head *leaf_buf;
1587 u32 nritems;
1588 unsigned int data_end;
1589 unsigned int old_data;
1590 unsigned int old_size;
1591 int i;
1592
1593 slot_orig = path->slots[0];
1594 leaf_buf = path->nodes[0];
1595 leaf = btrfs_buffer_leaf(leaf_buf);
1596
1597 nritems = btrfs_header_nritems(&leaf->header);
1598 data_end = leaf_data_end(root, leaf);
1599
1600 if (btrfs_leaf_free_space(root, leaf) < data_size)
1601 BUG();
1602 slot = path->slots[0];
1603 old_data = btrfs_item_end(leaf->items + slot);
1604
1605 BUG_ON(slot < 0);
1606 BUG_ON(slot >= nritems);
1607
1608 /*
1609 * item0..itemN ... dataN.offset..dataN.size .. data0.size
1610 */
1611 /* first correct the data pointers */
1612 for (i = slot; i < nritems; i++) {
1613 u32 ioff = btrfs_item_offset(leaf->items + i);
1614 btrfs_set_item_offset(leaf->items + i,
1615 ioff - data_size);
1616 }
1617 /* shift the data */
1618 btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) +
1619 data_end - data_size, btrfs_leaf_data(leaf) +
1620 data_end, old_data - data_end);
1621 data_end = old_data;
1622 old_size = btrfs_item_size(leaf->items + slot);
1623 btrfs_set_item_size(leaf->items + slot, old_size + data_size);
1624 btrfs_mark_buffer_dirty(leaf_buf);
1625
1626 ret = 0;
1627 if (btrfs_leaf_free_space(root, leaf) < 0)
1628 BUG();
1629 check_leaf(root, path, 0);
1630 return ret;
1631}
1632
74123bd7
CM
1633/*
1634 * Given a key and some data, insert an item into the tree.
1635 * This does all the path init required, making room in the tree if needed.
1636 */
e089f05c
CM
1637int btrfs_insert_empty_item(struct btrfs_trans_handle *trans, struct btrfs_root
1638 *root, struct btrfs_path *path, struct btrfs_key
1639 *cpu_key, u32 data_size)
be0e5c09 1640{
aa5d6bed 1641 int ret = 0;
be0e5c09 1642 int slot;
eb60ceac 1643 int slot_orig;
234b63a0 1644 struct btrfs_leaf *leaf;
e20d96d6 1645 struct buffer_head *leaf_buf;
7518a238 1646 u32 nritems;
be0e5c09 1647 unsigned int data_end;
e2fa7227
CM
1648 struct btrfs_disk_key disk_key;
1649
1650 btrfs_cpu_key_to_disk(&disk_key, cpu_key);
be0e5c09 1651
74123bd7 1652 /* create a root if there isn't one */
5c680ed6 1653 if (!root->node)
cfaa7295 1654 BUG();
e089f05c 1655 ret = btrfs_search_slot(trans, root, cpu_key, path, data_size, 1);
eb60ceac 1656 if (ret == 0) {
f0930a37 1657 return -EEXIST;
aa5d6bed 1658 }
ed2ff2cb
CM
1659 if (ret < 0)
1660 goto out;
be0e5c09 1661
62e2749e
CM
1662 slot_orig = path->slots[0];
1663 leaf_buf = path->nodes[0];
e20d96d6 1664 leaf = btrfs_buffer_leaf(leaf_buf);
74123bd7 1665
7518a238 1666 nritems = btrfs_header_nritems(&leaf->header);
123abc88 1667 data_end = leaf_data_end(root, leaf);
eb60ceac 1668
123abc88 1669 if (btrfs_leaf_free_space(root, leaf) <
d4dbff95 1670 sizeof(struct btrfs_item) + data_size) {
be0e5c09 1671 BUG();
d4dbff95 1672 }
62e2749e 1673 slot = path->slots[0];
eb60ceac 1674 BUG_ON(slot < 0);
be0e5c09
CM
1675 if (slot != nritems) {
1676 int i;
0783fcfc 1677 unsigned int old_data = btrfs_item_end(leaf->items + slot);
be0e5c09
CM
1678
1679 /*
1680 * item0..itemN ... dataN.offset..dataN.size .. data0.size
1681 */
1682 /* first correct the data pointers */
0783fcfc 1683 for (i = slot; i < nritems; i++) {
123abc88 1684 u32 ioff = btrfs_item_offset(leaf->items + i);
0783fcfc
CM
1685 btrfs_set_item_offset(leaf->items + i,
1686 ioff - data_size);
1687 }
be0e5c09
CM
1688
1689 /* shift the items */
d6025579
CM
1690 btrfs_memmove(root, leaf, leaf->items + slot + 1,
1691 leaf->items + slot,
1692 (nritems - slot) * sizeof(struct btrfs_item));
be0e5c09
CM
1693
1694 /* shift the data */
d6025579
CM
1695 btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) +
1696 data_end - data_size, btrfs_leaf_data(leaf) +
1697 data_end, old_data - data_end);
be0e5c09
CM
1698 data_end = old_data;
1699 }
62e2749e 1700 /* setup the item for the new data */
d6025579
CM
1701 btrfs_memcpy(root, leaf, &leaf->items[slot].key, &disk_key,
1702 sizeof(struct btrfs_disk_key));
0783fcfc
CM
1703 btrfs_set_item_offset(leaf->items + slot, data_end - data_size);
1704 btrfs_set_item_size(leaf->items + slot, data_size);
7518a238 1705 btrfs_set_header_nritems(&leaf->header, nritems + 1);
d6025579 1706 btrfs_mark_buffer_dirty(leaf_buf);
aa5d6bed
CM
1707
1708 ret = 0;
8e19f2cd 1709 if (slot == 0)
e089f05c 1710 ret = fixup_low_keys(trans, root, path, &disk_key, 1);
aa5d6bed 1711
123abc88 1712 if (btrfs_leaf_free_space(root, leaf) < 0)
be0e5c09 1713 BUG();
62e2749e 1714 check_leaf(root, path, 0);
ed2ff2cb 1715out:
62e2749e
CM
1716 return ret;
1717}
1718
1719/*
1720 * Given a key and some data, insert an item into the tree.
1721 * This does all the path init required, making room in the tree if needed.
1722 */
e089f05c
CM
1723int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
1724 *root, struct btrfs_key *cpu_key, void *data, u32
1725 data_size)
62e2749e
CM
1726{
1727 int ret = 0;
2c90e5d6 1728 struct btrfs_path *path;
62e2749e
CM
1729 u8 *ptr;
1730
2c90e5d6
CM
1731 path = btrfs_alloc_path();
1732 BUG_ON(!path);
2c90e5d6 1733 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
62e2749e 1734 if (!ret) {
2c90e5d6
CM
1735 ptr = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]),
1736 path->slots[0], u8);
1737 btrfs_memcpy(root, path->nodes[0]->b_data,
d6025579 1738 ptr, data, data_size);
2c90e5d6 1739 btrfs_mark_buffer_dirty(path->nodes[0]);
62e2749e 1740 }
2c90e5d6 1741 btrfs_free_path(path);
aa5d6bed 1742 return ret;
be0e5c09
CM
1743}
1744
74123bd7 1745/*
5de08d7d 1746 * delete the pointer from a given node.
74123bd7
CM
1747 *
1748 * If the delete empties a node, the node is removed from the tree,
1749 * continuing all the way the root if required. The root is converted into
1750 * a leaf if all the nodes are emptied.
1751 */
e089f05c
CM
1752static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1753 struct btrfs_path *path, int level, int slot)
be0e5c09 1754{
234b63a0 1755 struct btrfs_node *node;
e20d96d6 1756 struct buffer_head *parent = path->nodes[level];
7518a238 1757 u32 nritems;
aa5d6bed 1758 int ret = 0;
bb803951 1759 int wret;
be0e5c09 1760
e20d96d6 1761 node = btrfs_buffer_node(parent);
7518a238 1762 nritems = btrfs_header_nritems(&node->header);
bb803951 1763 if (slot != nritems -1) {
d6025579
CM
1764 btrfs_memmove(root, node, node->ptrs + slot,
1765 node->ptrs + slot + 1,
1766 sizeof(struct btrfs_key_ptr) *
1767 (nritems - slot - 1));
bb803951 1768 }
7518a238
CM
1769 nritems--;
1770 btrfs_set_header_nritems(&node->header, nritems);
1771 if (nritems == 0 && parent == root->node) {
e20d96d6
CM
1772 struct btrfs_header *header = btrfs_buffer_header(root->node);
1773 BUG_ON(btrfs_header_level(header) != 1);
bb803951 1774 /* just turn the root into a leaf and break */
e20d96d6 1775 btrfs_set_header_level(header, 0);
bb803951 1776 } else if (slot == 0) {
e089f05c 1777 wret = fixup_low_keys(trans, root, path, &node->ptrs[0].key,
123abc88 1778 level + 1);
0f70abe2
CM
1779 if (wret)
1780 ret = wret;
be0e5c09 1781 }
d6025579 1782 btrfs_mark_buffer_dirty(parent);
aa5d6bed 1783 return ret;
be0e5c09
CM
1784}
1785
74123bd7
CM
1786/*
1787 * delete the item at the leaf level in path. If that empties
1788 * the leaf, remove it from the tree
1789 */
e089f05c
CM
1790int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1791 struct btrfs_path *path)
be0e5c09 1792{
be0e5c09 1793 int slot;
234b63a0 1794 struct btrfs_leaf *leaf;
e20d96d6 1795 struct buffer_head *leaf_buf;
be0e5c09
CM
1796 int doff;
1797 int dsize;
aa5d6bed
CM
1798 int ret = 0;
1799 int wret;
7518a238 1800 u32 nritems;
be0e5c09 1801
eb60ceac 1802 leaf_buf = path->nodes[0];
e20d96d6 1803 leaf = btrfs_buffer_leaf(leaf_buf);
4920c9ac 1804 slot = path->slots[0];
0783fcfc
CM
1805 doff = btrfs_item_offset(leaf->items + slot);
1806 dsize = btrfs_item_size(leaf->items + slot);
7518a238 1807 nritems = btrfs_header_nritems(&leaf->header);
be0e5c09 1808
7518a238 1809 if (slot != nritems - 1) {
be0e5c09 1810 int i;
123abc88 1811 int data_end = leaf_data_end(root, leaf);
d6025579
CM
1812 btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) +
1813 data_end + dsize,
1814 btrfs_leaf_data(leaf) + data_end,
1815 doff - data_end);
0783fcfc 1816 for (i = slot + 1; i < nritems; i++) {
123abc88 1817 u32 ioff = btrfs_item_offset(leaf->items + i);
0783fcfc
CM
1818 btrfs_set_item_offset(leaf->items + i, ioff + dsize);
1819 }
d6025579
CM
1820 btrfs_memmove(root, leaf, leaf->items + slot,
1821 leaf->items + slot + 1,
1822 sizeof(struct btrfs_item) *
1823 (nritems - slot - 1));
be0e5c09 1824 }
7518a238
CM
1825 btrfs_set_header_nritems(&leaf->header, nritems - 1);
1826 nritems--;
74123bd7 1827 /* delete the leaf if we've emptied it */
7518a238 1828 if (nritems == 0) {
eb60ceac 1829 if (leaf_buf == root->node) {
7518a238 1830 btrfs_set_header_level(&leaf->header, 0);
9a8dd150 1831 } else {
e089f05c 1832 clean_tree_block(trans, root, leaf_buf);
d6025579 1833 wait_on_buffer(leaf_buf);
e089f05c 1834 wret = del_ptr(trans, root, path, 1, path->slots[1]);
aa5d6bed
CM
1835 if (wret)
1836 ret = wret;
e089f05c 1837 wret = btrfs_free_extent(trans, root,
7eccb903 1838 bh_blocknr(leaf_buf), 1, 1);
0f70abe2
CM
1839 if (wret)
1840 ret = wret;
9a8dd150 1841 }
be0e5c09 1842 } else {
7518a238 1843 int used = leaf_space_used(leaf, 0, nritems);
aa5d6bed 1844 if (slot == 0) {
e089f05c
CM
1845 wret = fixup_low_keys(trans, root, path,
1846 &leaf->items[0].key, 1);
aa5d6bed
CM
1847 if (wret)
1848 ret = wret;
1849 }
aa5d6bed 1850
74123bd7 1851 /* delete the leaf if it is mostly empty */
123abc88 1852 if (used < BTRFS_LEAF_DATA_SIZE(root) / 3) {
be0e5c09
CM
1853 /* push_leaf_left fixes the path.
1854 * make sure the path still points to our leaf
1855 * for possible call to del_ptr below
1856 */
4920c9ac 1857 slot = path->slots[1];
e20d96d6 1858 get_bh(leaf_buf);
e089f05c 1859 wret = push_leaf_left(trans, root, path, 1);
54aa1f4d 1860 if (wret < 0 && wret != -ENOSPC)
aa5d6bed 1861 ret = wret;
f0930a37 1862 if (path->nodes[0] == leaf_buf &&
7518a238 1863 btrfs_header_nritems(&leaf->header)) {
e089f05c 1864 wret = push_leaf_right(trans, root, path, 1);
54aa1f4d 1865 if (wret < 0 && wret != -ENOSPC)
aa5d6bed
CM
1866 ret = wret;
1867 }
7518a238 1868 if (btrfs_header_nritems(&leaf->header) == 0) {
7eccb903 1869 u64 blocknr = bh_blocknr(leaf_buf);
e089f05c 1870 clean_tree_block(trans, root, leaf_buf);
d6025579 1871 wait_on_buffer(leaf_buf);
e089f05c 1872 wret = del_ptr(trans, root, path, 1, slot);
aa5d6bed
CM
1873 if (wret)
1874 ret = wret;
234b63a0 1875 btrfs_block_release(root, leaf_buf);
e089f05c
CM
1876 wret = btrfs_free_extent(trans, root, blocknr,
1877 1, 1);
0f70abe2
CM
1878 if (wret)
1879 ret = wret;
5de08d7d 1880 } else {
d6025579 1881 btrfs_mark_buffer_dirty(leaf_buf);
234b63a0 1882 btrfs_block_release(root, leaf_buf);
be0e5c09 1883 }
d5719762 1884 } else {
d6025579 1885 btrfs_mark_buffer_dirty(leaf_buf);
be0e5c09
CM
1886 }
1887 }
aa5d6bed 1888 return ret;
be0e5c09
CM
1889}
1890
97571fd0
CM
1891/*
1892 * walk up the tree as far as required to find the next leaf.
0f70abe2
CM
1893 * returns 0 if it found something or 1 if there are no greater leaves.
1894 * returns < 0 on io errors.
97571fd0 1895 */
234b63a0 1896int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
d97e63b6
CM
1897{
1898 int slot;
1899 int level = 1;
1900 u64 blocknr;
e20d96d6
CM
1901 struct buffer_head *c;
1902 struct btrfs_node *c_node;
1903 struct buffer_head *next = NULL;
d97e63b6 1904
234b63a0 1905 while(level < BTRFS_MAX_LEVEL) {
d97e63b6 1906 if (!path->nodes[level])
0f70abe2 1907 return 1;
d97e63b6
CM
1908 slot = path->slots[level] + 1;
1909 c = path->nodes[level];
e20d96d6
CM
1910 c_node = btrfs_buffer_node(c);
1911 if (slot >= btrfs_header_nritems(&c_node->header)) {
d97e63b6
CM
1912 level++;
1913 continue;
1914 }
e20d96d6 1915 blocknr = btrfs_node_blockptr(c_node, slot);
cfaa7295 1916 if (next)
234b63a0 1917 btrfs_block_release(root, next);
d97e63b6
CM
1918 next = read_tree_block(root, blocknr);
1919 break;
1920 }
1921 path->slots[level] = slot;
1922 while(1) {
1923 level--;
1924 c = path->nodes[level];
234b63a0 1925 btrfs_block_release(root, c);
d97e63b6
CM
1926 path->nodes[level] = next;
1927 path->slots[level] = 0;
1928 if (!level)
1929 break;
1d4f8a0c 1930 next = read_tree_block(root,
e20d96d6 1931 btrfs_node_blockptr(btrfs_buffer_node(next), 0));
d97e63b6
CM
1932 }
1933 return 0;
1934}
This page took 0.134948 seconds and 5 git commands to generate.