ctree.c 77.8 KB
Newer Older
C
Chris Mason 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright (C) 2007 Oracle.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License v2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 021110-1307, USA.
 */

19
#include <linux/sched.h>
20 21
#include "ctree.h"
#include "disk-io.h"
22
#include "transaction.h"
23
#include "print-tree.h"
24
#include "locking.h"
25

26 27 28
static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, int level);
static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
29
		      *root, struct btrfs_key *ins_key,
30
		      struct btrfs_path *path, int data_size, int extend);
31 32
static int push_node_left(struct btrfs_trans_handle *trans,
			  struct btrfs_root *root, struct extent_buffer *dst,
33
			  struct extent_buffer *src, int empty);
34 35 36 37
static int balance_node_right(struct btrfs_trans_handle *trans,
			      struct btrfs_root *root,
			      struct extent_buffer *dst_buf,
			      struct extent_buffer *src_buf);
38 39
static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		   struct btrfs_path *path, int level, int slot);
40

C
Chris Mason 已提交
41
inline void btrfs_init_path(struct btrfs_path *p)
C
Chris Mason 已提交
42
{
C
Chris Mason 已提交
43
	memset(p, 0, sizeof(*p));
C
Chris Mason 已提交
44 45
}

C
Chris Mason 已提交
46
struct btrfs_path *btrfs_alloc_path(void)
C
Chris Mason 已提交
47
{
C
Chris Mason 已提交
48 49
	struct btrfs_path *path;
	path = kmem_cache_alloc(btrfs_path_cachep, GFP_NOFS);
50
	if (path) {
C
Chris Mason 已提交
51
		btrfs_init_path(path);
52 53
		path->reada = 1;
	}
C
Chris Mason 已提交
54
	return path;
C
Chris Mason 已提交
55 56
}

C
Chris Mason 已提交
57
void btrfs_free_path(struct btrfs_path *p)
58
{
C
Chris Mason 已提交
59 60
	btrfs_release_path(NULL, p);
	kmem_cache_free(btrfs_path_cachep, p);
61 62
}

C
Chris Mason 已提交
63
void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p)
64 65
{
	int i;
66 67
	int keep = p->keep_locks;

C
Chris Mason 已提交
68
	for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
69
		if (!p->nodes[i])
70 71 72 73 74
			continue;
		if (p->locks[i]) {
			btrfs_tree_unlock(p->nodes[i]);
			p->locks[i] = 0;
		}
75
		free_extent_buffer(p->nodes[i]);
76
	}
C
Chris Mason 已提交
77
	memset(p, 0, sizeof(*p));
78
	p->keep_locks = keep;
79 80
}

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
struct extent_buffer *btrfs_root_node(struct btrfs_root *root)
{
	struct extent_buffer *eb;
	spin_lock(&root->node_lock);
	eb = root->node;
	extent_buffer_get(eb);
	spin_unlock(&root->node_lock);
	return eb;
}

struct extent_buffer *btrfs_lock_root_node(struct btrfs_root *root)
{
	struct extent_buffer *eb;

	while(1) {
		eb = btrfs_root_node(root);
		btrfs_tree_lock(eb);

		spin_lock(&root->node_lock);
		if (eb == root->node) {
			spin_unlock(&root->node_lock);
			break;
		}
		spin_unlock(&root->node_lock);

		btrfs_tree_unlock(eb);
		free_extent_buffer(eb);
	}
	return eb;
}

112 113 114 115 116 117 118 119
static void add_root_to_dirty_list(struct btrfs_root *root)
{
	if (root->track_dirty && list_empty(&root->dirty_list)) {
		list_add(&root->dirty_list,
			 &root->fs_info->dirty_cowonly_roots);
	}
}

120 121 122 123 124 125 126 127 128 129
int btrfs_copy_root(struct btrfs_trans_handle *trans,
		      struct btrfs_root *root,
		      struct extent_buffer *buf,
		      struct extent_buffer **cow_ret, u64 new_root_objectid)
{
	struct extent_buffer *cow;
	u32 nritems;
	int ret = 0;
	int level;
	struct btrfs_key first_key;
130
	struct btrfs_root *new_root;
131

132 133 134 135 136 137
	new_root = kmalloc(sizeof(*new_root), GFP_NOFS);
	if (!new_root)
		return -ENOMEM;

	memcpy(new_root, root, sizeof(*new_root));
	new_root->root_key.objectid = new_root_objectid;
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

	WARN_ON(root->ref_cows && trans->transid !=
		root->fs_info->running_transaction->transid);
	WARN_ON(root->ref_cows && trans->transid != root->last_trans);

	level = btrfs_header_level(buf);
	nritems = btrfs_header_nritems(buf);
	if (nritems) {
		if (level == 0)
			btrfs_item_key_to_cpu(buf, &first_key, 0);
		else
			btrfs_node_key_to_cpu(buf, &first_key, 0);
	} else {
		first_key.objectid = 0;
	}
153
	cow = btrfs_alloc_free_block(trans, new_root, buf->len,
154 155 156
				       new_root_objectid,
				       trans->transid, first_key.objectid,
				       level, buf->start, 0);
157 158
	if (IS_ERR(cow)) {
		kfree(new_root);
159
		return PTR_ERR(cow);
160
	}
161 162 163 164 165

	copy_extent_buffer(cow, buf, 0, 0, cow->len);
	btrfs_set_header_bytenr(cow, cow->start);
	btrfs_set_header_generation(cow, trans->transid);
	btrfs_set_header_owner(cow, new_root_objectid);
166
	btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN);
167 168

	WARN_ON(btrfs_header_generation(buf) > trans->transid);
169 170 171
	ret = btrfs_inc_ref(trans, new_root, buf);
	kfree(new_root);

172 173 174 175 176 177 178 179 180
	if (ret)
		return ret;

	btrfs_mark_buffer_dirty(cow);
	*cow_ret = cow;
	return 0;
}

int __btrfs_cow_block(struct btrfs_trans_handle *trans,
181 182 183 184 185
			     struct btrfs_root *root,
			     struct extent_buffer *buf,
			     struct extent_buffer *parent, int parent_slot,
			     struct extent_buffer **cow_ret,
			     u64 search_start, u64 empty_size)
C
Chris Mason 已提交
186
{
187
	u64 root_gen;
188
	struct extent_buffer *cow;
189
	u32 nritems;
190 191
	int ret = 0;
	int different_trans = 0;
192
	int level;
193
	int unlock_orig = 0;
194 195
	struct btrfs_key first_key;

196 197 198 199 200
	if (*cow_ret == buf)
		unlock_orig = 1;

	WARN_ON(!btrfs_tree_locked(buf));

201 202 203 204 205 206 207
	if (root->ref_cows) {
		root_gen = trans->transid;
	} else {
		root_gen = 0;
	}
	WARN_ON(root->ref_cows && trans->transid !=
		root->fs_info->running_transaction->transid);
208
	WARN_ON(root->ref_cows && trans->transid != root->last_trans);
209

210 211 212 213 214 215 216 217 218 219
	level = btrfs_header_level(buf);
	nritems = btrfs_header_nritems(buf);
	if (nritems) {
		if (level == 0)
			btrfs_item_key_to_cpu(buf, &first_key, 0);
		else
			btrfs_node_key_to_cpu(buf, &first_key, 0);
	} else {
		first_key.objectid = 0;
	}
220
	cow = btrfs_alloc_free_block(trans, root, buf->len,
221 222
				     root->root_key.objectid,
				     root_gen, first_key.objectid, level,
223
				     search_start, empty_size);
224 225
	if (IS_ERR(cow))
		return PTR_ERR(cow);
226

227
	copy_extent_buffer(cow, buf, 0, 0, cow->len);
228
	btrfs_set_header_bytenr(cow, cow->start);
229 230
	btrfs_set_header_generation(cow, trans->transid);
	btrfs_set_header_owner(cow, root->root_key.objectid);
231
	btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN);
232

233 234
	WARN_ON(btrfs_header_generation(buf) > trans->transid);
	if (btrfs_header_generation(buf) != trans->transid) {
235 236 237 238 239 240 241 242
		different_trans = 1;
		ret = btrfs_inc_ref(trans, root, buf);
		if (ret)
			return ret;
	} else {
		clean_tree_block(trans, root, buf);
	}

C
Chris Mason 已提交
243
	if (buf == root->node) {
244
		WARN_ON(parent && parent != buf);
245
		root_gen = btrfs_header_generation(buf);
246 247

		spin_lock(&root->node_lock);
C
Chris Mason 已提交
248
		root->node = cow;
249
		extent_buffer_get(cow);
250 251
		spin_unlock(&root->node_lock);

C
Chris Mason 已提交
252
		if (buf != root->commit_root) {
253
			btrfs_free_extent(trans, root, buf->start,
254 255
					  buf->len, root->root_key.objectid,
					  root_gen, 0, 0, 1);
C
Chris Mason 已提交
256
		}
257
		free_extent_buffer(buf);
258
		add_root_to_dirty_list(root);
C
Chris Mason 已提交
259
	} else {
260
		root_gen = btrfs_header_generation(parent);
261
		btrfs_set_node_blockptr(parent, parent_slot,
262
					cow->start);
263 264 265
		WARN_ON(trans->transid == 0);
		btrfs_set_node_ptr_generation(parent, parent_slot,
					      trans->transid);
C
Chris Mason 已提交
266
		btrfs_mark_buffer_dirty(parent);
267
		WARN_ON(btrfs_header_generation(parent) != trans->transid);
268 269 270
		btrfs_free_extent(trans, root, buf->start, buf->len,
				  btrfs_header_owner(parent), root_gen,
				  0, 0, 1);
C
Chris Mason 已提交
271
	}
272 273
	if (unlock_orig)
		btrfs_tree_unlock(buf);
274
	free_extent_buffer(buf);
C
Chris Mason 已提交
275
	btrfs_mark_buffer_dirty(cow);
C
Chris Mason 已提交
276
	*cow_ret = cow;
C
Chris Mason 已提交
277 278 279
	return 0;
}

280 281 282 283
int btrfs_cow_block(struct btrfs_trans_handle *trans,
		    struct btrfs_root *root, struct extent_buffer *buf,
		    struct extent_buffer *parent, int parent_slot,
		    struct extent_buffer **cow_ret)
284 285
{
	u64 search_start;
C
Chris Mason 已提交
286
	u64 header_trans;
287
	int ret;
C
Chris Mason 已提交
288

289 290 291 292 293 294 295 296 297 298
	if (trans->transaction != root->fs_info->running_transaction) {
		printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
		       root->fs_info->running_transaction->transid);
		WARN_ON(1);
	}
	if (trans->transid != root->fs_info->generation) {
		printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
		       root->fs_info->generation);
		WARN_ON(1);
	}
C
Chris Mason 已提交
299 300

	header_trans = btrfs_header_generation(buf);
301 302 303
	spin_lock(&root->fs_info->hash_lock);
	if (header_trans == trans->transid &&
	    !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN)) {
304
		*cow_ret = buf;
305
		spin_unlock(&root->fs_info->hash_lock);
306 307
		return 0;
	}
308
	spin_unlock(&root->fs_info->hash_lock);
309
	search_start = buf->start & ~((u64)(1024 * 1024 * 1024) - 1);
310
	ret = __btrfs_cow_block(trans, root, buf, parent,
311
				 parent_slot, cow_ret, search_start, 0);
312
	return ret;
313 314
}

315
static int close_blocks(u64 blocknr, u64 other, u32 blocksize)
316
{
317
	if (blocknr < other && other - (blocknr + blocksize) < 32768)
318
		return 1;
319
	if (blocknr > other && blocknr - (other + blocksize) < 32768)
320 321 322 323
		return 1;
	return 0;
}

324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
/*
 * compare two keys in a memcmp fashion
 */
static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
{
	struct btrfs_key k1;

	btrfs_disk_key_to_cpu(&k1, disk);

	if (k1.objectid > k2->objectid)
		return 1;
	if (k1.objectid < k2->objectid)
		return -1;
	if (k1.type > k2->type)
		return 1;
	if (k1.type < k2->type)
		return -1;
	if (k1.offset > k2->offset)
		return 1;
	if (k1.offset < k2->offset)
		return -1;
	return 0;
}


349
int btrfs_realloc_node(struct btrfs_trans_handle *trans,
350
		       struct btrfs_root *root, struct extent_buffer *parent,
351 352
		       int start_slot, int cache_only, u64 *last_ret,
		       struct btrfs_key *progress)
353
{
354 355
	struct extent_buffer *cur;
	struct extent_buffer *tmp;
356
	u64 blocknr;
357
	u64 gen;
358 359
	u64 search_start = *last_ret;
	u64 last_block = 0;
360 361 362 363 364
	u64 other;
	u32 parent_nritems;
	int end_slot;
	int i;
	int err = 0;
365
	int parent_level;
366 367
	int uptodate;
	u32 blocksize;
368 369
	int progress_passed = 0;
	struct btrfs_disk_key disk_key;
370

371 372 373
	/* FIXME this code needs locking */
	return 0;

374 375 376 377
	parent_level = btrfs_header_level(parent);
	if (cache_only && parent_level != 1)
		return 0;

378 379 380 381 382 383 384 385 386 387
	if (trans->transaction != root->fs_info->running_transaction) {
		printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
		       root->fs_info->running_transaction->transid);
		WARN_ON(1);
	}
	if (trans->transid != root->fs_info->generation) {
		printk(KERN_CRIT "trans %Lu running %Lu\n", trans->transid,
		       root->fs_info->generation);
		WARN_ON(1);
	}
388

389 390
	parent_nritems = btrfs_header_nritems(parent);
	blocksize = btrfs_level_size(root, parent_level - 1);
391 392 393 394 395 396 397
	end_slot = parent_nritems;

	if (parent_nritems == 1)
		return 0;

	for (i = start_slot; i < end_slot; i++) {
		int close = 1;
398

399 400 401 402 403 404 405 406
		if (!parent->map_token) {
			map_extent_buffer(parent,
					btrfs_node_key_ptr_offset(i),
					sizeof(struct btrfs_key_ptr),
					&parent->map_token, &parent->kaddr,
					&parent->map_start, &parent->map_len,
					KM_USER1);
		}
407 408 409 410 411
		btrfs_node_key(parent, &disk_key, i);
		if (!progress_passed && comp_keys(&disk_key, progress) < 0)
			continue;

		progress_passed = 1;
412
		blocknr = btrfs_node_blockptr(parent, i);
413
		gen = btrfs_node_ptr_generation(parent, i);
414 415
		if (last_block == 0)
			last_block = blocknr;
416

417
		if (i > 0) {
418 419
			other = btrfs_node_blockptr(parent, i - 1);
			close = close_blocks(blocknr, other, blocksize);
420
		}
C
Chris Mason 已提交
421
		if (!close && i < end_slot - 2) {
422 423
			other = btrfs_node_blockptr(parent, i + 1);
			close = close_blocks(blocknr, other, blocksize);
424
		}
425 426
		if (close) {
			last_block = blocknr;
427
			continue;
428
		}
429 430 431 432 433
		if (parent->map_token) {
			unmap_extent_buffer(parent, parent->map_token,
					    KM_USER1);
			parent->map_token = NULL;
		}
434

435 436
		cur = btrfs_find_tree_block(root, blocknr, blocksize);
		if (cur)
437
			uptodate = btrfs_buffer_uptodate(cur, gen);
438 439
		else
			uptodate = 0;
440
		if (!cur || !uptodate) {
441
			if (cache_only) {
442
				free_extent_buffer(cur);
443 444
				continue;
			}
445 446
			if (!cur) {
				cur = read_tree_block(root, blocknr,
447
							 blocksize, gen);
448
			} else if (!uptodate) {
449
				btrfs_read_buffer(cur, gen);
450
			}
451
		}
452
		if (search_start == 0)
453
			search_start = last_block;
454

455 456 457 458
		err = __btrfs_cow_block(trans, root, cur, parent, i,
					&tmp, search_start,
					min(16 * blocksize,
					    (end_slot - i) * blocksize));
Y
Yan 已提交
459
		if (err) {
460
			free_extent_buffer(cur);
461
			break;
Y
Yan 已提交
462
		}
463
		search_start = tmp->start;
464
		last_block = tmp->start;
465 466
		*last_ret = search_start;
		if (parent_level == 1)
467 468
			btrfs_clear_buffer_defrag(tmp);
		free_extent_buffer(tmp);
469
	}
470 471 472 473 474
	if (parent->map_token) {
		unmap_extent_buffer(parent, parent->map_token,
				    KM_USER1);
		parent->map_token = NULL;
	}
475 476 477
	return err;
}

C
Chris Mason 已提交
478 479 480 481 482
/*
 * The leaf data grows from end-to-front in the node.
 * this returns the address of the start of the last item,
 * which is the stop of the leaf data stack
 */
C
Chris Mason 已提交
483
static inline unsigned int leaf_data_end(struct btrfs_root *root,
484
					 struct extent_buffer *leaf)
485
{
486
	u32 nr = btrfs_header_nritems(leaf);
487
	if (nr == 0)
C
Chris Mason 已提交
488
		return BTRFS_LEAF_DATA_SIZE(root);
489
	return btrfs_item_offset_nr(leaf, nr - 1);
490 491
}

C
Chris Mason 已提交
492 493
static int check_node(struct btrfs_root *root, struct btrfs_path *path,
		      int level)
C
Chris Mason 已提交
494
{
495 496 497 498
	struct extent_buffer *parent = NULL;
	struct extent_buffer *node = path->nodes[level];
	struct btrfs_disk_key parent_key;
	struct btrfs_disk_key node_key;
C
Chris Mason 已提交
499
	int parent_slot;
500 501
	int slot;
	struct btrfs_key cpukey;
502
	u32 nritems = btrfs_header_nritems(node);
C
Chris Mason 已提交
503 504

	if (path->nodes[level + 1])
505
		parent = path->nodes[level + 1];
A
Aneesh 已提交
506

507
	slot = path->slots[level];
508 509
	BUG_ON(nritems == 0);
	if (parent) {
A
Aneesh 已提交
510
		parent_slot = path->slots[level + 1];
511 512 513
		btrfs_node_key(parent, &parent_key, parent_slot);
		btrfs_node_key(node, &node_key, 0);
		BUG_ON(memcmp(&parent_key, &node_key,
C
Chris Mason 已提交
514
			      sizeof(struct btrfs_disk_key)));
515
		BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
516
		       btrfs_header_bytenr(node));
C
Chris Mason 已提交
517
	}
C
Chris Mason 已提交
518
	BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root));
519
	if (slot != 0) {
520 521 522
		btrfs_node_key_to_cpu(node, &cpukey, slot - 1);
		btrfs_node_key(node, &node_key, slot);
		BUG_ON(comp_keys(&node_key, &cpukey) <= 0);
523 524
	}
	if (slot < nritems - 1) {
525 526 527
		btrfs_node_key_to_cpu(node, &cpukey, slot + 1);
		btrfs_node_key(node, &node_key, slot);
		BUG_ON(comp_keys(&node_key, &cpukey) >= 0);
C
Chris Mason 已提交
528 529 530 531
	}
	return 0;
}

C
Chris Mason 已提交
532 533
static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
		      int level)
C
Chris Mason 已提交
534
{
535 536
	struct extent_buffer *leaf = path->nodes[level];
	struct extent_buffer *parent = NULL;
C
Chris Mason 已提交
537
	int parent_slot;
538
	struct btrfs_key cpukey;
539 540 541
	struct btrfs_disk_key parent_key;
	struct btrfs_disk_key leaf_key;
	int slot = path->slots[0];
542

543
	u32 nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
544 545

	if (path->nodes[level + 1])
546
		parent = path->nodes[level + 1];
547 548 549 550 551

	if (nritems == 0)
		return 0;

	if (parent) {
A
Aneesh 已提交
552
		parent_slot = path->slots[level + 1];
553 554
		btrfs_node_key(parent, &parent_key, parent_slot);
		btrfs_item_key(leaf, &leaf_key, 0);
555

556
		BUG_ON(memcmp(&parent_key, &leaf_key,
C
Chris Mason 已提交
557
		       sizeof(struct btrfs_disk_key)));
558
		BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
559
		       btrfs_header_bytenr(leaf));
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
	}
#if 0
	for (i = 0; nritems > 1 && i < nritems - 2; i++) {
		btrfs_item_key_to_cpu(leaf, &cpukey, i + 1);
		btrfs_item_key(leaf, &leaf_key, i);
		if (comp_keys(&leaf_key, &cpukey) >= 0) {
			btrfs_print_leaf(root, leaf);
			printk("slot %d offset bad key\n", i);
			BUG_ON(1);
		}
		if (btrfs_item_offset_nr(leaf, i) !=
			btrfs_item_end_nr(leaf, i + 1)) {
			btrfs_print_leaf(root, leaf);
			printk("slot %d offset bad\n", i);
			BUG_ON(1);
		}
		if (i == 0) {
			if (btrfs_item_offset_nr(leaf, i) +
			       btrfs_item_size_nr(leaf, i) !=
			       BTRFS_LEAF_DATA_SIZE(root)) {
				btrfs_print_leaf(root, leaf);
				printk("slot %d first offset bad\n", i);
				BUG_ON(1);
			}
		}
C
Chris Mason 已提交
585
	}
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
	if (nritems > 0) {
		if (btrfs_item_size_nr(leaf, nritems - 1) > 4096) {
				btrfs_print_leaf(root, leaf);
				printk("slot %d bad size \n", nritems - 1);
				BUG_ON(1);
		}
	}
#endif
	if (slot != 0 && slot < nritems - 1) {
		btrfs_item_key(leaf, &leaf_key, slot);
		btrfs_item_key_to_cpu(leaf, &cpukey, slot - 1);
		if (comp_keys(&leaf_key, &cpukey) <= 0) {
			btrfs_print_leaf(root, leaf);
			printk("slot %d offset bad key\n", slot);
			BUG_ON(1);
		}
		if (btrfs_item_offset_nr(leaf, slot - 1) !=
		       btrfs_item_end_nr(leaf, slot)) {
			btrfs_print_leaf(root, leaf);
			printk("slot %d offset bad\n", slot);
			BUG_ON(1);
		}
608 609
	}
	if (slot < nritems - 1) {
610 611 612 613 614 615 616 617 618
		btrfs_item_key(leaf, &leaf_key, slot);
		btrfs_item_key_to_cpu(leaf, &cpukey, slot + 1);
		BUG_ON(comp_keys(&leaf_key, &cpukey) >= 0);
		if (btrfs_item_offset_nr(leaf, slot) !=
			btrfs_item_end_nr(leaf, slot + 1)) {
			btrfs_print_leaf(root, leaf);
			printk("slot %d offset bad\n", slot);
			BUG_ON(1);
		}
C
Chris Mason 已提交
619
	}
620 621
	BUG_ON(btrfs_item_offset_nr(leaf, 0) +
	       btrfs_item_size_nr(leaf, 0) != BTRFS_LEAF_DATA_SIZE(root));
C
Chris Mason 已提交
622 623 624
	return 0;
}

625 626
static int noinline check_block(struct btrfs_root *root,
				struct btrfs_path *path, int level)
C
Chris Mason 已提交
627
{
628
	u64 found_start;
629
	return 0;
630 631 632 633 634 635 636 637 638
	if (btrfs_header_level(path->nodes[level]) != level)
	    printk("warning: bad level %Lu wanted %d found %d\n",
		   path->nodes[level]->start, level,
		   btrfs_header_level(path->nodes[level]));
	found_start = btrfs_header_bytenr(path->nodes[level]);
	if (found_start != path->nodes[level]->start) {
	    printk("warning: bad bytentr %Lu found %Lu\n",
		   path->nodes[level]->start, found_start);
	}
639
#if 0
640 641
	struct extent_buffer *buf = path->nodes[level];

642 643 644
	if (memcmp_extent_buffer(buf, root->fs_info->fsid,
				 (unsigned long)btrfs_header_fsid(buf),
				 BTRFS_FSID_SIZE)) {
645
		printk("warning bad block %Lu\n", buf->start);
646
		return 1;
647
	}
648
#endif
C
Chris Mason 已提交
649
	if (level == 0)
C
Chris Mason 已提交
650 651
		return check_leaf(root, path, level);
	return check_node(root, path, level);
C
Chris Mason 已提交
652 653
}

C
Chris Mason 已提交
654
/*
655 656 657
 * search for key in the extent_buffer.  The items start at offset p,
 * and they are item_size apart.  There are 'max' items in p.
 *
C
Chris Mason 已提交
658 659 660 661 662 663
 * the slot in the array is returned via slot, and it points to
 * the place where you would insert key if it is not found in
 * the array.
 *
 * slot may point to max if the key is bigger than all of the keys
 */
664 665 666
static int generic_bin_search(struct extent_buffer *eb, unsigned long p,
			      int item_size, struct btrfs_key *key,
			      int max, int *slot)
667 668 669 670 671
{
	int low = 0;
	int high = max;
	int mid;
	int ret;
672
	struct btrfs_disk_key *tmp = NULL;
673 674 675 676 677 678
	struct btrfs_disk_key unaligned;
	unsigned long offset;
	char *map_token = NULL;
	char *kaddr = NULL;
	unsigned long map_start = 0;
	unsigned long map_len = 0;
679
	int err;
680 681 682

	while(low < high) {
		mid = (low + high) / 2;
683 684 685 686 687
		offset = p + mid * item_size;

		if (!map_token || offset < map_start ||
		    (offset + sizeof(struct btrfs_disk_key)) >
		    map_start + map_len) {
688
			if (map_token) {
689
				unmap_extent_buffer(eb, map_token, KM_USER0);
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
				map_token = NULL;
			}
			err = map_extent_buffer(eb, offset,
						sizeof(struct btrfs_disk_key),
						&map_token, &kaddr,
						&map_start, &map_len, KM_USER0);

			if (!err) {
				tmp = (struct btrfs_disk_key *)(kaddr + offset -
							map_start);
			} else {
				read_extent_buffer(eb, &unaligned,
						   offset, sizeof(unaligned));
				tmp = &unaligned;
			}
705 706 707 708 709

		} else {
			tmp = (struct btrfs_disk_key *)(kaddr + offset -
							map_start);
		}
710 711 712 713 714 715 716 717
		ret = comp_keys(tmp, key);

		if (ret < 0)
			low = mid + 1;
		else if (ret > 0)
			high = mid;
		else {
			*slot = mid;
718 719
			if (map_token)
				unmap_extent_buffer(eb, map_token, KM_USER0);
720 721 722 723
			return 0;
		}
	}
	*slot = low;
724 725
	if (map_token)
		unmap_extent_buffer(eb, map_token, KM_USER0);
726 727 728
	return 1;
}

C
Chris Mason 已提交
729 730 731 732
/*
 * simple bin_search frontend that does the right thing for
 * leaves vs nodes
 */
733 734
static int bin_search(struct extent_buffer *eb, struct btrfs_key *key,
		      int level, int *slot)
735
{
736 737 738
	if (level == 0) {
		return generic_bin_search(eb,
					  offsetof(struct btrfs_leaf, items),
C
Chris Mason 已提交
739
					  sizeof(struct btrfs_item),
740
					  key, btrfs_header_nritems(eb),
741
					  slot);
742
	} else {
743 744
		return generic_bin_search(eb,
					  offsetof(struct btrfs_node, ptrs),
C
Chris Mason 已提交
745
					  sizeof(struct btrfs_key_ptr),
746
					  key, btrfs_header_nritems(eb),
747
					  slot);
748 749 750 751
	}
	return -1;
}

752 753
static struct extent_buffer *read_node_slot(struct btrfs_root *root,
				   struct extent_buffer *parent, int slot)
754
{
755
	int level = btrfs_header_level(parent);
756 757
	if (slot < 0)
		return NULL;
758
	if (slot >= btrfs_header_nritems(parent))
759
		return NULL;
760 761 762

	BUG_ON(level == 0);

763
	return read_tree_block(root, btrfs_node_blockptr(parent, slot),
764 765
		       btrfs_level_size(root, level - 1),
		       btrfs_node_ptr_generation(parent, slot));
766 767
}

768 769 770
static int balance_level(struct btrfs_trans_handle *trans,
			 struct btrfs_root *root,
			 struct btrfs_path *path, int level)
771
{
772 773 774 775
	struct extent_buffer *right = NULL;
	struct extent_buffer *mid;
	struct extent_buffer *left = NULL;
	struct extent_buffer *parent = NULL;
776 777 778 779
	int ret = 0;
	int wret;
	int pslot;
	int orig_slot = path->slots[level];
780
	int err_on_enospc = 0;
781
	u64 orig_ptr;
782 783 784 785

	if (level == 0)
		return 0;

786
	mid = path->nodes[level];
787
	WARN_ON(!path->locks[level]);
788 789
	WARN_ON(btrfs_header_generation(mid) != trans->transid);

790
	orig_ptr = btrfs_node_blockptr(mid, orig_slot);
791

C
Chris Mason 已提交
792
	if (level < BTRFS_MAX_LEVEL - 1)
793
		parent = path->nodes[level + 1];
794 795
	pslot = path->slots[level + 1];

C
Chris Mason 已提交
796 797 798 799
	/*
	 * deal with the case where there is only one pointer in the root
	 * by promoting the node below to a root
	 */
800 801
	if (!parent) {
		struct extent_buffer *child;
802

803
		if (btrfs_header_nritems(mid) != 1)
804 805 806
			return 0;

		/* promote the child to a root */
807
		child = read_node_slot(root, mid, 0);
808
		btrfs_tree_lock(child);
809
		BUG_ON(!child);
810 811 812
		ret = btrfs_cow_block(trans, root, child, mid, 0, &child);
		BUG_ON(ret);

813
		spin_lock(&root->node_lock);
814
		root->node = child;
815 816
		spin_unlock(&root->node_lock);

817
		add_root_to_dirty_list(root);
818 819
		btrfs_tree_unlock(child);
		path->locks[level] = 0;
820
		path->nodes[level] = NULL;
821
		clean_tree_block(trans, root, mid);
822
		btrfs_tree_unlock(mid);
823
		/* once for the path */
824
		free_extent_buffer(mid);
825 826 827
		ret = btrfs_free_extent(trans, root, mid->start, mid->len,
					root->root_key.objectid,
					btrfs_header_generation(mid), 0, 0, 1);
828
		/* once for the root ptr */
829
		free_extent_buffer(mid);
830
		return ret;
831
	}
832
	if (btrfs_header_nritems(mid) >
C
Chris Mason 已提交
833
	    BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
834 835
		return 0;

836
	if (btrfs_header_nritems(mid) < 2)
837 838
		err_on_enospc = 1;

839 840
	left = read_node_slot(root, parent, pslot - 1);
	if (left) {
841
		btrfs_tree_lock(left);
842 843
		wret = btrfs_cow_block(trans, root, left,
				       parent, pslot - 1, &left);
844 845 846 847
		if (wret) {
			ret = wret;
			goto enospc;
		}
848
	}
849 850
	right = read_node_slot(root, parent, pslot + 1);
	if (right) {
851
		btrfs_tree_lock(right);
852 853
		wret = btrfs_cow_block(trans, root, right,
				       parent, pslot + 1, &right);
854 855 856 857 858 859 860
		if (wret) {
			ret = wret;
			goto enospc;
		}
	}

	/* first, try to make some room in the middle buffer */
861 862
	if (left) {
		orig_slot += btrfs_header_nritems(left);
863
		wret = push_node_left(trans, root, left, mid, 1);
864 865
		if (wret < 0)
			ret = wret;
866
		if (btrfs_header_nritems(mid) < 2)
867
			err_on_enospc = 1;
868
	}
869 870 871 872

	/*
	 * then try to empty the right most buffer into the middle
	 */
873
	if (right) {
874
		wret = push_node_left(trans, root, mid, right, 1);
875
		if (wret < 0 && wret != -ENOSPC)
876
			ret = wret;
877
		if (btrfs_header_nritems(right) == 0) {
878
			u64 bytenr = right->start;
879
			u64 generation = btrfs_header_generation(parent);
880 881
			u32 blocksize = right->len;

882
			clean_tree_block(trans, root, right);
883
			btrfs_tree_unlock(right);
884
			free_extent_buffer(right);
885
			right = NULL;
886 887
			wret = del_ptr(trans, root, path, level + 1, pslot +
				       1);
888 889
			if (wret)
				ret = wret;
890
			wret = btrfs_free_extent(trans, root, bytenr,
891 892 893
						 blocksize,
						 btrfs_header_owner(parent),
						 generation, 0, 0, 1);
894 895 896
			if (wret)
				ret = wret;
		} else {
897 898 899 900
			struct btrfs_disk_key right_key;
			btrfs_node_key(right, &right_key, 0);
			btrfs_set_node_key(parent, &right_key, pslot + 1);
			btrfs_mark_buffer_dirty(parent);
901 902
		}
	}
903
	if (btrfs_header_nritems(mid) == 1) {
904 905 906 907 908 909 910 911 912
		/*
		 * we're not allowed to leave a node with one item in the
		 * tree during a delete.  A deletion from lower in the tree
		 * could try to delete the only pointer in this node.
		 * So, pull some keys from the left.
		 * There has to be a left pointer at this point because
		 * otherwise we would have pulled some pointers from the
		 * right
		 */
913 914
		BUG_ON(!left);
		wret = balance_node_right(trans, root, mid, left);
915
		if (wret < 0) {
916
			ret = wret;
917 918
			goto enospc;
		}
919 920 921 922 923
		if (wret == 1) {
			wret = push_node_left(trans, root, left, mid, 1);
			if (wret < 0)
				ret = wret;
		}
924 925
		BUG_ON(wret == 1);
	}
926
	if (btrfs_header_nritems(mid) == 0) {
927
		/* we've managed to empty the middle node, drop it */
928
		u64 root_gen = btrfs_header_generation(parent);
929 930
		u64 bytenr = mid->start;
		u32 blocksize = mid->len;
931

932
		clean_tree_block(trans, root, mid);
933
		btrfs_tree_unlock(mid);
934
		free_extent_buffer(mid);
935
		mid = NULL;
936
		wret = del_ptr(trans, root, path, level + 1, pslot);
937 938
		if (wret)
			ret = wret;
939 940 941
		wret = btrfs_free_extent(trans, root, bytenr, blocksize,
					 btrfs_header_owner(parent),
					 root_gen, 0, 0, 1);
942 943
		if (wret)
			ret = wret;
944 945
	} else {
		/* update the parent key to reflect our changes */
946 947 948 949
		struct btrfs_disk_key mid_key;
		btrfs_node_key(mid, &mid_key, 0);
		btrfs_set_node_key(parent, &mid_key, pslot);
		btrfs_mark_buffer_dirty(parent);
950
	}
951

952
	/* update the path */
953 954 955
	if (left) {
		if (btrfs_header_nritems(left) > orig_slot) {
			extent_buffer_get(left);
956
			/* left was locked after cow */
957
			path->nodes[level] = left;
958 959
			path->slots[level + 1] -= 1;
			path->slots[level] = orig_slot;
960 961
			if (mid) {
				btrfs_tree_unlock(mid);
962
				free_extent_buffer(mid);
963
			}
964
		} else {
965
			orig_slot -= btrfs_header_nritems(left);
966 967 968
			path->slots[level] = orig_slot;
		}
	}
969
	/* double check we haven't messed things up */
C
Chris Mason 已提交
970
	check_block(root, path, level);
C
Chris Mason 已提交
971
	if (orig_ptr !=
972
	    btrfs_node_blockptr(path->nodes[level], path->slots[level]))
973
		BUG();
974
enospc:
975 976
	if (right) {
		btrfs_tree_unlock(right);
977
		free_extent_buffer(right);
978 979 980 981
	}
	if (left) {
		if (path->nodes[level] != left)
			btrfs_tree_unlock(left);
982
		free_extent_buffer(left);
983
	}
984 985 986
	return ret;
}

987
/* returns zero if the push worked, non-zero otherwise */
988 989 990
static int noinline push_nodes_for_insert(struct btrfs_trans_handle *trans,
					  struct btrfs_root *root,
					  struct btrfs_path *path, int level)
991
{
992 993 994 995
	struct extent_buffer *right = NULL;
	struct extent_buffer *mid;
	struct extent_buffer *left = NULL;
	struct extent_buffer *parent = NULL;
996 997 998 999 1000 1001 1002 1003 1004
	int ret = 0;
	int wret;
	int pslot;
	int orig_slot = path->slots[level];
	u64 orig_ptr;

	if (level == 0)
		return 1;

1005
	mid = path->nodes[level];
1006
	WARN_ON(btrfs_header_generation(mid) != trans->transid);
1007 1008 1009
	orig_ptr = btrfs_node_blockptr(mid, orig_slot);

	if (level < BTRFS_MAX_LEVEL - 1)
1010
		parent = path->nodes[level + 1];
1011 1012
	pslot = path->slots[level + 1];

1013
	if (!parent)
1014 1015
		return 1;

1016
	left = read_node_slot(root, parent, pslot - 1);
1017 1018

	/* first, try to make some room in the middle buffer */
1019
	if (left) {
1020
		u32 left_nr;
1021 1022

		btrfs_tree_lock(left);
1023
		left_nr = btrfs_header_nritems(left);
C
Chris Mason 已提交
1024 1025 1026
		if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
			wret = 1;
		} else {
1027 1028
			ret = btrfs_cow_block(trans, root, left, parent,
					      pslot - 1, &left);
1029 1030 1031 1032
			if (ret)
				wret = 1;
			else {
				wret = push_node_left(trans, root,
1033
						      left, mid, 0);
1034
			}
C
Chris Mason 已提交
1035
		}
1036 1037 1038
		if (wret < 0)
			ret = wret;
		if (wret == 0) {
1039
			struct btrfs_disk_key disk_key;
1040
			orig_slot += left_nr;
1041 1042 1043 1044 1045
			btrfs_node_key(mid, &disk_key, 0);
			btrfs_set_node_key(parent, &disk_key, pslot);
			btrfs_mark_buffer_dirty(parent);
			if (btrfs_header_nritems(left) > orig_slot) {
				path->nodes[level] = left;
1046 1047
				path->slots[level + 1] -= 1;
				path->slots[level] = orig_slot;
1048
				btrfs_tree_unlock(mid);
1049
				free_extent_buffer(mid);
1050 1051
			} else {
				orig_slot -=
1052
					btrfs_header_nritems(left);
1053
				path->slots[level] = orig_slot;
1054
				btrfs_tree_unlock(left);
1055
				free_extent_buffer(left);
1056 1057 1058
			}
			return 0;
		}
1059
		btrfs_tree_unlock(left);
1060
		free_extent_buffer(left);
1061
	}
1062
	right = read_node_slot(root, parent, pslot + 1);
1063 1064 1065 1066

	/*
	 * then try to empty the right most buffer into the middle
	 */
1067
	if (right) {
C
Chris Mason 已提交
1068
		u32 right_nr;
1069
		btrfs_tree_lock(right);
1070
		right_nr = btrfs_header_nritems(right);
C
Chris Mason 已提交
1071 1072 1073
		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
			wret = 1;
		} else {
1074 1075 1076
			ret = btrfs_cow_block(trans, root, right,
					      parent, pslot + 1,
					      &right);
1077 1078 1079 1080
			if (ret)
				wret = 1;
			else {
				wret = balance_node_right(trans, root,
1081
							  right, mid);
1082
			}
C
Chris Mason 已提交
1083
		}
1084 1085 1086
		if (wret < 0)
			ret = wret;
		if (wret == 0) {
1087 1088 1089 1090 1091 1092 1093 1094
			struct btrfs_disk_key disk_key;

			btrfs_node_key(right, &disk_key, 0);
			btrfs_set_node_key(parent, &disk_key, pslot + 1);
			btrfs_mark_buffer_dirty(parent);

			if (btrfs_header_nritems(mid) <= orig_slot) {
				path->nodes[level] = right;
1095 1096
				path->slots[level + 1] += 1;
				path->slots[level] = orig_slot -
1097
					btrfs_header_nritems(mid);
1098
				btrfs_tree_unlock(mid);
1099
				free_extent_buffer(mid);
1100
			} else {
1101
				btrfs_tree_unlock(right);
1102
				free_extent_buffer(right);
1103 1104 1105
			}
			return 0;
		}
1106
		btrfs_tree_unlock(right);
1107
		free_extent_buffer(right);
1108 1109 1110 1111
	}
	return 1;
}

1112 1113 1114 1115
/*
 * readahead one full node of leaves
 */
static void reada_for_search(struct btrfs_root *root, struct btrfs_path *path,
1116
			     int level, int slot, u64 objectid)
1117
{
1118
	struct extent_buffer *node;
1119
	struct btrfs_disk_key disk_key;
1120 1121
	u32 nritems;
	u64 search;
1122 1123 1124
	u64 lowest_read;
	u64 highest_read;
	u64 nread = 0;
1125
	int direction = path->reada;
1126
	struct extent_buffer *eb;
1127 1128 1129
	u32 nr;
	u32 blocksize;
	u32 nscan = 0;
1130

1131
	if (level != 1)
1132 1133 1134
		return;

	if (!path->nodes[level])
1135 1136
		return;

1137
	node = path->nodes[level];
1138

1139
	search = btrfs_node_blockptr(node, slot);
1140 1141
	blocksize = btrfs_level_size(root, level - 1);
	eb = btrfs_find_tree_block(root, search, blocksize);
1142 1143
	if (eb) {
		free_extent_buffer(eb);
1144 1145 1146
		return;
	}

1147 1148 1149
	highest_read = search;
	lowest_read = search;

1150
	nritems = btrfs_header_nritems(node);
1151
	nr = slot;
1152
	while(1) {
1153 1154 1155 1156 1157 1158 1159 1160
		if (direction < 0) {
			if (nr == 0)
				break;
			nr--;
		} else if (direction > 0) {
			nr++;
			if (nr >= nritems)
				break;
1161
		}
1162 1163 1164 1165 1166
		if (path->reada < 0 && objectid) {
			btrfs_node_key(node, &disk_key, nr);
			if (btrfs_disk_key_objectid(&disk_key) != objectid)
				break;
		}
1167 1168 1169 1170
		search = btrfs_node_blockptr(node, nr);
		if ((search >= lowest_read && search <= highest_read) ||
		    (search < lowest_read && lowest_read - search <= 32768) ||
		    (search > highest_read && search - highest_read <= 32768)) {
1171 1172
			readahead_tree_block(root, search, blocksize,
				     btrfs_node_ptr_generation(node, nr));
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
			nread += blocksize;
		}
		nscan++;
		if (path->reada < 2 && (nread > (256 * 1024) || nscan > 32))
			break;
		if(nread > (1024 * 1024) || nscan > 128)
			break;

		if (search < lowest_read)
			lowest_read = search;
		if (search > highest_read)
			highest_read = search;
1185 1186
	}
}
1187 1188 1189 1190 1191

static void unlock_up(struct btrfs_path *path, int level, int lowest_unlock)
{
	int i;
	int skip_level = level;
1192
	int no_skips = 0;
1193 1194 1195 1196 1197 1198 1199
	struct extent_buffer *t;

	for (i = level; i < BTRFS_MAX_LEVEL; i++) {
		if (!path->nodes[i])
			break;
		if (!path->locks[i])
			break;
1200
		if (!no_skips && path->slots[i] == 0) {
1201 1202 1203
			skip_level = i + 1;
			continue;
		}
1204
		if (!no_skips && path->keep_locks) {
1205 1206 1207
			u32 nritems;
			t = path->nodes[i];
			nritems = btrfs_header_nritems(t);
1208
			if (nritems < 1 || path->slots[i] >= nritems - 1) {
1209 1210 1211 1212
				skip_level = i + 1;
				continue;
			}
		}
1213 1214 1215
		if (skip_level < i && i >= lowest_unlock)
			no_skips = 1;

1216 1217 1218 1219 1220 1221 1222 1223
		t = path->nodes[i];
		if (i >= lowest_unlock && i > skip_level && path->locks[i]) {
			btrfs_tree_unlock(t);
			path->locks[i] = 0;
		}
	}
}

C
Chris Mason 已提交
1224 1225 1226 1227 1228 1229
/*
 * look for key in the tree.  path is filled in with nodes along the way
 * if key is found, we return zero and you can find the item in the leaf
 * level of the path (level 0)
 *
 * If the key isn't found, the path points to the slot where it should
C
Chris Mason 已提交
1230 1231
 * be inserted, and 1 is returned.  If there are other errors during the
 * search a negative error number is returned.
C
Chris Mason 已提交
1232 1233 1234 1235
 *
 * if ins_len > 0, nodes and leaves will be split as we walk down the
 * tree.  if ins_len < 0, nodes will be merged as we walk down the tree (if
 * possible)
C
Chris Mason 已提交
1236
 */
1237 1238 1239
int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_key *key, struct btrfs_path *p, int
		      ins_len, int cow)
1240
{
1241
	struct extent_buffer *b;
1242
	struct extent_buffer *tmp;
1243 1244 1245
	int slot;
	int ret;
	int level;
1246
	int should_reada = p->reada;
1247
	int lowest_unlock = 1;
1248 1249
	u8 lowest_level = 0;

1250 1251
	lowest_level = p->lowest_level;
	WARN_ON(lowest_level && ins_len);
C
Chris Mason 已提交
1252
	WARN_ON(p->nodes[0] != NULL);
1253 1254 1255 1256 1257 1258 1259 1260
	WARN_ON(root == root->fs_info->extent_root &&
		!mutex_is_locked(&root->fs_info->alloc_mutex));
	WARN_ON(root == root->fs_info->chunk_root &&
		!mutex_is_locked(&root->fs_info->chunk_mutex));
	WARN_ON(root == root->fs_info->dev_root &&
		!mutex_is_locked(&root->fs_info->chunk_mutex));
	if (ins_len < 0)
		lowest_unlock = 2;
1261
again:
1262
	b = btrfs_lock_root_node(root);
1263

1264
	while (b) {
1265
		level = btrfs_header_level(b);
C
Chris Mason 已提交
1266 1267
		if (cow) {
			int wret;
C
Chris Mason 已提交
1268 1269 1270
			wret = btrfs_cow_block(trans, root, b,
					       p->nodes[level + 1],
					       p->slots[level + 1],
Y
Yan 已提交
1271
					       &b);
1272
			if (wret) {
1273
				free_extent_buffer(b);
1274 1275
				return wret;
			}
C
Chris Mason 已提交
1276 1277
		}
		BUG_ON(!cow && ins_len);
1278
		if (level != btrfs_header_level(b))
C
Chris Mason 已提交
1279
			WARN_ON(1);
1280
		level = btrfs_header_level(b);
1281
		p->nodes[level] = b;
1282
		p->locks[level] = 1;
C
Chris Mason 已提交
1283
		ret = check_block(root, p, level);
C
Chris Mason 已提交
1284 1285
		if (ret)
			return -1;
1286

1287 1288
		ret = bin_search(b, key, level, &slot);
		if (level != 0) {
1289 1290 1291
			if (ret && slot > 0)
				slot -= 1;
			p->slots[level] = slot;
1292
			if (ins_len > 0 && btrfs_header_nritems(b) >=
1293
			    BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
1294
				int sret = split_node(trans, root, p, level);
C
Chris Mason 已提交
1295 1296 1297 1298 1299
				BUG_ON(sret > 0);
				if (sret)
					return sret;
				b = p->nodes[level];
				slot = p->slots[level];
1300
			} else if (ins_len < 0) {
1301 1302
				int sret = balance_level(trans, root, p,
							 level);
1303 1304 1305
				if (sret)
					return sret;
				b = p->nodes[level];
1306 1307
				if (!b) {
					btrfs_release_path(NULL, p);
1308
					goto again;
1309
				}
1310
				slot = p->slots[level];
1311
				BUG_ON(btrfs_header_nritems(b) == 1);
C
Chris Mason 已提交
1312
			}
1313
			/* this is only true while dropping a snapshot */
1314 1315
			if (level == lowest_level) {
				unlock_up(p, level, lowest_unlock);
1316
				break;
1317
			}
1318

1319
			if (should_reada)
1320 1321
				reada_for_search(root, p, level, slot,
						 key->objectid);
1322

1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
			tmp = btrfs_find_tree_block(root,
					  btrfs_node_blockptr(b, slot),
					  btrfs_level_size(root, level - 1));
			if (tmp && btrfs_buffer_uptodate(tmp,
				   btrfs_node_ptr_generation(b, slot))) {
				b = tmp;
			} else {
				/*
				 * reduce lock contention at high levels
				 * of the btree by dropping locks before
				 * we read.
				 */
				if (level > 1) {
					btrfs_release_path(NULL, p);
					if (tmp)
						free_extent_buffer(tmp);
					goto again;
				} else {
					b = read_node_slot(root, b, slot);
				}
			}
			btrfs_tree_lock(b);
			unlock_up(p, level, lowest_unlock);
1346 1347
		} else {
			p->slots[level] = slot;
1348
			if (ins_len > 0 && btrfs_leaf_free_space(root, b) <
C
Chris Mason 已提交
1349
			    sizeof(struct btrfs_item) + ins_len) {
1350
				int sret = split_leaf(trans, root, key,
1351
						      p, ins_len, ret == 0);
C
Chris Mason 已提交
1352 1353 1354 1355
				BUG_ON(sret > 0);
				if (sret)
					return sret;
			}
1356
			unlock_up(p, level, lowest_unlock);
1357 1358 1359
			return ret;
		}
	}
C
Chris Mason 已提交
1360
	return 1;
1361 1362
}

C
Chris Mason 已提交
1363 1364 1365 1366 1367 1368
/*
 * adjust the pointers going up the tree, starting at level
 * making sure the right key of each node is points to 'key'.
 * This is used after shifting pointers to the left, so it stops
 * fixing up pointers when a given leaf/node is not in slot 0 of the
 * higher levels
C
Chris Mason 已提交
1369 1370 1371
 *
 * If this fails to write a tree block, it returns -1, but continues
 * fixing up the blocks in ram so the tree is consistent.
C
Chris Mason 已提交
1372
 */
1373 1374 1375
static int fixup_low_keys(struct btrfs_trans_handle *trans,
			  struct btrfs_root *root, struct btrfs_path *path,
			  struct btrfs_disk_key *key, int level)
1376 1377
{
	int i;
C
Chris Mason 已提交
1378
	int ret = 0;
1379 1380
	struct extent_buffer *t;

C
Chris Mason 已提交
1381
	for (i = level; i < BTRFS_MAX_LEVEL; i++) {
1382
		int tslot = path->slots[i];
1383
		if (!path->nodes[i])
1384
			break;
1385 1386
		t = path->nodes[i];
		btrfs_set_node_key(t, key, tslot);
1387 1388 1389 1390 1391 1392 1393
		if (!btrfs_tree_locked(path->nodes[i])) {
			int ii;
printk("fixup without lock on level %d\n", btrfs_header_level(path->nodes[i]));
			for (ii = 0; ii < BTRFS_MAX_LEVEL; ii++) {
printk("level %d slot %d\n", ii, path->slots[ii]);
			}
		}
C
Chris Mason 已提交
1394
		btrfs_mark_buffer_dirty(path->nodes[i]);
1395 1396 1397
		if (tslot != 0)
			break;
	}
C
Chris Mason 已提交
1398
	return ret;
1399 1400
}

C
Chris Mason 已提交
1401 1402
/*
 * try to push data from one node into the next node left in the
1403
 * tree.
C
Chris Mason 已提交
1404 1405 1406
 *
 * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
 * error, and > 0 if there was no room in the left hand block.
C
Chris Mason 已提交
1407
 */
1408 1409
static int push_node_left(struct btrfs_trans_handle *trans,
			  struct btrfs_root *root, struct extent_buffer *dst,
1410
			  struct extent_buffer *src, int empty)
1411 1412
{
	int push_items = 0;
1413 1414
	int src_nritems;
	int dst_nritems;
C
Chris Mason 已提交
1415
	int ret = 0;
1416

1417 1418
	src_nritems = btrfs_header_nritems(src);
	dst_nritems = btrfs_header_nritems(dst);
C
Chris Mason 已提交
1419
	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
1420 1421
	WARN_ON(btrfs_header_generation(src) != trans->transid);
	WARN_ON(btrfs_header_generation(dst) != trans->transid);
1422

1423
	if (!empty && src_nritems <= 8)
1424 1425
		return 1;

1426
	if (push_items <= 0) {
1427
		return 1;
1428
	}
1429

1430
	if (empty) {
1431
		push_items = min(src_nritems, push_items);
1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
		if (push_items < src_nritems) {
			/* leave at least 8 pointers in the node if
			 * we aren't going to empty it
			 */
			if (src_nritems - push_items < 8) {
				if (push_items <= 8)
					return 1;
				push_items -= 8;
			}
		}
	} else
		push_items = min(src_nritems - 8, push_items);
1444

1445 1446 1447 1448 1449
	copy_extent_buffer(dst, src,
			   btrfs_node_key_ptr_offset(dst_nritems),
			   btrfs_node_key_ptr_offset(0),
		           push_items * sizeof(struct btrfs_key_ptr));

1450
	if (push_items < src_nritems) {
1451 1452 1453 1454 1455 1456 1457 1458 1459
		memmove_extent_buffer(src, btrfs_node_key_ptr_offset(0),
				      btrfs_node_key_ptr_offset(push_items),
				      (src_nritems - push_items) *
				      sizeof(struct btrfs_key_ptr));
	}
	btrfs_set_header_nritems(src, src_nritems - push_items);
	btrfs_set_header_nritems(dst, dst_nritems + push_items);
	btrfs_mark_buffer_dirty(src);
	btrfs_mark_buffer_dirty(dst);
1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471
	return ret;
}

/*
 * try to push data from one node into the next node right in the
 * tree.
 *
 * returns 0 if some ptrs were pushed, < 0 if there was some horrible
 * error, and > 0 if there was no room in the right hand block.
 *
 * this will  only push up to 1/2 the contents of the left node over
 */
1472 1473 1474 1475
static int balance_node_right(struct btrfs_trans_handle *trans,
			      struct btrfs_root *root,
			      struct extent_buffer *dst,
			      struct extent_buffer *src)
1476 1477 1478 1479 1480 1481 1482
{
	int push_items = 0;
	int max_push;
	int src_nritems;
	int dst_nritems;
	int ret = 0;

1483 1484 1485
	WARN_ON(btrfs_header_generation(src) != trans->transid);
	WARN_ON(btrfs_header_generation(dst) != trans->transid);

1486 1487
	src_nritems = btrfs_header_nritems(src);
	dst_nritems = btrfs_header_nritems(dst);
C
Chris Mason 已提交
1488
	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
1489
	if (push_items <= 0) {
1490
		return 1;
1491 1492 1493 1494 1495
	}

	if (src_nritems < 4) {
		return 1;
	}
1496 1497 1498

	max_push = src_nritems / 2 + 1;
	/* don't try to empty the node */
1499
	if (max_push >= src_nritems) {
1500
		return 1;
1501
	}
Y
Yan 已提交
1502

1503 1504 1505
	if (max_push < push_items)
		push_items = max_push;

1506 1507 1508 1509
	memmove_extent_buffer(dst, btrfs_node_key_ptr_offset(push_items),
				      btrfs_node_key_ptr_offset(0),
				      (dst_nritems) *
				      sizeof(struct btrfs_key_ptr));
C
Chris Mason 已提交
1510

1511 1512 1513 1514
	copy_extent_buffer(dst, src,
			   btrfs_node_key_ptr_offset(0),
			   btrfs_node_key_ptr_offset(src_nritems - push_items),
		           push_items * sizeof(struct btrfs_key_ptr));
1515

1516 1517
	btrfs_set_header_nritems(src, src_nritems - push_items);
	btrfs_set_header_nritems(dst, dst_nritems + push_items);
1518

1519 1520
	btrfs_mark_buffer_dirty(src);
	btrfs_mark_buffer_dirty(dst);
C
Chris Mason 已提交
1521
	return ret;
1522 1523
}

C
Chris Mason 已提交
1524 1525 1526 1527
/*
 * helper function to insert a new root level in the tree.
 * A new node is allocated, and a single item is inserted to
 * point to the existing root
C
Chris Mason 已提交
1528 1529
 *
 * returns zero on success or < 0 on failure.
C
Chris Mason 已提交
1530
 */
1531
static int noinline insert_new_root(struct btrfs_trans_handle *trans,
1532 1533
			   struct btrfs_root *root,
			   struct btrfs_path *path, int level)
C
Chris Mason 已提交
1534
{
1535 1536
	u64 root_gen;
	u64 lower_gen;
1537 1538
	struct extent_buffer *lower;
	struct extent_buffer *c;
1539
	struct extent_buffer *old;
1540
	struct btrfs_disk_key lower_key;
C
Chris Mason 已提交
1541 1542 1543 1544

	BUG_ON(path->nodes[level]);
	BUG_ON(path->nodes[level-1] != root->node);

1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

	lower = path->nodes[level-1];
	if (level == 1)
		btrfs_item_key(lower, &lower_key, 0);
	else
		btrfs_node_key(lower, &lower_key, 0);

1556
	c = btrfs_alloc_free_block(trans, root, root->nodesize,
1557 1558
				   root->root_key.objectid,
				   root_gen, lower_key.objectid, level,
1559
				   root->node->start, 0);
1560 1561
	if (IS_ERR(c))
		return PTR_ERR(c);
1562

1563 1564 1565
	memset_extent_buffer(c, 0, 0, root->nodesize);
	btrfs_set_header_nritems(c, 1);
	btrfs_set_header_level(c, level);
1566
	btrfs_set_header_bytenr(c, c->start);
1567 1568 1569 1570 1571 1572
	btrfs_set_header_generation(c, trans->transid);
	btrfs_set_header_owner(c, root->root_key.objectid);

	write_extent_buffer(c, root->fs_info->fsid,
			    (unsigned long)btrfs_header_fsid(c),
			    BTRFS_FSID_SIZE);
1573 1574 1575 1576 1577

	write_extent_buffer(c, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(c),
			    BTRFS_UUID_SIZE);

1578
	btrfs_set_node_key(c, &lower_key, 0);
1579
	btrfs_set_node_blockptr(c, 0, lower->start);
1580 1581 1582 1583
	lower_gen = btrfs_header_generation(lower);
	WARN_ON(lower_gen == 0);

	btrfs_set_node_ptr_generation(c, 0, lower_gen);
1584

1585
	btrfs_mark_buffer_dirty(c);
1586

1587 1588
	spin_lock(&root->node_lock);
	old = root->node;
1589
	root->node = c;
1590 1591 1592 1593 1594
	spin_unlock(&root->node_lock);

	/* the super has an extra ref to root->node */
	free_extent_buffer(old);

1595
	add_root_to_dirty_list(root);
1596 1597
	extent_buffer_get(c);
	path->nodes[level] = c;
1598
	path->locks[level] = 1;
C
Chris Mason 已提交
1599
	path->slots[level] = 0;
1600 1601 1602 1603

	if (root->ref_cows && lower_gen != trans->transid) {
		struct btrfs_path *back_path = btrfs_alloc_path();
		int ret;
1604
		mutex_lock(&root->fs_info->alloc_mutex);
1605 1606 1607 1608 1609 1610
		ret = btrfs_insert_extent_backref(trans,
						  root->fs_info->extent_root,
						  path, lower->start,
						  root->root_key.objectid,
						  trans->transid, 0, 0);
		BUG_ON(ret);
1611
		mutex_unlock(&root->fs_info->alloc_mutex);
1612 1613
		btrfs_free_path(back_path);
	}
C
Chris Mason 已提交
1614 1615 1616
	return 0;
}

C
Chris Mason 已提交
1617 1618 1619
/*
 * worker function to insert a single pointer in a node.
 * the node should have enough room for the pointer already
C
Chris Mason 已提交
1620
 *
C
Chris Mason 已提交
1621 1622
 * slot and level indicate where you want the key to go, and
 * blocknr is the block the key points to.
C
Chris Mason 已提交
1623 1624
 *
 * returns zero on success and < 0 on any error
C
Chris Mason 已提交
1625
 */
1626 1627
static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, struct btrfs_disk_key
1628
		      *key, u64 bytenr, int slot, int level)
C
Chris Mason 已提交
1629
{
1630
	struct extent_buffer *lower;
C
Chris Mason 已提交
1631
	int nritems;
C
Chris Mason 已提交
1632 1633

	BUG_ON(!path->nodes[level]);
1634 1635
	lower = path->nodes[level];
	nritems = btrfs_header_nritems(lower);
C
Chris Mason 已提交
1636 1637
	if (slot > nritems)
		BUG();
C
Chris Mason 已提交
1638
	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
C
Chris Mason 已提交
1639 1640
		BUG();
	if (slot != nritems) {
1641 1642 1643
		memmove_extent_buffer(lower,
			      btrfs_node_key_ptr_offset(slot + 1),
			      btrfs_node_key_ptr_offset(slot),
C
Chris Mason 已提交
1644
			      (nritems - slot) * sizeof(struct btrfs_key_ptr));
C
Chris Mason 已提交
1645
	}
1646
	btrfs_set_node_key(lower, key, slot);
1647
	btrfs_set_node_blockptr(lower, slot, bytenr);
1648 1649
	WARN_ON(trans->transid == 0);
	btrfs_set_node_ptr_generation(lower, slot, trans->transid);
1650 1651
	btrfs_set_header_nritems(lower, nritems + 1);
	btrfs_mark_buffer_dirty(lower);
C
Chris Mason 已提交
1652 1653 1654
	return 0;
}

C
Chris Mason 已提交
1655 1656 1657 1658 1659 1660
/*
 * split the node at the specified level in path in two.
 * The path is corrected to point to the appropriate node after the split
 *
 * Before splitting this tries to make some room in the node by pushing
 * left and right, if either one works, it returns right away.
C
Chris Mason 已提交
1661 1662
 *
 * returns 0 on success and < 0 on failure
C
Chris Mason 已提交
1663
 */
1664 1665
static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, int level)
1666
{
1667
	u64 root_gen;
1668 1669 1670
	struct extent_buffer *c;
	struct extent_buffer *split;
	struct btrfs_disk_key disk_key;
1671
	int mid;
C
Chris Mason 已提交
1672
	int ret;
C
Chris Mason 已提交
1673
	int wret;
1674
	u32 c_nritems;
1675

1676
	c = path->nodes[level];
1677
	WARN_ON(btrfs_header_generation(c) != trans->transid);
1678
	if (c == root->node) {
C
Chris Mason 已提交
1679
		/* trying to split the root, lets make a new one */
1680
		ret = insert_new_root(trans, root, path, level + 1);
C
Chris Mason 已提交
1681 1682
		if (ret)
			return ret;
1683 1684
	} else {
		ret = push_nodes_for_insert(trans, root, path, level);
1685 1686
		c = path->nodes[level];
		if (!ret && btrfs_header_nritems(c) <
1687
		    BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
1688
			return 0;
1689 1690
		if (ret < 0)
			return ret;
1691
	}
1692

1693
	c_nritems = btrfs_header_nritems(c);
1694 1695 1696 1697 1698 1699
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

	btrfs_node_key(c, &disk_key, 0);
1700
	split = btrfs_alloc_free_block(trans, root, root->nodesize,
1701 1702 1703 1704
					 root->root_key.objectid,
					 root_gen,
					 btrfs_disk_key_objectid(&disk_key),
					 level, c->start, 0);
1705 1706 1707 1708 1709
	if (IS_ERR(split))
		return PTR_ERR(split);

	btrfs_set_header_flags(split, btrfs_header_flags(c));
	btrfs_set_header_level(split, btrfs_header_level(c));
1710
	btrfs_set_header_bytenr(split, split->start);
1711 1712
	btrfs_set_header_generation(split, trans->transid);
	btrfs_set_header_owner(split, root->root_key.objectid);
1713
	btrfs_set_header_flags(split, 0);
1714 1715 1716
	write_extent_buffer(split, root->fs_info->fsid,
			    (unsigned long)btrfs_header_fsid(split),
			    BTRFS_FSID_SIZE);
1717 1718 1719
	write_extent_buffer(split, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(split),
			    BTRFS_UUID_SIZE);
1720

1721
	mid = (c_nritems + 1) / 2;
1722 1723 1724 1725 1726 1727 1728

	copy_extent_buffer(split, c,
			   btrfs_node_key_ptr_offset(0),
			   btrfs_node_key_ptr_offset(mid),
			   (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
	btrfs_set_header_nritems(split, c_nritems - mid);
	btrfs_set_header_nritems(c, mid);
C
Chris Mason 已提交
1729 1730
	ret = 0;

1731 1732 1733 1734
	btrfs_mark_buffer_dirty(c);
	btrfs_mark_buffer_dirty(split);

	btrfs_node_key(split, &disk_key, 0);
1735
	wret = insert_ptr(trans, root, path, &disk_key, split->start,
1736
			  path->slots[level + 1] + 1,
C
Chris Mason 已提交
1737
			  level + 1);
C
Chris Mason 已提交
1738 1739 1740
	if (wret)
		ret = wret;

C
Chris Mason 已提交
1741
	if (path->slots[level] >= mid) {
C
Chris Mason 已提交
1742
		path->slots[level] -= mid;
1743
		btrfs_tree_unlock(c);
1744 1745
		free_extent_buffer(c);
		path->nodes[level] = split;
C
Chris Mason 已提交
1746 1747
		path->slots[level + 1] += 1;
	} else {
1748
		btrfs_tree_unlock(split);
1749
		free_extent_buffer(split);
1750
	}
C
Chris Mason 已提交
1751
	return ret;
1752 1753
}

C
Chris Mason 已提交
1754 1755 1756 1757 1758
/*
 * how many bytes are required to store the items in a leaf.  start
 * and nr indicate which items in the leaf to check.  This totals up the
 * space used both by the item structs and the item data
 */
1759
static int leaf_space_used(struct extent_buffer *l, int start, int nr)
1760 1761
{
	int data_len;
1762
	int nritems = btrfs_header_nritems(l);
1763
	int end = min(nritems, start + nr) - 1;
1764 1765 1766

	if (!nr)
		return 0;
1767 1768
	data_len = btrfs_item_end_nr(l, start);
	data_len = data_len - btrfs_item_offset_nr(l, end);
C
Chris Mason 已提交
1769
	data_len += sizeof(struct btrfs_item) * nr;
1770
	WARN_ON(data_len < 0);
1771 1772 1773
	return data_len;
}

1774 1775 1776 1777 1778
/*
 * The space between the end of the leaf items and
 * the start of the leaf data.  IOW, how much room
 * the leaf has left for both items and data
 */
1779
int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf)
1780
{
1781 1782 1783 1784 1785
	int nritems = btrfs_header_nritems(leaf);
	int ret;
	ret = BTRFS_LEAF_DATA_SIZE(root) - leaf_space_used(leaf, 0, nritems);
	if (ret < 0) {
		printk("leaf free space ret %d, leaf data size %lu, used %d nritems %d\n",
J
Jens Axboe 已提交
1786
		       ret, (unsigned long) BTRFS_LEAF_DATA_SIZE(root),
1787 1788 1789
		       leaf_space_used(leaf, 0, nritems), nritems);
	}
	return ret;
1790 1791
}

C
Chris Mason 已提交
1792 1793 1794
/*
 * push some data in the path leaf to the right, trying to free up at
 * least data_size bytes.  returns zero if the push worked, nonzero otherwise
C
Chris Mason 已提交
1795 1796 1797
 *
 * returns 1 if the push failed because the other node didn't have enough
 * room, 0 if everything worked out and < 0 if there were major errors.
C
Chris Mason 已提交
1798
 */
1799
static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
1800 1801
			   *root, struct btrfs_path *path, int data_size,
			   int empty)
C
Chris Mason 已提交
1802
{
1803 1804 1805 1806
	struct extent_buffer *left = path->nodes[0];
	struct extent_buffer *right;
	struct extent_buffer *upper;
	struct btrfs_disk_key disk_key;
C
Chris Mason 已提交
1807
	int slot;
1808
	u32 i;
C
Chris Mason 已提交
1809 1810 1811
	int free_space;
	int push_space = 0;
	int push_items = 0;
C
Chris Mason 已提交
1812
	struct btrfs_item *item;
1813
	u32 left_nritems;
1814
	u32 nr;
1815
	u32 right_nritems;
1816
	u32 data_end;
1817
	u32 this_item_size;
1818
	int ret;
C
Chris Mason 已提交
1819 1820 1821 1822 1823 1824

	slot = path->slots[1];
	if (!path->nodes[1]) {
		return 1;
	}
	upper = path->nodes[1];
1825
	if (slot >= btrfs_header_nritems(upper) - 1)
C
Chris Mason 已提交
1826
		return 1;
1827

1828 1829
	WARN_ON(!btrfs_tree_locked(path->nodes[1]));

1830
	right = read_node_slot(root, upper, slot + 1);
1831
	btrfs_tree_lock(right);
C
Chris Mason 已提交
1832
	free_space = btrfs_leaf_free_space(root, right);
1833 1834
	if (free_space < data_size + sizeof(struct btrfs_item))
		goto out_unlock;
1835

C
Chris Mason 已提交
1836
	/* cow and double check */
1837 1838
	ret = btrfs_cow_block(trans, root, right, upper,
			      slot + 1, &right);
1839 1840 1841
	if (ret)
		goto out_unlock;

C
Chris Mason 已提交
1842
	free_space = btrfs_leaf_free_space(root, right);
1843 1844
	if (free_space < data_size + sizeof(struct btrfs_item))
		goto out_unlock;
C
Chris Mason 已提交
1845

1846
	left_nritems = btrfs_header_nritems(left);
1847 1848
	if (left_nritems == 0)
		goto out_unlock;
1849

1850 1851 1852 1853 1854 1855 1856
	if (empty)
		nr = 0;
	else
		nr = 1;

	i = left_nritems - 1;
	while (i >= nr) {
1857
		item = btrfs_item_nr(left, i);
1858

C
Chris Mason 已提交
1859 1860
		if (path->slots[0] == i)
			push_space += data_size + sizeof(*item);
1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871

		if (!left->map_token) {
			map_extent_buffer(left, (unsigned long)item,
					sizeof(struct btrfs_item),
					&left->map_token, &left->kaddr,
					&left->map_start, &left->map_len,
					KM_USER1);
		}

		this_item_size = btrfs_item_size(left, item);
		if (this_item_size + sizeof(*item) + push_space > free_space)
C
Chris Mason 已提交
1872 1873
			break;
		push_items++;
1874
		push_space += this_item_size + sizeof(*item);
1875 1876 1877
		if (i == 0)
			break;
		i--;
1878 1879 1880 1881
	}
	if (left->map_token) {
		unmap_extent_buffer(left, left->map_token, KM_USER1);
		left->map_token = NULL;
C
Chris Mason 已提交
1882
	}
1883

1884 1885
	if (push_items == 0)
		goto out_unlock;
1886

1887
	if (!empty && push_items == left_nritems)
1888
		WARN_ON(1);
1889

C
Chris Mason 已提交
1890
	/* push left to right */
1891
	right_nritems = btrfs_header_nritems(right);
1892

1893
	push_space = btrfs_item_end_nr(left, left_nritems - push_items);
C
Chris Mason 已提交
1894
	push_space -= leaf_data_end(root, left);
1895

C
Chris Mason 已提交
1896
	/* make room in the right data area */
1897 1898 1899 1900 1901 1902
	data_end = leaf_data_end(root, right);
	memmove_extent_buffer(right,
			      btrfs_leaf_data(right) + data_end - push_space,
			      btrfs_leaf_data(right) + data_end,
			      BTRFS_LEAF_DATA_SIZE(root) - data_end);

C
Chris Mason 已提交
1903
	/* copy from the left data area */
1904
	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
C
Chris Mason 已提交
1905 1906 1907
		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
		     btrfs_leaf_data(left) + leaf_data_end(root, left),
		     push_space);
1908 1909 1910 1911 1912

	memmove_extent_buffer(right, btrfs_item_nr_offset(push_items),
			      btrfs_item_nr_offset(0),
			      right_nritems * sizeof(struct btrfs_item));

C
Chris Mason 已提交
1913
	/* copy the items from left to right */
1914 1915 1916
	copy_extent_buffer(right, left, btrfs_item_nr_offset(0),
		   btrfs_item_nr_offset(left_nritems - push_items),
		   push_items * sizeof(struct btrfs_item));
C
Chris Mason 已提交
1917 1918

	/* update the item pointers */
1919
	right_nritems += push_items;
1920
	btrfs_set_header_nritems(right, right_nritems);
C
Chris Mason 已提交
1921
	push_space = BTRFS_LEAF_DATA_SIZE(root);
1922
	for (i = 0; i < right_nritems; i++) {
1923
		item = btrfs_item_nr(right, i);
1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937
		if (!right->map_token) {
			map_extent_buffer(right, (unsigned long)item,
					sizeof(struct btrfs_item),
					&right->map_token, &right->kaddr,
					&right->map_start, &right->map_len,
					KM_USER1);
		}
		push_space -= btrfs_item_size(right, item);
		btrfs_set_item_offset(right, item, push_space);
	}

	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
C
Chris Mason 已提交
1938
	}
1939
	left_nritems -= push_items;
1940
	btrfs_set_header_nritems(left, left_nritems);
C
Chris Mason 已提交
1941

1942 1943
	if (left_nritems)
		btrfs_mark_buffer_dirty(left);
1944
	btrfs_mark_buffer_dirty(right);
1945

1946 1947
	btrfs_item_key(right, &disk_key, 0);
	btrfs_set_node_key(upper, &disk_key, slot + 1);
C
Chris Mason 已提交
1948
	btrfs_mark_buffer_dirty(upper);
C
Chris Mason 已提交
1949

C
Chris Mason 已提交
1950
	/* then fixup the leaf pointer in the path */
1951 1952
	if (path->slots[0] >= left_nritems) {
		path->slots[0] -= left_nritems;
1953 1954 1955
		if (btrfs_header_nritems(path->nodes[0]) == 0)
			clean_tree_block(trans, root, path->nodes[0]);
		btrfs_tree_unlock(path->nodes[0]);
1956 1957
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = right;
C
Chris Mason 已提交
1958 1959
		path->slots[1] += 1;
	} else {
1960
		btrfs_tree_unlock(right);
1961
		free_extent_buffer(right);
C
Chris Mason 已提交
1962 1963
	}
	return 0;
1964 1965 1966 1967 1968

out_unlock:
	btrfs_tree_unlock(right);
	free_extent_buffer(right);
	return 1;
C
Chris Mason 已提交
1969
}
1970

C
Chris Mason 已提交
1971 1972 1973 1974
/*
 * push some data in the path leaf to the left, trying to free up at
 * least data_size bytes.  returns zero if the push worked, nonzero otherwise
 */
1975
static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
1976 1977
			  *root, struct btrfs_path *path, int data_size,
			  int empty)
1978
{
1979 1980 1981
	struct btrfs_disk_key disk_key;
	struct extent_buffer *right = path->nodes[0];
	struct extent_buffer *left;
1982 1983 1984 1985 1986
	int slot;
	int i;
	int free_space;
	int push_space = 0;
	int push_items = 0;
C
Chris Mason 已提交
1987
	struct btrfs_item *item;
1988
	u32 old_left_nritems;
1989
	u32 right_nritems;
1990
	u32 nr;
C
Chris Mason 已提交
1991 1992
	int ret = 0;
	int wret;
1993 1994
	u32 this_item_size;
	u32 old_left_item_size;
1995 1996

	slot = path->slots[1];
1997
	if (slot == 0)
1998
		return 1;
1999
	if (!path->nodes[1])
2000
		return 1;
2001

2002 2003 2004 2005 2006
	right_nritems = btrfs_header_nritems(right);
	if (right_nritems == 0) {
		return 1;
	}

2007 2008
	WARN_ON(!btrfs_tree_locked(path->nodes[1]));

2009
	left = read_node_slot(root, path->nodes[1], slot - 1);
2010
	btrfs_tree_lock(left);
C
Chris Mason 已提交
2011
	free_space = btrfs_leaf_free_space(root, left);
C
Chris Mason 已提交
2012
	if (free_space < data_size + sizeof(struct btrfs_item)) {
2013 2014
		ret = 1;
		goto out;
2015
	}
C
Chris Mason 已提交
2016 2017

	/* cow and double check */
2018 2019
	ret = btrfs_cow_block(trans, root, left,
			      path->nodes[1], slot - 1, &left);
2020 2021
	if (ret) {
		/* we hit -ENOSPC, but it isn't fatal here */
2022 2023
		ret = 1;
		goto out;
2024
	}
2025

C
Chris Mason 已提交
2026
	free_space = btrfs_leaf_free_space(root, left);
C
Chris Mason 已提交
2027
	if (free_space < data_size + sizeof(struct btrfs_item)) {
2028 2029
		ret = 1;
		goto out;
C
Chris Mason 已提交
2030 2031
	}

2032 2033 2034 2035 2036 2037
	if (empty)
		nr = right_nritems;
	else
		nr = right_nritems - 1;

	for (i = 0; i < nr; i++) {
2038
		item = btrfs_item_nr(right, i);
2039 2040 2041 2042 2043 2044 2045 2046
		if (!right->map_token) {
			map_extent_buffer(right, (unsigned long)item,
					sizeof(struct btrfs_item),
					&right->map_token, &right->kaddr,
					&right->map_start, &right->map_len,
					KM_USER1);
		}

2047 2048
		if (path->slots[0] == i)
			push_space += data_size + sizeof(*item);
2049 2050 2051

		this_item_size = btrfs_item_size(right, item);
		if (this_item_size + sizeof(*item) + push_space > free_space)
2052
			break;
2053

2054
		push_items++;
2055 2056 2057 2058 2059 2060
		push_space += this_item_size + sizeof(*item);
	}

	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
2061
	}
2062

2063
	if (push_items == 0) {
2064 2065
		ret = 1;
		goto out;
2066
	}
2067
	if (!empty && push_items == btrfs_header_nritems(right))
2068
		WARN_ON(1);
2069

2070
	/* push data from right to left */
2071 2072 2073 2074 2075
	copy_extent_buffer(left, right,
			   btrfs_item_nr_offset(btrfs_header_nritems(left)),
			   btrfs_item_nr_offset(0),
			   push_items * sizeof(struct btrfs_item));

C
Chris Mason 已提交
2076
	push_space = BTRFS_LEAF_DATA_SIZE(root) -
2077 2078 2079
		     btrfs_item_offset_nr(right, push_items -1);

	copy_extent_buffer(left, right, btrfs_leaf_data(left) +
C
Chris Mason 已提交
2080 2081
		     leaf_data_end(root, left) - push_space,
		     btrfs_leaf_data(right) +
2082
		     btrfs_item_offset_nr(right, push_items - 1),
C
Chris Mason 已提交
2083
		     push_space);
2084
	old_left_nritems = btrfs_header_nritems(left);
2085 2086
	BUG_ON(old_left_nritems < 0);

2087
	old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1);
C
Chris Mason 已提交
2088
	for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
2089
		u32 ioff;
2090

2091
		item = btrfs_item_nr(left, i);
2092 2093 2094 2095 2096 2097 2098 2099
		if (!left->map_token) {
			map_extent_buffer(left, (unsigned long)item,
					sizeof(struct btrfs_item),
					&left->map_token, &left->kaddr,
					&left->map_start, &left->map_len,
					KM_USER1);
		}

2100 2101
		ioff = btrfs_item_offset(left, item);
		btrfs_set_item_offset(left, item,
2102
		      ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size));
2103
	}
2104
	btrfs_set_header_nritems(left, old_left_nritems + push_items);
2105 2106 2107 2108
	if (left->map_token) {
		unmap_extent_buffer(left, left->map_token, KM_USER1);
		left->map_token = NULL;
	}
2109 2110

	/* fixup right node */
2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124
	if (push_items > right_nritems) {
		printk("push items %d nr %u\n", push_items, right_nritems);
		WARN_ON(1);
	}

	if (push_items < right_nritems) {
		push_space = btrfs_item_offset_nr(right, push_items - 1) -
						  leaf_data_end(root, right);
		memmove_extent_buffer(right, btrfs_leaf_data(right) +
				      BTRFS_LEAF_DATA_SIZE(root) - push_space,
				      btrfs_leaf_data(right) +
				      leaf_data_end(root, right), push_space);

		memmove_extent_buffer(right, btrfs_item_nr_offset(0),
2125 2126 2127
			      btrfs_item_nr_offset(push_items),
			     (btrfs_header_nritems(right) - push_items) *
			     sizeof(struct btrfs_item));
2128
	}
2129 2130
	right_nritems -= push_items;
	btrfs_set_header_nritems(right, right_nritems);
C
Chris Mason 已提交
2131
	push_space = BTRFS_LEAF_DATA_SIZE(root);
2132 2133
	for (i = 0; i < right_nritems; i++) {
		item = btrfs_item_nr(right, i);
2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148

		if (!right->map_token) {
			map_extent_buffer(right, (unsigned long)item,
					sizeof(struct btrfs_item),
					&right->map_token, &right->kaddr,
					&right->map_start, &right->map_len,
					KM_USER1);
		}

		push_space = push_space - btrfs_item_size(right, item);
		btrfs_set_item_offset(right, item, push_space);
	}
	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
2149
	}
2150

2151
	btrfs_mark_buffer_dirty(left);
2152 2153
	if (right_nritems)
		btrfs_mark_buffer_dirty(right);
2154

2155 2156
	btrfs_item_key(right, &disk_key, 0);
	wret = fixup_low_keys(trans, root, path, &disk_key, 1);
C
Chris Mason 已提交
2157 2158
	if (wret)
		ret = wret;
2159 2160 2161 2162

	/* then fixup the leaf pointer in the path */
	if (path->slots[0] < push_items) {
		path->slots[0] += old_left_nritems;
2163 2164 2165
		if (btrfs_header_nritems(path->nodes[0]) == 0)
			clean_tree_block(trans, root, path->nodes[0]);
		btrfs_tree_unlock(path->nodes[0]);
2166 2167
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = left;
2168 2169
		path->slots[1] -= 1;
	} else {
2170
		btrfs_tree_unlock(left);
2171
		free_extent_buffer(left);
2172 2173
		path->slots[0] -= push_items;
	}
2174
	BUG_ON(path->slots[0] < 0);
C
Chris Mason 已提交
2175
	return ret;
2176 2177 2178 2179
out:
	btrfs_tree_unlock(left);
	free_extent_buffer(left);
	return ret;
2180 2181
}

C
Chris Mason 已提交
2182 2183 2184
/*
 * split the path's leaf in two, making sure there is at least data_size
 * available for the resulting leaf level of the path.
C
Chris Mason 已提交
2185 2186
 *
 * returns 0 if all went well and < 0 on failure.
C
Chris Mason 已提交
2187
 */
2188
static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
2189
		      *root, struct btrfs_key *ins_key,
2190
		      struct btrfs_path *path, int data_size, int extend)
2191
{
2192
	u64 root_gen;
2193
	struct extent_buffer *l;
2194
	u32 nritems;
2195 2196
	int mid;
	int slot;
2197
	struct extent_buffer *right;
C
Chris Mason 已提交
2198
	int space_needed = data_size + sizeof(struct btrfs_item);
2199 2200 2201
	int data_copy_size;
	int rt_data_off;
	int i;
2202
	int ret = 0;
C
Chris Mason 已提交
2203
	int wret;
2204 2205
	int double_split;
	int num_doubles = 0;
2206
	struct btrfs_disk_key disk_key;
C
Chris Mason 已提交
2207

2208 2209 2210
	if (extend)
		space_needed = data_size;

2211 2212 2213 2214 2215
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

C
Chris Mason 已提交
2216
	/* first try to make some room by pushing left and right */
2217
	if (ins_key->type != BTRFS_DIR_ITEM_KEY) {
2218
		wret = push_leaf_right(trans, root, path, data_size, 0);
2219
		if (wret < 0) {
C
Chris Mason 已提交
2220
			return wret;
2221 2222
		}
		if (wret) {
2223
			wret = push_leaf_left(trans, root, path, data_size, 0);
2224 2225 2226 2227
			if (wret < 0)
				return wret;
		}
		l = path->nodes[0];
C
Chris Mason 已提交
2228

2229
		/* did the pushes work? */
2230
		if (btrfs_leaf_free_space(root, l) >= space_needed)
2231
			return 0;
2232
	}
C
Chris Mason 已提交
2233

C
Chris Mason 已提交
2234
	if (!path->nodes[1]) {
2235
		ret = insert_new_root(trans, root, path, 1);
C
Chris Mason 已提交
2236 2237 2238
		if (ret)
			return ret;
	}
2239 2240 2241
again:
	double_split = 0;
	l = path->nodes[0];
2242
	slot = path->slots[0];
2243
	nritems = btrfs_header_nritems(l);
2244
	mid = (nritems + 1)/ 2;
2245

2246 2247
	btrfs_item_key(l, &disk_key, 0);

2248
	right = btrfs_alloc_free_block(trans, root, root->leafsize,
2249 2250 2251
					 root->root_key.objectid,
					 root_gen, disk_key.objectid, 0,
					 l->start, 0);
2252 2253
	if (IS_ERR(right)) {
		BUG_ON(1);
2254
		return PTR_ERR(right);
2255
	}
2256 2257

	memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
2258
	btrfs_set_header_bytenr(right, right->start);
2259 2260 2261 2262 2263 2264
	btrfs_set_header_generation(right, trans->transid);
	btrfs_set_header_owner(right, root->root_key.objectid);
	btrfs_set_header_level(right, 0);
	write_extent_buffer(right, root->fs_info->fsid,
			    (unsigned long)btrfs_header_fsid(right),
			    BTRFS_FSID_SIZE);
2265 2266 2267 2268

	write_extent_buffer(right, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(right),
			    BTRFS_UUID_SIZE);
2269 2270 2271 2272 2273 2274
	if (mid <= slot) {
		if (nritems == 1 ||
		    leaf_space_used(l, mid, nritems - mid) + space_needed >
			BTRFS_LEAF_DATA_SIZE(root)) {
			if (slot >= nritems) {
				btrfs_cpu_key_to_disk(&disk_key, ins_key);
2275
				btrfs_set_header_nritems(right, 0);
2276
				wret = insert_ptr(trans, root, path,
2277
						  &disk_key, right->start,
2278 2279 2280
						  path->slots[1] + 1, 1);
				if (wret)
					ret = wret;
2281 2282

				btrfs_tree_unlock(path->nodes[0]);
2283 2284
				free_extent_buffer(path->nodes[0]);
				path->nodes[0] = right;
2285 2286
				path->slots[0] = 0;
				path->slots[1] += 1;
2287
				btrfs_mark_buffer_dirty(right);
2288 2289 2290
				return ret;
			}
			mid = slot;
2291 2292 2293 2294 2295
			if (mid != nritems &&
			    leaf_space_used(l, mid, nritems - mid) +
			    space_needed > BTRFS_LEAF_DATA_SIZE(root)) {
				double_split = 1;
			}
2296 2297 2298 2299
		}
	} else {
		if (leaf_space_used(l, 0, mid + 1) + space_needed >
			BTRFS_LEAF_DATA_SIZE(root)) {
2300
			if (!extend && slot == 0) {
2301
				btrfs_cpu_key_to_disk(&disk_key, ins_key);
2302
				btrfs_set_header_nritems(right, 0);
2303 2304
				wret = insert_ptr(trans, root, path,
						  &disk_key,
2305
						  right->start,
2306
						  path->slots[1], 1);
2307 2308
				if (wret)
					ret = wret;
2309
				btrfs_tree_unlock(path->nodes[0]);
2310 2311
				free_extent_buffer(path->nodes[0]);
				path->nodes[0] = right;
2312
				path->slots[0] = 0;
2313 2314 2315 2316 2317 2318
				if (path->slots[1] == 0) {
					wret = fixup_low_keys(trans, root,
					           path, &disk_key, 1);
					if (wret)
						ret = wret;
				}
2319
				btrfs_mark_buffer_dirty(right);
2320
				return ret;
2321 2322 2323 2324 2325 2326 2327 2328 2329
			} else if (extend && slot == 0) {
				mid = 1;
			} else {
				mid = slot;
				if (mid != nritems &&
				    leaf_space_used(l, mid, nritems - mid) +
				    space_needed > BTRFS_LEAF_DATA_SIZE(root)) {
					double_split = 1;
				}
2330
			}
2331 2332
		}
	}
2333 2334 2335 2336 2337 2338 2339 2340 2341
	nritems = nritems - mid;
	btrfs_set_header_nritems(right, nritems);
	data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(root, l);

	copy_extent_buffer(right, l, btrfs_item_nr_offset(0),
			   btrfs_item_nr_offset(mid),
			   nritems * sizeof(struct btrfs_item));

	copy_extent_buffer(right, l,
C
Chris Mason 已提交
2342 2343 2344
		     btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
		     data_copy_size, btrfs_leaf_data(l) +
		     leaf_data_end(root, l), data_copy_size);
2345

C
Chris Mason 已提交
2346
	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
2347
		      btrfs_item_end_nr(l, mid);
C
Chris Mason 已提交
2348

2349 2350
	for (i = 0; i < nritems; i++) {
		struct btrfs_item *item = btrfs_item_nr(right, i);
2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361
		u32 ioff;

		if (!right->map_token) {
			map_extent_buffer(right, (unsigned long)item,
					sizeof(struct btrfs_item),
					&right->map_token, &right->kaddr,
					&right->map_start, &right->map_len,
					KM_USER1);
		}

		ioff = btrfs_item_offset(right, item);
2362
		btrfs_set_item_offset(right, item, ioff + rt_data_off);
C
Chris Mason 已提交
2363
	}
C
Chris Mason 已提交
2364

2365 2366 2367 2368 2369
	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
	}

2370
	btrfs_set_header_nritems(l, mid);
C
Chris Mason 已提交
2371
	ret = 0;
2372
	btrfs_item_key(right, &disk_key, 0);
2373 2374
	wret = insert_ptr(trans, root, path, &disk_key, right->start,
			  path->slots[1] + 1, 1);
C
Chris Mason 已提交
2375 2376
	if (wret)
		ret = wret;
2377 2378 2379

	btrfs_mark_buffer_dirty(right);
	btrfs_mark_buffer_dirty(l);
2380
	BUG_ON(path->slots[0] != slot);
2381

2382
	if (mid <= slot) {
2383
		btrfs_tree_unlock(path->nodes[0]);
2384 2385
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = right;
2386 2387
		path->slots[0] -= mid;
		path->slots[1] += 1;
2388 2389
	} else {
		btrfs_tree_unlock(right);
2390
		free_extent_buffer(right);
2391
	}
2392

2393
	BUG_ON(path->slots[0] < 0);
2394

2395 2396 2397 2398
	if (double_split) {
		BUG_ON(num_doubles != 0);
		num_doubles++;
		goto again;
2399
	}
2400 2401 2402
	return ret;
}

C
Chris Mason 已提交
2403 2404 2405
int btrfs_truncate_item(struct btrfs_trans_handle *trans,
			struct btrfs_root *root,
			struct btrfs_path *path,
2406
			u32 new_size, int from_end)
C
Chris Mason 已提交
2407 2408 2409 2410
{
	int ret = 0;
	int slot;
	int slot_orig;
2411 2412
	struct extent_buffer *leaf;
	struct btrfs_item *item;
C
Chris Mason 已提交
2413 2414 2415 2416 2417 2418 2419 2420
	u32 nritems;
	unsigned int data_end;
	unsigned int old_data_start;
	unsigned int old_size;
	unsigned int size_diff;
	int i;

	slot_orig = path->slots[0];
2421
	leaf = path->nodes[0];
2422 2423 2424 2425 2426
	slot = path->slots[0];

	old_size = btrfs_item_size_nr(leaf, slot);
	if (old_size == new_size)
		return 0;
C
Chris Mason 已提交
2427

2428
	nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
2429 2430
	data_end = leaf_data_end(root, leaf);

2431
	old_data_start = btrfs_item_offset_nr(leaf, slot);
2432

C
Chris Mason 已提交
2433 2434 2435 2436 2437 2438 2439 2440 2441 2442
	size_diff = old_size - new_size;

	BUG_ON(slot < 0);
	BUG_ON(slot >= nritems);

	/*
	 * item0..itemN ... dataN.offset..dataN.size .. data0.size
	 */
	/* first correct the data pointers */
	for (i = slot; i < nritems; i++) {
2443 2444
		u32 ioff;
		item = btrfs_item_nr(leaf, i);
2445 2446 2447 2448 2449 2450 2451 2452 2453

		if (!leaf->map_token) {
			map_extent_buffer(leaf, (unsigned long)item,
					sizeof(struct btrfs_item),
					&leaf->map_token, &leaf->kaddr,
					&leaf->map_start, &leaf->map_len,
					KM_USER1);
		}

2454 2455
		ioff = btrfs_item_offset(leaf, item);
		btrfs_set_item_offset(leaf, item, ioff + size_diff);
C
Chris Mason 已提交
2456
	}
2457 2458 2459 2460 2461 2462

	if (leaf->map_token) {
		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
		leaf->map_token = NULL;
	}

C
Chris Mason 已提交
2463
	/* shift the data */
2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502
	if (from_end) {
		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
			      data_end + size_diff, btrfs_leaf_data(leaf) +
			      data_end, old_data_start + new_size - data_end);
	} else {
		struct btrfs_disk_key disk_key;
		u64 offset;

		btrfs_item_key(leaf, &disk_key, slot);

		if (btrfs_disk_key_type(&disk_key) == BTRFS_EXTENT_DATA_KEY) {
			unsigned long ptr;
			struct btrfs_file_extent_item *fi;

			fi = btrfs_item_ptr(leaf, slot,
					    struct btrfs_file_extent_item);
			fi = (struct btrfs_file_extent_item *)(
			     (unsigned long)fi - size_diff);

			if (btrfs_file_extent_type(leaf, fi) ==
			    BTRFS_FILE_EXTENT_INLINE) {
				ptr = btrfs_item_ptr_offset(leaf, slot);
				memmove_extent_buffer(leaf, ptr,
				        (unsigned long)fi,
				        offsetof(struct btrfs_file_extent_item,
						 disk_bytenr));
			}
		}

		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
			      data_end + size_diff, btrfs_leaf_data(leaf) +
			      data_end, old_data_start - data_end);

		offset = btrfs_disk_key_offset(&disk_key);
		btrfs_set_disk_key_offset(&disk_key, offset + size_diff);
		btrfs_set_item_key(leaf, &disk_key, slot);
		if (slot == 0)
			fixup_low_keys(trans, root, path, &disk_key, 1);
	}
2503 2504 2505 2506

	item = btrfs_item_nr(leaf, slot);
	btrfs_set_item_size(leaf, item, new_size);
	btrfs_mark_buffer_dirty(leaf);
C
Chris Mason 已提交
2507 2508

	ret = 0;
2509 2510
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
C
Chris Mason 已提交
2511
		BUG();
2512
	}
C
Chris Mason 已提交
2513 2514 2515
	return ret;
}

2516 2517 2518
int btrfs_extend_item(struct btrfs_trans_handle *trans,
		      struct btrfs_root *root, struct btrfs_path *path,
		      u32 data_size)
2519 2520 2521 2522
{
	int ret = 0;
	int slot;
	int slot_orig;
2523 2524
	struct extent_buffer *leaf;
	struct btrfs_item *item;
2525 2526 2527 2528 2529 2530 2531
	u32 nritems;
	unsigned int data_end;
	unsigned int old_data;
	unsigned int old_size;
	int i;

	slot_orig = path->slots[0];
2532
	leaf = path->nodes[0];
2533

2534
	nritems = btrfs_header_nritems(leaf);
2535 2536
	data_end = leaf_data_end(root, leaf);

2537 2538
	if (btrfs_leaf_free_space(root, leaf) < data_size) {
		btrfs_print_leaf(root, leaf);
2539
		BUG();
2540
	}
2541
	slot = path->slots[0];
2542
	old_data = btrfs_item_end_nr(leaf, slot);
2543 2544

	BUG_ON(slot < 0);
2545 2546 2547 2548 2549
	if (slot >= nritems) {
		btrfs_print_leaf(root, leaf);
		printk("slot %d too large, nritems %d\n", slot, nritems);
		BUG_ON(1);
	}
2550 2551 2552 2553 2554 2555

	/*
	 * item0..itemN ... dataN.offset..dataN.size .. data0.size
	 */
	/* first correct the data pointers */
	for (i = slot; i < nritems; i++) {
2556 2557
		u32 ioff;
		item = btrfs_item_nr(leaf, i);
2558 2559 2560 2561 2562 2563 2564 2565

		if (!leaf->map_token) {
			map_extent_buffer(leaf, (unsigned long)item,
					sizeof(struct btrfs_item),
					&leaf->map_token, &leaf->kaddr,
					&leaf->map_start, &leaf->map_len,
					KM_USER1);
		}
2566 2567
		ioff = btrfs_item_offset(leaf, item);
		btrfs_set_item_offset(leaf, item, ioff - data_size);
2568
	}
2569

2570 2571 2572 2573 2574
	if (leaf->map_token) {
		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
		leaf->map_token = NULL;
	}

2575
	/* shift the data */
2576
	memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
2577 2578
		      data_end - data_size, btrfs_leaf_data(leaf) +
		      data_end, old_data - data_end);
2579

2580
	data_end = old_data;
2581 2582 2583 2584
	old_size = btrfs_item_size_nr(leaf, slot);
	item = btrfs_item_nr(leaf, slot);
	btrfs_set_item_size(leaf, item, old_size + data_size);
	btrfs_mark_buffer_dirty(leaf);
2585 2586

	ret = 0;
2587 2588
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
2589
		BUG();
2590
	}
2591 2592 2593
	return ret;
}

C
Chris Mason 已提交
2594 2595 2596 2597
/*
 * Given a key and some data, insert an item into the tree.
 * This does all the path init required, making room in the tree if needed.
 */
2598
int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
2599 2600
			    struct btrfs_root *root,
			    struct btrfs_path *path,
2601 2602
			    struct btrfs_key *cpu_key, u32 *data_size,
			    int nr)
2603
{
2604 2605
	struct extent_buffer *leaf;
	struct btrfs_item *item;
C
Chris Mason 已提交
2606
	int ret = 0;
2607
	int slot;
2608
	int slot_orig;
2609
	int i;
2610
	u32 nritems;
2611 2612
	u32 total_size = 0;
	u32 total_data = 0;
2613
	unsigned int data_end;
C
Chris Mason 已提交
2614 2615
	struct btrfs_disk_key disk_key;

2616 2617 2618
	for (i = 0; i < nr; i++) {
		total_data += data_size[i];
	}
2619

2620 2621
	total_size = total_data + (nr - 1) * sizeof(struct btrfs_item);
	ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1);
2622
	if (ret == 0) {
2623
		return -EEXIST;
C
Chris Mason 已提交
2624
	}
2625 2626
	if (ret < 0)
		goto out;
2627

2628
	slot_orig = path->slots[0];
2629
	leaf = path->nodes[0];
C
Chris Mason 已提交
2630

2631
	nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
2632
	data_end = leaf_data_end(root, leaf);
2633

C
Chris Mason 已提交
2634
	if (btrfs_leaf_free_space(root, leaf) <
2635
	    sizeof(struct btrfs_item) + total_size) {
2636 2637
		btrfs_print_leaf(root, leaf);
		printk("not enough freespace need %u have %d\n",
2638
		       total_size, btrfs_leaf_free_space(root, leaf));
2639
		BUG();
2640
	}
2641

2642
	slot = path->slots[0];
2643
	BUG_ON(slot < 0);
2644

2645 2646
	if (slot != nritems) {
		int i;
2647
		unsigned int old_data = btrfs_item_end_nr(leaf, slot);
2648

2649 2650 2651 2652 2653 2654
		if (old_data < data_end) {
			btrfs_print_leaf(root, leaf);
			printk("slot %d old_data %d data_end %d\n",
			       slot, old_data, data_end);
			BUG_ON(1);
		}
2655 2656 2657 2658
		/*
		 * item0..itemN ... dataN.offset..dataN.size .. data0.size
		 */
		/* first correct the data pointers */
2659
		WARN_ON(leaf->map_token);
C
Chris Mason 已提交
2660
		for (i = slot; i < nritems; i++) {
2661
			u32 ioff;
2662

2663
			item = btrfs_item_nr(leaf, i);
2664 2665 2666 2667 2668 2669 2670 2671
			if (!leaf->map_token) {
				map_extent_buffer(leaf, (unsigned long)item,
					sizeof(struct btrfs_item),
					&leaf->map_token, &leaf->kaddr,
					&leaf->map_start, &leaf->map_len,
					KM_USER1);
			}

2672
			ioff = btrfs_item_offset(leaf, item);
2673
			btrfs_set_item_offset(leaf, item, ioff - total_data);
C
Chris Mason 已提交
2674
		}
2675 2676 2677 2678
		if (leaf->map_token) {
			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
			leaf->map_token = NULL;
		}
2679 2680

		/* shift the items */
2681
		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr),
2682
			      btrfs_item_nr_offset(slot),
C
Chris Mason 已提交
2683
			      (nritems - slot) * sizeof(struct btrfs_item));
2684 2685

		/* shift the data */
2686
		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
2687
			      data_end - total_data, btrfs_leaf_data(leaf) +
C
Chris Mason 已提交
2688
			      data_end, old_data - data_end);
2689 2690
		data_end = old_data;
	}
2691

2692
	/* setup the item for the new data */
2693 2694 2695 2696 2697 2698 2699 2700 2701
	for (i = 0; i < nr; i++) {
		btrfs_cpu_key_to_disk(&disk_key, cpu_key + i);
		btrfs_set_item_key(leaf, &disk_key, slot + i);
		item = btrfs_item_nr(leaf, slot + i);
		btrfs_set_item_offset(leaf, item, data_end - data_size[i]);
		data_end -= data_size[i];
		btrfs_set_item_size(leaf, item, data_size[i]);
	}
	btrfs_set_header_nritems(leaf, nritems + nr);
2702
	btrfs_mark_buffer_dirty(leaf);
C
Chris Mason 已提交
2703 2704

	ret = 0;
2705 2706
	if (slot == 0) {
		btrfs_cpu_key_to_disk(&disk_key, cpu_key);
2707
		ret = fixup_low_keys(trans, root, path, &disk_key, 1);
2708
	}
C
Chris Mason 已提交
2709

2710 2711
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
2712
		BUG();
2713
	}
2714
out:
2715 2716 2717 2718 2719 2720 2721
	return ret;
}

/*
 * Given a key and some data, insert an item into the tree.
 * This does all the path init required, making room in the tree if needed.
 */
2722 2723 2724
int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_key *cpu_key, void *data, u32
		      data_size)
2725 2726
{
	int ret = 0;
C
Chris Mason 已提交
2727
	struct btrfs_path *path;
2728 2729
	struct extent_buffer *leaf;
	unsigned long ptr;
2730

C
Chris Mason 已提交
2731 2732 2733
	path = btrfs_alloc_path();
	BUG_ON(!path);
	ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
2734
	if (!ret) {
2735 2736 2737 2738
		leaf = path->nodes[0];
		ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
		write_extent_buffer(leaf, data, ptr, data_size);
		btrfs_mark_buffer_dirty(leaf);
2739
	}
C
Chris Mason 已提交
2740
	btrfs_free_path(path);
C
Chris Mason 已提交
2741
	return ret;
2742 2743
}

C
Chris Mason 已提交
2744
/*
C
Chris Mason 已提交
2745
 * delete the pointer from a given node.
C
Chris Mason 已提交
2746 2747 2748 2749 2750
 *
 * If the delete empties a node, the node is removed from the tree,
 * continuing all the way the root if required.  The root is converted into
 * a leaf if all the nodes are emptied.
 */
2751 2752
static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		   struct btrfs_path *path, int level, int slot)
2753
{
2754
	struct extent_buffer *parent = path->nodes[level];
2755
	u32 nritems;
C
Chris Mason 已提交
2756
	int ret = 0;
2757
	int wret;
2758

2759
	nritems = btrfs_header_nritems(parent);
2760
	if (slot != nritems -1) {
2761 2762 2763
		memmove_extent_buffer(parent,
			      btrfs_node_key_ptr_offset(slot),
			      btrfs_node_key_ptr_offset(slot + 1),
C
Chris Mason 已提交
2764 2765
			      sizeof(struct btrfs_key_ptr) *
			      (nritems - slot - 1));
2766
	}
2767
	nritems--;
2768
	btrfs_set_header_nritems(parent, nritems);
2769
	if (nritems == 0 && parent == root->node) {
2770
		BUG_ON(btrfs_header_level(root->node) != 1);
2771
		/* just turn the root into a leaf and break */
2772
		btrfs_set_header_level(root->node, 0);
2773
	} else if (slot == 0) {
2774 2775 2776 2777
		struct btrfs_disk_key disk_key;

		btrfs_node_key(parent, &disk_key, 0);
		wret = fixup_low_keys(trans, root, path, &disk_key, level + 1);
C
Chris Mason 已提交
2778 2779
		if (wret)
			ret = wret;
2780
	}
C
Chris Mason 已提交
2781
	btrfs_mark_buffer_dirty(parent);
C
Chris Mason 已提交
2782
	return ret;
2783 2784
}

C
Chris Mason 已提交
2785 2786 2787 2788
/*
 * delete the item at the leaf level in path.  If that empties
 * the leaf, remove it from the tree
 */
2789 2790
int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		    struct btrfs_path *path, int slot, int nr)
2791
{
2792 2793
	struct extent_buffer *leaf;
	struct btrfs_item *item;
2794 2795
	int last_off;
	int dsize = 0;
C
Chris Mason 已提交
2796 2797
	int ret = 0;
	int wret;
2798
	int i;
2799
	u32 nritems;
2800

2801
	leaf = path->nodes[0];
2802 2803 2804 2805 2806
	last_off = btrfs_item_offset_nr(leaf, slot + nr - 1);

	for (i = 0; i < nr; i++)
		dsize += btrfs_item_size_nr(leaf, slot + i);

2807
	nritems = btrfs_header_nritems(leaf);
2808

2809
	if (slot + nr != nritems) {
2810
		int i;
C
Chris Mason 已提交
2811
		int data_end = leaf_data_end(root, leaf);
2812 2813

		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
C
Chris Mason 已提交
2814 2815
			      data_end + dsize,
			      btrfs_leaf_data(leaf) + data_end,
2816
			      last_off - data_end);
2817

2818
		for (i = slot + nr; i < nritems; i++) {
2819
			u32 ioff;
2820

2821
			item = btrfs_item_nr(leaf, i);
2822 2823 2824 2825 2826 2827 2828
			if (!leaf->map_token) {
				map_extent_buffer(leaf, (unsigned long)item,
					sizeof(struct btrfs_item),
					&leaf->map_token, &leaf->kaddr,
					&leaf->map_start, &leaf->map_len,
					KM_USER1);
			}
2829 2830
			ioff = btrfs_item_offset(leaf, item);
			btrfs_set_item_offset(leaf, item, ioff + dsize);
C
Chris Mason 已提交
2831
		}
2832 2833 2834 2835 2836 2837

		if (leaf->map_token) {
			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
			leaf->map_token = NULL;
		}

2838
		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
2839
			      btrfs_item_nr_offset(slot + nr),
C
Chris Mason 已提交
2840
			      sizeof(struct btrfs_item) *
2841
			      (nritems - slot - nr));
2842
	}
2843 2844
	btrfs_set_header_nritems(leaf, nritems - nr);
	nritems -= nr;
2845

C
Chris Mason 已提交
2846
	/* delete the leaf if we've emptied it */
2847
	if (nritems == 0) {
2848 2849
		if (leaf == root->node) {
			btrfs_set_header_level(leaf, 0);
2850
		} else {
2851
			u64 root_gen = btrfs_header_generation(path->nodes[1]);
2852
			wret = del_ptr(trans, root, path, 1, path->slots[1]);
C
Chris Mason 已提交
2853 2854
			if (wret)
				ret = wret;
2855
			wret = btrfs_free_extent(trans, root,
2856 2857 2858
					 leaf->start, leaf->len,
					 btrfs_header_owner(path->nodes[1]),
					 root_gen, 0, 0, 1);
C
Chris Mason 已提交
2859 2860
			if (wret)
				ret = wret;
2861
		}
2862
	} else {
2863
		int used = leaf_space_used(leaf, 0, nritems);
C
Chris Mason 已提交
2864
		if (slot == 0) {
2865 2866 2867
			struct btrfs_disk_key disk_key;

			btrfs_item_key(leaf, &disk_key, 0);
2868
			wret = fixup_low_keys(trans, root, path,
2869
					      &disk_key, 1);
C
Chris Mason 已提交
2870 2871 2872 2873
			if (wret)
				ret = wret;
		}

C
Chris Mason 已提交
2874
		/* delete the leaf if it is mostly empty */
2875
		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
2876 2877 2878 2879
			/* push_leaf_left fixes the path.
			 * make sure the path still points to our leaf
			 * for possible call to del_ptr below
			 */
2880
			slot = path->slots[1];
2881 2882
			extent_buffer_get(leaf);

2883
			wret = push_leaf_left(trans, root, path, 1, 1);
2884
			if (wret < 0 && wret != -ENOSPC)
C
Chris Mason 已提交
2885
				ret = wret;
2886 2887 2888

			if (path->nodes[0] == leaf &&
			    btrfs_header_nritems(leaf)) {
2889
				wret = push_leaf_right(trans, root, path, 1, 1);
2890
				if (wret < 0 && wret != -ENOSPC)
C
Chris Mason 已提交
2891 2892
					ret = wret;
			}
2893 2894

			if (btrfs_header_nritems(leaf) == 0) {
2895
				u64 root_gen;
2896 2897
				u64 bytenr = leaf->start;
				u32 blocksize = leaf->len;
2898

2899 2900 2901
				root_gen = btrfs_header_generation(
							   path->nodes[1]);

2902
				wret = del_ptr(trans, root, path, 1, slot);
C
Chris Mason 已提交
2903 2904
				if (wret)
					ret = wret;
2905 2906

				free_extent_buffer(leaf);
2907
				wret = btrfs_free_extent(trans, root, bytenr,
2908 2909 2910
					     blocksize,
					     btrfs_header_owner(path->nodes[1]),
					     root_gen, 0, 0, 1);
C
Chris Mason 已提交
2911 2912
				if (wret)
					ret = wret;
C
Chris Mason 已提交
2913
			} else {
2914 2915 2916 2917 2918 2919 2920
				/* if we're still in the path, make sure
				 * we're dirty.  Otherwise, one of the
				 * push_leaf functions must have already
				 * dirtied this buffer
				 */
				if (path->nodes[0] == leaf)
					btrfs_mark_buffer_dirty(leaf);
2921
				free_extent_buffer(leaf);
2922
			}
2923
		} else {
2924
			btrfs_mark_buffer_dirty(leaf);
2925 2926
		}
	}
C
Chris Mason 已提交
2927
	return ret;
2928 2929
}

2930
/*
2931
 * search the tree again to find a leaf with lesser keys
2932 2933 2934 2935 2936
 * returns 0 if it found something or 1 if there are no lesser leaves.
 * returns < 0 on io errors.
 */
int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
{
2937 2938 2939
	struct btrfs_key key;
	struct btrfs_disk_key found_key;
	int ret;
2940

2941
	btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
2942

2943 2944 2945 2946 2947 2948 2949 2950
	if (key.offset > 0)
		key.offset--;
	else if (key.type > 0)
		key.type--;
	else if (key.objectid > 0)
		key.objectid--;
	else
		return 1;
2951

2952 2953 2954 2955 2956 2957 2958 2959 2960
	btrfs_release_path(root, path);
	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
	if (ret < 0)
		return ret;
	btrfs_item_key(path->nodes[0], &found_key, 0);
	ret = comp_keys(&found_key, &key);
	if (ret < 0)
		return 0;
	return 1;
2961 2962
}

C
Chris Mason 已提交
2963
/*
2964
 * search the tree again to find a leaf with greater keys
C
Chris Mason 已提交
2965 2966
 * returns 0 if it found something or 1 if there are no greater leaves.
 * returns < 0 on io errors.
C
Chris Mason 已提交
2967
 */
C
Chris Mason 已提交
2968
int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
2969 2970 2971
{
	int slot;
	int level = 1;
2972 2973
	struct extent_buffer *c;
	struct extent_buffer *next = NULL;
2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985
	struct btrfs_key key;
	u32 nritems;
	int ret;

	nritems = btrfs_header_nritems(path->nodes[0]);
	if (nritems == 0) {
		return 1;
	}

	btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1);

	btrfs_release_path(root, path);
2986
	path->keep_locks = 1;
2987 2988 2989 2990 2991 2992
	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
	path->keep_locks = 0;

	if (ret < 0)
		return ret;

2993 2994
	nritems = btrfs_header_nritems(path->nodes[0]);
	if (nritems > 0 && path->slots[0] < nritems - 1) {
2995 2996
		goto done;
	}
2997

C
Chris Mason 已提交
2998
	while(level < BTRFS_MAX_LEVEL) {
2999
		if (!path->nodes[level])
C
Chris Mason 已提交
3000
			return 1;
3001

3002 3003
		slot = path->slots[level] + 1;
		c = path->nodes[level];
3004
		if (slot >= btrfs_header_nritems(c)) {
3005
			level++;
3006
			if (level == BTRFS_MAX_LEVEL) {
3007
				return 1;
3008
			}
3009 3010
			continue;
		}
3011

3012 3013
		if (next) {
			btrfs_tree_unlock(next);
3014
			free_extent_buffer(next);
3015
		}
3016

3017
		if (level == 1 && path->locks[1] && path->reada)
3018
			reada_for_search(root, path, level, slot, 0);
3019

3020
		next = read_node_slot(root, c, slot);
3021 3022
		WARN_ON(!btrfs_tree_locked(c));
		btrfs_tree_lock(next);
3023 3024 3025 3026 3027 3028
		break;
	}
	path->slots[level] = slot;
	while(1) {
		level--;
		c = path->nodes[level];
3029 3030
		if (path->locks[level])
			btrfs_tree_unlock(c);
3031
		free_extent_buffer(c);
3032 3033
		path->nodes[level] = next;
		path->slots[level] = 0;
3034
		path->locks[level] = 1;
3035 3036
		if (!level)
			break;
3037 3038
		if (level == 1 && path->locks[1] && path->reada)
			reada_for_search(root, path, level, slot, 0);
3039
		next = read_node_slot(root, next, 0);
3040 3041
		WARN_ON(!btrfs_tree_locked(path->nodes[level]));
		btrfs_tree_lock(next);
3042
	}
3043 3044
done:
	unlock_up(path, 0, 1);
3045 3046
	return 0;
}
3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071

int btrfs_previous_item(struct btrfs_root *root,
			struct btrfs_path *path, u64 min_objectid,
			int type)
{
	struct btrfs_key found_key;
	struct extent_buffer *leaf;
	int ret;

	while(1) {
		if (path->slots[0] == 0) {
			ret = btrfs_prev_leaf(root, path);
			if (ret != 0)
				return ret;
		} else {
			path->slots[0]--;
		}
		leaf = path->nodes[0];
		btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
		if (found_key.type == type)
			return 0;
	}
	return 1;
}