ctree.c 77.9 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 68
	int skip = p->skip_locking;
	int keep = p->keep_locks;

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

114 115 116 117 118 119 120 121
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);
	}
}

122 123 124 125 126 127 128 129 130 131
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;
132
	struct btrfs_root *new_root;
133

134 135 136 137 138 139
	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;
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

	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;
	}
155
	cow = btrfs_alloc_free_block(trans, new_root, buf->len,
156 157 158
				       new_root_objectid,
				       trans->transid, first_key.objectid,
				       level, buf->start, 0);
159 160
	if (IS_ERR(cow)) {
		kfree(new_root);
161
		return PTR_ERR(cow);
162
	}
163 164 165 166 167

	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);
168
	btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN);
169 170

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

174 175 176 177 178 179 180 181 182
	if (ret)
		return ret;

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

int __btrfs_cow_block(struct btrfs_trans_handle *trans,
183 184 185 186 187
			     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 已提交
188
{
189
	u64 root_gen;
190
	struct extent_buffer *cow;
191
	u32 nritems;
192 193
	int ret = 0;
	int different_trans = 0;
194
	int level;
195
	int unlock_orig = 0;
196 197
	struct btrfs_key first_key;

198 199 200 201 202
	if (*cow_ret == buf)
		unlock_orig = 1;

	WARN_ON(!btrfs_tree_locked(buf));

203 204 205 206 207 208 209
	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);
210
	WARN_ON(root->ref_cows && trans->transid != root->last_trans);
211

212 213 214 215 216 217 218 219 220 221
	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;
	}
222
	cow = btrfs_alloc_free_block(trans, root, buf->len,
223 224
				     root->root_key.objectid,
				     root_gen, first_key.objectid, level,
225
				     search_start, empty_size);
226 227
	if (IS_ERR(cow))
		return PTR_ERR(cow);
228

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

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

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

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

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

282 283 284 285
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)
286 287
{
	u64 search_start;
C
Chris Mason 已提交
288
	u64 header_trans;
289
	int ret;
C
Chris Mason 已提交
290

291 292 293 294 295 296 297 298 299 300
	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 已提交
301 302

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

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

326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
/*
 * 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;
}


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

373 374 375
	/* FIXME this code needs locking */
	return 0;

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

380 381 382 383 384 385 386 387 388 389
	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);
	}
390

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

	if (parent_nritems == 1)
		return 0;

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

401 402 403 404 405 406 407 408
		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);
		}
409 410 411 412 413
		btrfs_node_key(parent, &disk_key, i);
		if (!progress_passed && comp_keys(&disk_key, progress) < 0)
			continue;

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

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

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

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

C
Chris Mason 已提交
480 481 482 483 484
/*
 * 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 已提交
485
static inline unsigned int leaf_data_end(struct btrfs_root *root,
486
					 struct extent_buffer *leaf)
487
{
488
	u32 nr = btrfs_header_nritems(leaf);
489
	if (nr == 0)
C
Chris Mason 已提交
490
		return BTRFS_LEAF_DATA_SIZE(root);
491
	return btrfs_item_offset_nr(leaf, nr - 1);
492 493
}

C
Chris Mason 已提交
494 495
static int check_node(struct btrfs_root *root, struct btrfs_path *path,
		      int level)
C
Chris Mason 已提交
496
{
497 498 499 500
	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 已提交
501
	int parent_slot;
502 503
	int slot;
	struct btrfs_key cpukey;
504
	u32 nritems = btrfs_header_nritems(node);
C
Chris Mason 已提交
505 506

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

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

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

545
	u32 nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
546 547

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

	if (nritems == 0)
		return 0;

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

558
		BUG_ON(memcmp(&parent_key, &leaf_key,
C
Chris Mason 已提交
559
		       sizeof(struct btrfs_disk_key)));
560
		BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
561
		       btrfs_header_bytenr(leaf));
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
	}
#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 已提交
587
	}
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609
	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);
		}
610 611
	}
	if (slot < nritems - 1) {
612 613 614 615 616 617 618 619 620
		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 已提交
621
	}
622 623
	BUG_ON(btrfs_item_offset_nr(leaf, 0) +
	       btrfs_item_size_nr(leaf, 0) != BTRFS_LEAF_DATA_SIZE(root));
C
Chris Mason 已提交
624 625 626
	return 0;
}

627 628
static int noinline check_block(struct btrfs_root *root,
				struct btrfs_path *path, int level)
C
Chris Mason 已提交
629
{
630
	u64 found_start;
631
	return 0;
632 633 634 635 636 637 638 639 640
	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);
	}
641
#if 0
642 643
	struct extent_buffer *buf = path->nodes[level];

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

C
Chris Mason 已提交
656
/*
657 658 659
 * 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 已提交
660 661 662 663 664 665
 * 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
 */
666 667 668
static int generic_bin_search(struct extent_buffer *eb, unsigned long p,
			      int item_size, struct btrfs_key *key,
			      int max, int *slot)
669 670 671 672 673
{
	int low = 0;
	int high = max;
	int mid;
	int ret;
674
	struct btrfs_disk_key *tmp = NULL;
675 676 677 678 679 680
	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;
681
	int err;
682 683 684

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

		if (!map_token || offset < map_start ||
		    (offset + sizeof(struct btrfs_disk_key)) >
		    map_start + map_len) {
690
			if (map_token) {
691
				unmap_extent_buffer(eb, map_token, KM_USER0);
692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
				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;
			}
707 708 709 710 711

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

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

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

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

	BUG_ON(level == 0);

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

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

	if (level == 0)
		return 0;

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

792
	orig_ptr = btrfs_node_blockptr(mid, orig_slot);
793

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

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

805
		if (btrfs_header_nritems(mid) != 1)
806 807 808
			return 0;

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

815
		spin_lock(&root->node_lock);
816
		root->node = child;
817 818
		spin_unlock(&root->node_lock);

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

838
	if (btrfs_header_nritems(mid) < 2)
839 840
		err_on_enospc = 1;

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

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

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

884
			clean_tree_block(trans, root, right);
885
			btrfs_tree_unlock(right);
886
			free_extent_buffer(right);
887
			right = NULL;
888 889
			wret = del_ptr(trans, root, path, level + 1, pslot +
				       1);
890 891
			if (wret)
				ret = wret;
892
			wret = btrfs_free_extent(trans, root, bytenr,
893 894 895
						 blocksize,
						 btrfs_header_owner(parent),
						 generation, 0, 0, 1);
896 897 898
			if (wret)
				ret = wret;
		} else {
899 900 901 902
			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);
903 904
		}
	}
905
	if (btrfs_header_nritems(mid) == 1) {
906 907 908 909 910 911 912 913 914
		/*
		 * 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
		 */
915 916
		BUG_ON(!left);
		wret = balance_node_right(trans, root, mid, left);
917
		if (wret < 0) {
918
			ret = wret;
919 920
			goto enospc;
		}
921 922 923 924 925
		if (wret == 1) {
			wret = push_node_left(trans, root, left, mid, 1);
			if (wret < 0)
				ret = wret;
		}
926 927
		BUG_ON(wret == 1);
	}
928
	if (btrfs_header_nritems(mid) == 0) {
929
		/* we've managed to empty the middle node, drop it */
930
		u64 root_gen = btrfs_header_generation(parent);
931 932
		u64 bytenr = mid->start;
		u32 blocksize = mid->len;
933

934
		clean_tree_block(trans, root, mid);
935
		btrfs_tree_unlock(mid);
936
		free_extent_buffer(mid);
937
		mid = NULL;
938
		wret = del_ptr(trans, root, path, level + 1, pslot);
939 940
		if (wret)
			ret = wret;
941 942 943
		wret = btrfs_free_extent(trans, root, bytenr, blocksize,
					 btrfs_header_owner(parent),
					 root_gen, 0, 0, 1);
944 945
		if (wret)
			ret = wret;
946 947
	} else {
		/* update the parent key to reflect our changes */
948 949 950 951
		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);
952
	}
953

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

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

	if (level == 0)
		return 1;

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

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

1015
	if (!parent)
1016 1017
		return 1;

1018
	left = read_node_slot(root, parent, pslot - 1);
1019 1020

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

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

	/*
	 * then try to empty the right most buffer into the middle
	 */
1069
	if (right) {
C
Chris Mason 已提交
1070
		u32 right_nr;
1071
		btrfs_tree_lock(right);
1072
		right_nr = btrfs_header_nritems(right);
C
Chris Mason 已提交
1073 1074 1075
		if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
			wret = 1;
		} else {
1076 1077 1078
			ret = btrfs_cow_block(trans, root, right,
					      parent, pslot + 1,
					      &right);
1079 1080 1081 1082
			if (ret)
				wret = 1;
			else {
				wret = balance_node_right(trans, root,
1083
							  right, mid);
1084
			}
C
Chris Mason 已提交
1085
		}
1086 1087 1088
		if (wret < 0)
			ret = wret;
		if (wret == 0) {
1089 1090 1091 1092 1093 1094 1095 1096
			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;
1097 1098
				path->slots[level + 1] += 1;
				path->slots[level] = orig_slot -
1099
					btrfs_header_nritems(mid);
1100
				btrfs_tree_unlock(mid);
1101
				free_extent_buffer(mid);
1102
			} else {
1103
				btrfs_tree_unlock(right);
1104
				free_extent_buffer(right);
1105 1106 1107
			}
			return 0;
		}
1108
		btrfs_tree_unlock(right);
1109
		free_extent_buffer(right);
1110 1111 1112 1113
	}
	return 1;
}

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

1133
	if (level != 1)
1134 1135 1136
		return;

	if (!path->nodes[level])
1137 1138
		return;

1139
	node = path->nodes[level];
1140 1141
	WARN_ON(!path->skip_locking && !btrfs_tree_locked(node));

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

1150 1151 1152
	highest_read = search;
	lowest_read = search;

1153
	nritems = btrfs_header_nritems(node);
1154
	nr = slot;
1155
	while(1) {
1156 1157 1158 1159 1160 1161 1162 1163
		if (direction < 0) {
			if (nr == 0)
				break;
			nr--;
		} else if (direction > 0) {
			nr++;
			if (nr >= nritems)
				break;
1164
		}
1165 1166 1167 1168 1169
		if (path->reada < 0 && objectid) {
			btrfs_node_key(node, &disk_key, nr);
			if (btrfs_disk_key_objectid(&disk_key) != objectid)
				break;
		}
1170 1171 1172 1173
		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)) {
1174 1175
			readahead_tree_block(root, search, blocksize,
				     btrfs_node_ptr_generation(node, nr));
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
			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;
1188 1189
	}
}
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209

static void unlock_up(struct btrfs_path *path, int level, int lowest_unlock)
{
	int i;
	int skip_level = level;
	struct extent_buffer *t;

	for (i = level; i < BTRFS_MAX_LEVEL; i++) {
		if (!path->nodes[i])
			break;
		if (!path->locks[i])
			break;
		if (path->slots[i] == 0) {
			skip_level = i + 1;
			continue;
		}
		if (path->keep_locks) {
			u32 nritems;
			t = path->nodes[i];
			nritems = btrfs_header_nritems(t);
1210 1211 1212 1213
			if (nritems < 2 || path->slots[i] >= nritems - 2) {
if (path->keep_locks) {
//printk("path %p skip level now %d\n", path, skip_level);
}
1214 1215 1216 1217 1218 1219
				skip_level = i + 1;
				continue;
			}
		}
		t = path->nodes[i];
		if (i >= lowest_unlock && i > skip_level && path->locks[i]) {
1220 1221 1222
if (path->keep_locks) {
//printk("path %p unlocking level %d slot %d nritems %d skip_level %d\n", path, i, path->slots[i], btrfs_header_nritems(t), skip_level);
}
1223 1224 1225 1226 1227 1228
			btrfs_tree_unlock(t);
			path->locks[i] = 0;
		}
	}
}

C
Chris Mason 已提交
1229 1230 1231 1232 1233 1234
/*
 * 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 已提交
1235 1236
 * be inserted, and 1 is returned.  If there are other errors during the
 * search a negative error number is returned.
C
Chris Mason 已提交
1237 1238 1239 1240
 *
 * 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 已提交
1241
 */
1242 1243 1244
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)
1245
{
1246
	struct extent_buffer *b;
1247 1248 1249
	int slot;
	int ret;
	int level;
1250
	int should_reada = p->reada;
1251
	int lowest_unlock = 1;
1252 1253
	u8 lowest_level = 0;

1254 1255
	lowest_level = p->lowest_level;
	WARN_ON(lowest_level && ins_len);
C
Chris Mason 已提交
1256
	WARN_ON(p->nodes[0] != NULL);
1257 1258 1259 1260 1261 1262 1263 1264
	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;
1265
again:
1266 1267 1268 1269 1270
	if (!p->skip_locking)
		b = btrfs_lock_root_node(root);
	else
		b = btrfs_root_node(root);

1271
	while (b) {
1272
		level = btrfs_header_level(b);
C
Chris Mason 已提交
1273 1274
		if (cow) {
			int wret;
C
Chris Mason 已提交
1275 1276 1277
			wret = btrfs_cow_block(trans, root, b,
					       p->nodes[level + 1],
					       p->slots[level + 1],
Y
Yan 已提交
1278
					       &b);
1279
			if (wret) {
1280
				free_extent_buffer(b);
1281 1282
				return wret;
			}
C
Chris Mason 已提交
1283 1284
		}
		BUG_ON(!cow && ins_len);
1285
		if (level != btrfs_header_level(b))
C
Chris Mason 已提交
1286
			WARN_ON(1);
1287
		level = btrfs_header_level(b);
1288
		p->nodes[level] = b;
1289 1290
		if (!p->skip_locking)
			p->locks[level] = 1;
C
Chris Mason 已提交
1291
		ret = check_block(root, p, level);
C
Chris Mason 已提交
1292 1293
		if (ret)
			return -1;
1294

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

1327
			if (should_reada)
1328 1329
				reada_for_search(root, p, level, slot,
						 key->objectid);
1330 1331

			b = read_node_slot(root, b, slot);
1332 1333
			if (!p->skip_locking)
				btrfs_tree_lock(b);
1334
			unlock_up(p, level + 1, lowest_unlock);
1335 1336
		} else {
			p->slots[level] = slot;
1337
			if (ins_len > 0 && btrfs_leaf_free_space(root, b) <
C
Chris Mason 已提交
1338
			    sizeof(struct btrfs_item) + ins_len) {
1339
				int sret = split_leaf(trans, root, key,
1340
						      p, ins_len, ret == 0);
C
Chris Mason 已提交
1341 1342 1343 1344
				BUG_ON(sret > 0);
				if (sret)
					return sret;
			}
1345
			unlock_up(p, level, lowest_unlock);
1346 1347 1348
			return ret;
		}
	}
C
Chris Mason 已提交
1349
	return 1;
1350 1351
}

C
Chris Mason 已提交
1352 1353 1354 1355 1356 1357
/*
 * 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 已提交
1358 1359 1360
 *
 * 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 已提交
1361
 */
1362 1363 1364
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)
1365 1366
{
	int i;
C
Chris Mason 已提交
1367
	int ret = 0;
1368 1369
	struct extent_buffer *t;

C
Chris Mason 已提交
1370
	for (i = level; i < BTRFS_MAX_LEVEL; i++) {
1371
		int tslot = path->slots[i];
1372
		if (!path->nodes[i])
1373
			break;
1374 1375
		t = path->nodes[i];
		btrfs_set_node_key(t, key, tslot);
1376 1377 1378 1379 1380 1381 1382
		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 已提交
1383
		btrfs_mark_buffer_dirty(path->nodes[i]);
1384 1385 1386
		if (tslot != 0)
			break;
	}
C
Chris Mason 已提交
1387
	return ret;
1388 1389
}

C
Chris Mason 已提交
1390 1391
/*
 * try to push data from one node into the next node left in the
1392
 * tree.
C
Chris Mason 已提交
1393 1394 1395
 *
 * 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 已提交
1396
 */
1397 1398
static int push_node_left(struct btrfs_trans_handle *trans,
			  struct btrfs_root *root, struct extent_buffer *dst,
1399
			  struct extent_buffer *src, int empty)
1400 1401
{
	int push_items = 0;
1402 1403
	int src_nritems;
	int dst_nritems;
C
Chris Mason 已提交
1404
	int ret = 0;
1405

1406 1407
	src_nritems = btrfs_header_nritems(src);
	dst_nritems = btrfs_header_nritems(dst);
C
Chris Mason 已提交
1408
	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
1409 1410
	WARN_ON(btrfs_header_generation(src) != trans->transid);
	WARN_ON(btrfs_header_generation(dst) != trans->transid);
1411

1412
	if (!empty && src_nritems <= 8)
1413 1414
		return 1;

1415
	if (push_items <= 0) {
1416
		return 1;
1417
	}
1418

1419
	if (empty) {
1420
		push_items = min(src_nritems, push_items);
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432
		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);
1433

1434 1435 1436 1437 1438
	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));

1439
	if (push_items < src_nritems) {
1440 1441 1442 1443 1444 1445 1446 1447 1448
		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);
1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
	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
 */
1461 1462 1463 1464
static int balance_node_right(struct btrfs_trans_handle *trans,
			      struct btrfs_root *root,
			      struct extent_buffer *dst,
			      struct extent_buffer *src)
1465 1466 1467 1468 1469 1470 1471
{
	int push_items = 0;
	int max_push;
	int src_nritems;
	int dst_nritems;
	int ret = 0;

1472 1473 1474
	WARN_ON(btrfs_header_generation(src) != trans->transid);
	WARN_ON(btrfs_header_generation(dst) != trans->transid);

1475 1476
	src_nritems = btrfs_header_nritems(src);
	dst_nritems = btrfs_header_nritems(dst);
C
Chris Mason 已提交
1477
	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
1478
	if (push_items <= 0) {
1479
		return 1;
1480 1481 1482 1483 1484
	}

	if (src_nritems < 4) {
		return 1;
	}
1485 1486 1487

	max_push = src_nritems / 2 + 1;
	/* don't try to empty the node */
1488
	if (max_push >= src_nritems) {
1489
		return 1;
1490
	}
Y
Yan 已提交
1491

1492 1493 1494
	if (max_push < push_items)
		push_items = max_push;

1495 1496 1497 1498
	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 已提交
1499

1500 1501 1502 1503
	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));
1504

1505 1506
	btrfs_set_header_nritems(src, src_nritems - push_items);
	btrfs_set_header_nritems(dst, dst_nritems + push_items);
1507

1508 1509
	btrfs_mark_buffer_dirty(src);
	btrfs_mark_buffer_dirty(dst);
C
Chris Mason 已提交
1510
	return ret;
1511 1512
}

C
Chris Mason 已提交
1513 1514 1515 1516
/*
 * 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 已提交
1517 1518
 *
 * returns zero on success or < 0 on failure.
C
Chris Mason 已提交
1519
 */
1520
static int noinline insert_new_root(struct btrfs_trans_handle *trans,
1521 1522
			   struct btrfs_root *root,
			   struct btrfs_path *path, int level)
C
Chris Mason 已提交
1523
{
1524 1525
	u64 root_gen;
	u64 lower_gen;
1526 1527
	struct extent_buffer *lower;
	struct extent_buffer *c;
1528
	struct extent_buffer *old;
1529
	struct btrfs_disk_key lower_key;
C
Chris Mason 已提交
1530 1531 1532 1533

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

1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544
	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);

1545
	c = btrfs_alloc_free_block(trans, root, root->nodesize,
1546 1547
				   root->root_key.objectid,
				   root_gen, lower_key.objectid, level,
1548
				   root->node->start, 0);
1549 1550
	if (IS_ERR(c))
		return PTR_ERR(c);
1551

1552 1553 1554
	memset_extent_buffer(c, 0, 0, root->nodesize);
	btrfs_set_header_nritems(c, 1);
	btrfs_set_header_level(c, level);
1555
	btrfs_set_header_bytenr(c, c->start);
1556 1557 1558 1559 1560 1561
	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);
1562 1563 1564 1565 1566

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

1567
	btrfs_set_node_key(c, &lower_key, 0);
1568
	btrfs_set_node_blockptr(c, 0, lower->start);
1569 1570 1571 1572
	lower_gen = btrfs_header_generation(lower);
	WARN_ON(lower_gen == 0);

	btrfs_set_node_ptr_generation(c, 0, lower_gen);
1573

1574
	btrfs_mark_buffer_dirty(c);
1575

1576 1577
	spin_lock(&root->node_lock);
	old = root->node;
1578
	root->node = c;
1579 1580 1581 1582 1583
	spin_unlock(&root->node_lock);

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

1584
	add_root_to_dirty_list(root);
1585 1586
	extent_buffer_get(c);
	path->nodes[level] = c;
1587
	path->locks[level] = 1;
C
Chris Mason 已提交
1588
	path->slots[level] = 0;
1589 1590 1591 1592

	if (root->ref_cows && lower_gen != trans->transid) {
		struct btrfs_path *back_path = btrfs_alloc_path();
		int ret;
1593
		mutex_lock(&root->fs_info->alloc_mutex);
1594 1595 1596 1597 1598 1599
		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);
1600
		mutex_unlock(&root->fs_info->alloc_mutex);
1601 1602
		btrfs_free_path(back_path);
	}
C
Chris Mason 已提交
1603 1604 1605
	return 0;
}

C
Chris Mason 已提交
1606 1607 1608
/*
 * worker function to insert a single pointer in a node.
 * the node should have enough room for the pointer already
C
Chris Mason 已提交
1609
 *
C
Chris Mason 已提交
1610 1611
 * slot and level indicate where you want the key to go, and
 * blocknr is the block the key points to.
C
Chris Mason 已提交
1612 1613
 *
 * returns zero on success and < 0 on any error
C
Chris Mason 已提交
1614
 */
1615 1616
static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, struct btrfs_disk_key
1617
		      *key, u64 bytenr, int slot, int level)
C
Chris Mason 已提交
1618
{
1619
	struct extent_buffer *lower;
C
Chris Mason 已提交
1620
	int nritems;
C
Chris Mason 已提交
1621 1622

	BUG_ON(!path->nodes[level]);
1623 1624
	lower = path->nodes[level];
	nritems = btrfs_header_nritems(lower);
C
Chris Mason 已提交
1625 1626
	if (slot > nritems)
		BUG();
C
Chris Mason 已提交
1627
	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
C
Chris Mason 已提交
1628 1629
		BUG();
	if (slot != nritems) {
1630 1631 1632
		memmove_extent_buffer(lower,
			      btrfs_node_key_ptr_offset(slot + 1),
			      btrfs_node_key_ptr_offset(slot),
C
Chris Mason 已提交
1633
			      (nritems - slot) * sizeof(struct btrfs_key_ptr));
C
Chris Mason 已提交
1634
	}
1635
	btrfs_set_node_key(lower, key, slot);
1636
	btrfs_set_node_blockptr(lower, slot, bytenr);
1637 1638
	WARN_ON(trans->transid == 0);
	btrfs_set_node_ptr_generation(lower, slot, trans->transid);
1639 1640
	btrfs_set_header_nritems(lower, nritems + 1);
	btrfs_mark_buffer_dirty(lower);
C
Chris Mason 已提交
1641 1642 1643
	return 0;
}

C
Chris Mason 已提交
1644 1645 1646 1647 1648 1649
/*
 * 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 已提交
1650 1651
 *
 * returns 0 on success and < 0 on failure
C
Chris Mason 已提交
1652
 */
1653 1654
static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, int level)
1655
{
1656
	u64 root_gen;
1657 1658 1659
	struct extent_buffer *c;
	struct extent_buffer *split;
	struct btrfs_disk_key disk_key;
1660
	int mid;
C
Chris Mason 已提交
1661
	int ret;
C
Chris Mason 已提交
1662
	int wret;
1663
	u32 c_nritems;
1664

1665
	c = path->nodes[level];
1666
	WARN_ON(btrfs_header_generation(c) != trans->transid);
1667
	if (c == root->node) {
C
Chris Mason 已提交
1668
		/* trying to split the root, lets make a new one */
1669
		ret = insert_new_root(trans, root, path, level + 1);
C
Chris Mason 已提交
1670 1671
		if (ret)
			return ret;
1672 1673
	} else {
		ret = push_nodes_for_insert(trans, root, path, level);
1674 1675
		c = path->nodes[level];
		if (!ret && btrfs_header_nritems(c) <
1676
		    BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
1677
			return 0;
1678 1679
		if (ret < 0)
			return ret;
1680
	}
1681

1682
	c_nritems = btrfs_header_nritems(c);
1683 1684 1685 1686 1687 1688
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

	btrfs_node_key(c, &disk_key, 0);
1689
	split = btrfs_alloc_free_block(trans, root, root->nodesize,
1690 1691 1692 1693
					 root->root_key.objectid,
					 root_gen,
					 btrfs_disk_key_objectid(&disk_key),
					 level, c->start, 0);
1694 1695 1696 1697 1698
	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));
1699
	btrfs_set_header_bytenr(split, split->start);
1700 1701
	btrfs_set_header_generation(split, trans->transid);
	btrfs_set_header_owner(split, root->root_key.objectid);
1702
	btrfs_set_header_flags(split, 0);
1703 1704 1705
	write_extent_buffer(split, root->fs_info->fsid,
			    (unsigned long)btrfs_header_fsid(split),
			    BTRFS_FSID_SIZE);
1706 1707 1708
	write_extent_buffer(split, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(split),
			    BTRFS_UUID_SIZE);
1709

1710
	mid = (c_nritems + 1) / 2;
1711 1712 1713 1714 1715 1716 1717

	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 已提交
1718 1719
	ret = 0;

1720 1721 1722 1723
	btrfs_mark_buffer_dirty(c);
	btrfs_mark_buffer_dirty(split);

	btrfs_node_key(split, &disk_key, 0);
1724
	wret = insert_ptr(trans, root, path, &disk_key, split->start,
1725
			  path->slots[level + 1] + 1,
C
Chris Mason 已提交
1726
			  level + 1);
C
Chris Mason 已提交
1727 1728 1729
	if (wret)
		ret = wret;

C
Chris Mason 已提交
1730
	if (path->slots[level] >= mid) {
C
Chris Mason 已提交
1731
		path->slots[level] -= mid;
1732
		btrfs_tree_unlock(c);
1733 1734
		free_extent_buffer(c);
		path->nodes[level] = split;
C
Chris Mason 已提交
1735 1736
		path->slots[level + 1] += 1;
	} else {
1737
		btrfs_tree_unlock(split);
1738
		free_extent_buffer(split);
1739
	}
C
Chris Mason 已提交
1740
	return ret;
1741 1742
}

C
Chris Mason 已提交
1743 1744 1745 1746 1747
/*
 * 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
 */
1748
static int leaf_space_used(struct extent_buffer *l, int start, int nr)
1749 1750
{
	int data_len;
1751
	int nritems = btrfs_header_nritems(l);
1752
	int end = min(nritems, start + nr) - 1;
1753 1754 1755

	if (!nr)
		return 0;
1756 1757
	data_len = btrfs_item_end_nr(l, start);
	data_len = data_len - btrfs_item_offset_nr(l, end);
C
Chris Mason 已提交
1758
	data_len += sizeof(struct btrfs_item) * nr;
1759
	WARN_ON(data_len < 0);
1760 1761 1762
	return data_len;
}

1763 1764 1765 1766 1767
/*
 * 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
 */
1768
int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf)
1769
{
1770 1771 1772 1773 1774
	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 已提交
1775
		       ret, (unsigned long) BTRFS_LEAF_DATA_SIZE(root),
1776 1777 1778
		       leaf_space_used(leaf, 0, nritems), nritems);
	}
	return ret;
1779 1780
}

C
Chris Mason 已提交
1781 1782 1783
/*
 * 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 已提交
1784 1785 1786
 *
 * 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 已提交
1787
 */
1788
static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
1789 1790
			   *root, struct btrfs_path *path, int data_size,
			   int empty)
C
Chris Mason 已提交
1791
{
1792 1793 1794 1795
	struct extent_buffer *left = path->nodes[0];
	struct extent_buffer *right;
	struct extent_buffer *upper;
	struct btrfs_disk_key disk_key;
C
Chris Mason 已提交
1796
	int slot;
1797
	u32 i;
C
Chris Mason 已提交
1798 1799 1800
	int free_space;
	int push_space = 0;
	int push_items = 0;
C
Chris Mason 已提交
1801
	struct btrfs_item *item;
1802
	u32 left_nritems;
1803
	u32 nr;
1804
	u32 right_nritems;
1805
	u32 data_end;
1806
	u32 this_item_size;
1807
	int ret;
C
Chris Mason 已提交
1808 1809 1810 1811 1812 1813

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

1817 1818
	WARN_ON(!btrfs_tree_locked(path->nodes[1]));

1819
	right = read_node_slot(root, upper, slot + 1);
1820
	btrfs_tree_lock(right);
C
Chris Mason 已提交
1821
	free_space = btrfs_leaf_free_space(root, right);
1822 1823
	if (free_space < data_size + sizeof(struct btrfs_item))
		goto out_unlock;
1824

C
Chris Mason 已提交
1825
	/* cow and double check */
1826 1827
	ret = btrfs_cow_block(trans, root, right, upper,
			      slot + 1, &right);
1828 1829 1830
	if (ret)
		goto out_unlock;

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

1835
	left_nritems = btrfs_header_nritems(left);
1836 1837
	if (left_nritems == 0)
		goto out_unlock;
1838

1839 1840 1841 1842 1843 1844 1845
	if (empty)
		nr = 0;
	else
		nr = 1;

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

C
Chris Mason 已提交
1848 1849
		if (path->slots[0] == i)
			push_space += data_size + sizeof(*item);
1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860

		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 已提交
1861 1862
			break;
		push_items++;
1863
		push_space += this_item_size + sizeof(*item);
1864 1865 1866
		if (i == 0)
			break;
		i--;
1867 1868 1869 1870
	}
	if (left->map_token) {
		unmap_extent_buffer(left, left->map_token, KM_USER1);
		left->map_token = NULL;
C
Chris Mason 已提交
1871
	}
1872

1873 1874
	if (push_items == 0)
		goto out_unlock;
1875

1876
	if (!empty && push_items == left_nritems)
1877
		WARN_ON(1);
1878

C
Chris Mason 已提交
1879
	/* push left to right */
1880
	right_nritems = btrfs_header_nritems(right);
1881

1882
	push_space = btrfs_item_end_nr(left, left_nritems - push_items);
C
Chris Mason 已提交
1883
	push_space -= leaf_data_end(root, left);
1884

C
Chris Mason 已提交
1885
	/* make room in the right data area */
1886 1887 1888 1889 1890 1891
	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 已提交
1892
	/* copy from the left data area */
1893
	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
C
Chris Mason 已提交
1894 1895 1896
		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
		     btrfs_leaf_data(left) + leaf_data_end(root, left),
		     push_space);
1897 1898 1899 1900 1901

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

C
Chris Mason 已提交
1902
	/* copy the items from left to right */
1903 1904 1905
	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 已提交
1906 1907

	/* update the item pointers */
1908
	right_nritems += push_items;
1909
	btrfs_set_header_nritems(right, right_nritems);
C
Chris Mason 已提交
1910
	push_space = BTRFS_LEAF_DATA_SIZE(root);
1911
	for (i = 0; i < right_nritems; i++) {
1912
		item = btrfs_item_nr(right, i);
1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926
		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 已提交
1927
	}
1928
	left_nritems -= push_items;
1929
	btrfs_set_header_nritems(left, left_nritems);
C
Chris Mason 已提交
1930

1931 1932
	if (left_nritems)
		btrfs_mark_buffer_dirty(left);
1933
	btrfs_mark_buffer_dirty(right);
1934

1935 1936
	btrfs_item_key(right, &disk_key, 0);
	btrfs_set_node_key(upper, &disk_key, slot + 1);
C
Chris Mason 已提交
1937
	btrfs_mark_buffer_dirty(upper);
C
Chris Mason 已提交
1938

C
Chris Mason 已提交
1939
	/* then fixup the leaf pointer in the path */
1940 1941
	if (path->slots[0] >= left_nritems) {
		path->slots[0] -= left_nritems;
1942 1943 1944
		if (btrfs_header_nritems(path->nodes[0]) == 0)
			clean_tree_block(trans, root, path->nodes[0]);
		btrfs_tree_unlock(path->nodes[0]);
1945 1946
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = right;
C
Chris Mason 已提交
1947 1948
		path->slots[1] += 1;
	} else {
1949
		btrfs_tree_unlock(right);
1950
		free_extent_buffer(right);
C
Chris Mason 已提交
1951 1952
	}
	return 0;
1953 1954 1955 1956 1957

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

C
Chris Mason 已提交
1960 1961 1962 1963
/*
 * 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
 */
1964
static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
1965 1966
			  *root, struct btrfs_path *path, int data_size,
			  int empty)
1967
{
1968 1969 1970
	struct btrfs_disk_key disk_key;
	struct extent_buffer *right = path->nodes[0];
	struct extent_buffer *left;
1971 1972 1973 1974 1975
	int slot;
	int i;
	int free_space;
	int push_space = 0;
	int push_items = 0;
C
Chris Mason 已提交
1976
	struct btrfs_item *item;
1977
	u32 old_left_nritems;
1978
	u32 right_nritems;
1979
	u32 nr;
C
Chris Mason 已提交
1980 1981
	int ret = 0;
	int wret;
1982 1983
	u32 this_item_size;
	u32 old_left_item_size;
1984 1985

	slot = path->slots[1];
1986
	if (slot == 0)
1987
		return 1;
1988
	if (!path->nodes[1])
1989
		return 1;
1990

1991 1992 1993 1994 1995
	right_nritems = btrfs_header_nritems(right);
	if (right_nritems == 0) {
		return 1;
	}

1996 1997
	WARN_ON(!btrfs_tree_locked(path->nodes[1]));

1998
	left = read_node_slot(root, path->nodes[1], slot - 1);
1999
	btrfs_tree_lock(left);
C
Chris Mason 已提交
2000
	free_space = btrfs_leaf_free_space(root, left);
C
Chris Mason 已提交
2001
	if (free_space < data_size + sizeof(struct btrfs_item)) {
2002 2003
		ret = 1;
		goto out;
2004
	}
C
Chris Mason 已提交
2005 2006

	/* cow and double check */
2007 2008
	ret = btrfs_cow_block(trans, root, left,
			      path->nodes[1], slot - 1, &left);
2009 2010
	if (ret) {
		/* we hit -ENOSPC, but it isn't fatal here */
2011 2012
		ret = 1;
		goto out;
2013
	}
2014

C
Chris Mason 已提交
2015
	free_space = btrfs_leaf_free_space(root, left);
C
Chris Mason 已提交
2016
	if (free_space < data_size + sizeof(struct btrfs_item)) {
2017 2018
		ret = 1;
		goto out;
C
Chris Mason 已提交
2019 2020
	}

2021 2022 2023 2024 2025 2026
	if (empty)
		nr = right_nritems;
	else
		nr = right_nritems - 1;

	for (i = 0; i < nr; i++) {
2027
		item = btrfs_item_nr(right, i);
2028 2029 2030 2031 2032 2033 2034 2035
		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);
		}

2036 2037
		if (path->slots[0] == i)
			push_space += data_size + sizeof(*item);
2038 2039 2040

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

2043
		push_items++;
2044 2045 2046 2047 2048 2049
		push_space += this_item_size + sizeof(*item);
	}

	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
2050
	}
2051

2052
	if (push_items == 0) {
2053 2054
		ret = 1;
		goto out;
2055
	}
2056
	if (!empty && push_items == btrfs_header_nritems(right))
2057
		WARN_ON(1);
2058

2059
	/* push data from right to left */
2060 2061 2062 2063 2064
	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 已提交
2065
	push_space = BTRFS_LEAF_DATA_SIZE(root) -
2066 2067 2068
		     btrfs_item_offset_nr(right, push_items -1);

	copy_extent_buffer(left, right, btrfs_leaf_data(left) +
C
Chris Mason 已提交
2069 2070
		     leaf_data_end(root, left) - push_space,
		     btrfs_leaf_data(right) +
2071
		     btrfs_item_offset_nr(right, push_items - 1),
C
Chris Mason 已提交
2072
		     push_space);
2073
	old_left_nritems = btrfs_header_nritems(left);
2074 2075
	BUG_ON(old_left_nritems < 0);

2076
	old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1);
C
Chris Mason 已提交
2077
	for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
2078
		u32 ioff;
2079

2080
		item = btrfs_item_nr(left, i);
2081 2082 2083 2084 2085 2086 2087 2088
		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);
		}

2089 2090
		ioff = btrfs_item_offset(left, item);
		btrfs_set_item_offset(left, item,
2091
		      ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size));
2092
	}
2093
	btrfs_set_header_nritems(left, old_left_nritems + push_items);
2094 2095 2096 2097
	if (left->map_token) {
		unmap_extent_buffer(left, left->map_token, KM_USER1);
		left->map_token = NULL;
	}
2098 2099

	/* fixup right node */
2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113
	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),
2114 2115 2116
			      btrfs_item_nr_offset(push_items),
			     (btrfs_header_nritems(right) - push_items) *
			     sizeof(struct btrfs_item));
2117
	}
2118 2119
	right_nritems -= push_items;
	btrfs_set_header_nritems(right, right_nritems);
C
Chris Mason 已提交
2120
	push_space = BTRFS_LEAF_DATA_SIZE(root);
2121 2122
	for (i = 0; i < right_nritems; i++) {
		item = btrfs_item_nr(right, i);
2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137

		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;
2138
	}
2139

2140
	btrfs_mark_buffer_dirty(left);
2141 2142
	if (right_nritems)
		btrfs_mark_buffer_dirty(right);
2143

2144 2145
	btrfs_item_key(right, &disk_key, 0);
	wret = fixup_low_keys(trans, root, path, &disk_key, 1);
C
Chris Mason 已提交
2146 2147
	if (wret)
		ret = wret;
2148 2149 2150 2151

	/* then fixup the leaf pointer in the path */
	if (path->slots[0] < push_items) {
		path->slots[0] += old_left_nritems;
2152 2153 2154
		if (btrfs_header_nritems(path->nodes[0]) == 0)
			clean_tree_block(trans, root, path->nodes[0]);
		btrfs_tree_unlock(path->nodes[0]);
2155 2156
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = left;
2157 2158
		path->slots[1] -= 1;
	} else {
2159
		btrfs_tree_unlock(left);
2160
		free_extent_buffer(left);
2161 2162
		path->slots[0] -= push_items;
	}
2163
	BUG_ON(path->slots[0] < 0);
C
Chris Mason 已提交
2164
	return ret;
2165 2166 2167 2168
out:
	btrfs_tree_unlock(left);
	free_extent_buffer(left);
	return ret;
2169 2170
}

C
Chris Mason 已提交
2171 2172 2173
/*
 * 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 已提交
2174 2175
 *
 * returns 0 if all went well and < 0 on failure.
C
Chris Mason 已提交
2176
 */
2177
static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
2178
		      *root, struct btrfs_key *ins_key,
2179
		      struct btrfs_path *path, int data_size, int extend)
2180
{
2181
	u64 root_gen;
2182
	struct extent_buffer *l;
2183
	u32 nritems;
2184 2185
	int mid;
	int slot;
2186
	struct extent_buffer *right;
C
Chris Mason 已提交
2187
	int space_needed = data_size + sizeof(struct btrfs_item);
2188 2189 2190
	int data_copy_size;
	int rt_data_off;
	int i;
2191
	int ret = 0;
C
Chris Mason 已提交
2192
	int wret;
2193 2194
	int double_split;
	int num_doubles = 0;
2195
	struct btrfs_disk_key disk_key;
C
Chris Mason 已提交
2196

2197 2198 2199
	if (extend)
		space_needed = data_size;

2200 2201 2202 2203 2204
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

C
Chris Mason 已提交
2205
	/* first try to make some room by pushing left and right */
2206
	if (ins_key->type != BTRFS_DIR_ITEM_KEY) {
2207
		wret = push_leaf_right(trans, root, path, data_size, 0);
2208
		if (wret < 0) {
C
Chris Mason 已提交
2209
			return wret;
2210 2211
		}
		if (wret) {
2212
			wret = push_leaf_left(trans, root, path, data_size, 0);
2213 2214 2215 2216
			if (wret < 0)
				return wret;
		}
		l = path->nodes[0];
C
Chris Mason 已提交
2217

2218
		/* did the pushes work? */
2219
		if (btrfs_leaf_free_space(root, l) >= space_needed)
2220
			return 0;
2221
	}
C
Chris Mason 已提交
2222

C
Chris Mason 已提交
2223
	if (!path->nodes[1]) {
2224
		ret = insert_new_root(trans, root, path, 1);
C
Chris Mason 已提交
2225 2226 2227
		if (ret)
			return ret;
	}
2228 2229 2230
again:
	double_split = 0;
	l = path->nodes[0];
2231
	slot = path->slots[0];
2232
	nritems = btrfs_header_nritems(l);
2233
	mid = (nritems + 1)/ 2;
2234

2235 2236
	btrfs_item_key(l, &disk_key, 0);

2237
	right = btrfs_alloc_free_block(trans, root, root->leafsize,
2238 2239 2240
					 root->root_key.objectid,
					 root_gen, disk_key.objectid, 0,
					 l->start, 0);
2241 2242
	if (IS_ERR(right)) {
		BUG_ON(1);
2243
		return PTR_ERR(right);
2244
	}
2245 2246

	memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
2247
	btrfs_set_header_bytenr(right, right->start);
2248 2249 2250 2251 2252 2253
	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);
2254 2255 2256 2257

	write_extent_buffer(right, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(right),
			    BTRFS_UUID_SIZE);
2258 2259 2260 2261 2262 2263
	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);
2264
				btrfs_set_header_nritems(right, 0);
2265
				wret = insert_ptr(trans, root, path,
2266
						  &disk_key, right->start,
2267 2268 2269
						  path->slots[1] + 1, 1);
				if (wret)
					ret = wret;
2270 2271

				btrfs_tree_unlock(path->nodes[0]);
2272 2273
				free_extent_buffer(path->nodes[0]);
				path->nodes[0] = right;
2274 2275
				path->slots[0] = 0;
				path->slots[1] += 1;
2276
				btrfs_mark_buffer_dirty(right);
2277 2278 2279
				return ret;
			}
			mid = slot;
2280 2281 2282 2283 2284
			if (mid != nritems &&
			    leaf_space_used(l, mid, nritems - mid) +
			    space_needed > BTRFS_LEAF_DATA_SIZE(root)) {
				double_split = 1;
			}
2285 2286 2287 2288
		}
	} else {
		if (leaf_space_used(l, 0, mid + 1) + space_needed >
			BTRFS_LEAF_DATA_SIZE(root)) {
2289
			if (!extend && slot == 0) {
2290
				btrfs_cpu_key_to_disk(&disk_key, ins_key);
2291
				btrfs_set_header_nritems(right, 0);
2292 2293
				wret = insert_ptr(trans, root, path,
						  &disk_key,
2294
						  right->start,
2295
						  path->slots[1], 1);
2296 2297
				if (wret)
					ret = wret;
2298
				btrfs_tree_unlock(path->nodes[0]);
2299 2300
				free_extent_buffer(path->nodes[0]);
				path->nodes[0] = right;
2301
				path->slots[0] = 0;
2302 2303 2304 2305 2306 2307
				if (path->slots[1] == 0) {
					wret = fixup_low_keys(trans, root,
					           path, &disk_key, 1);
					if (wret)
						ret = wret;
				}
2308
				btrfs_mark_buffer_dirty(right);
2309
				return ret;
2310 2311 2312 2313 2314 2315 2316 2317 2318
			} 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;
				}
2319
			}
2320 2321
		}
	}
2322 2323 2324 2325 2326 2327 2328 2329 2330
	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 已提交
2331 2332 2333
		     btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
		     data_copy_size, btrfs_leaf_data(l) +
		     leaf_data_end(root, l), data_copy_size);
2334

C
Chris Mason 已提交
2335
	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
2336
		      btrfs_item_end_nr(l, mid);
C
Chris Mason 已提交
2337

2338 2339
	for (i = 0; i < nritems; i++) {
		struct btrfs_item *item = btrfs_item_nr(right, i);
2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350
		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);
2351
		btrfs_set_item_offset(right, item, ioff + rt_data_off);
C
Chris Mason 已提交
2352
	}
C
Chris Mason 已提交
2353

2354 2355 2356 2357 2358
	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
	}

2359
	btrfs_set_header_nritems(l, mid);
C
Chris Mason 已提交
2360
	ret = 0;
2361
	btrfs_item_key(right, &disk_key, 0);
2362 2363
	wret = insert_ptr(trans, root, path, &disk_key, right->start,
			  path->slots[1] + 1, 1);
C
Chris Mason 已提交
2364 2365
	if (wret)
		ret = wret;
2366 2367 2368

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

2371
	if (mid <= slot) {
2372
		btrfs_tree_unlock(path->nodes[0]);
2373 2374
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = right;
2375 2376
		path->slots[0] -= mid;
		path->slots[1] += 1;
2377 2378
	} else {
		btrfs_tree_unlock(right);
2379
		free_extent_buffer(right);
2380
	}
2381

2382
	BUG_ON(path->slots[0] < 0);
2383

2384 2385 2386 2387
	if (double_split) {
		BUG_ON(num_doubles != 0);
		num_doubles++;
		goto again;
2388
	}
2389 2390 2391
	return ret;
}

C
Chris Mason 已提交
2392 2393 2394
int btrfs_truncate_item(struct btrfs_trans_handle *trans,
			struct btrfs_root *root,
			struct btrfs_path *path,
2395
			u32 new_size, int from_end)
C
Chris Mason 已提交
2396 2397 2398 2399
{
	int ret = 0;
	int slot;
	int slot_orig;
2400 2401
	struct extent_buffer *leaf;
	struct btrfs_item *item;
C
Chris Mason 已提交
2402 2403 2404 2405 2406 2407 2408 2409
	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];
2410
	leaf = path->nodes[0];
2411 2412 2413 2414 2415
	slot = path->slots[0];

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

2417
	nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
2418 2419
	data_end = leaf_data_end(root, leaf);

2420
	old_data_start = btrfs_item_offset_nr(leaf, slot);
2421

C
Chris Mason 已提交
2422 2423 2424 2425 2426 2427 2428 2429 2430 2431
	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++) {
2432 2433
		u32 ioff;
		item = btrfs_item_nr(leaf, i);
2434 2435 2436 2437 2438 2439 2440 2441 2442

		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);
		}

2443 2444
		ioff = btrfs_item_offset(leaf, item);
		btrfs_set_item_offset(leaf, item, ioff + size_diff);
C
Chris Mason 已提交
2445
	}
2446 2447 2448 2449 2450 2451

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

C
Chris Mason 已提交
2452
	/* shift the data */
2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 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
	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);
	}
2492 2493 2494 2495

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

	ret = 0;
2498 2499
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
C
Chris Mason 已提交
2500
		BUG();
2501
	}
C
Chris Mason 已提交
2502 2503 2504
	return ret;
}

2505 2506 2507
int btrfs_extend_item(struct btrfs_trans_handle *trans,
		      struct btrfs_root *root, struct btrfs_path *path,
		      u32 data_size)
2508 2509 2510 2511
{
	int ret = 0;
	int slot;
	int slot_orig;
2512 2513
	struct extent_buffer *leaf;
	struct btrfs_item *item;
2514 2515 2516 2517 2518 2519 2520
	u32 nritems;
	unsigned int data_end;
	unsigned int old_data;
	unsigned int old_size;
	int i;

	slot_orig = path->slots[0];
2521
	leaf = path->nodes[0];
2522

2523
	nritems = btrfs_header_nritems(leaf);
2524 2525
	data_end = leaf_data_end(root, leaf);

2526 2527
	if (btrfs_leaf_free_space(root, leaf) < data_size) {
		btrfs_print_leaf(root, leaf);
2528
		BUG();
2529
	}
2530
	slot = path->slots[0];
2531
	old_data = btrfs_item_end_nr(leaf, slot);
2532 2533

	BUG_ON(slot < 0);
2534 2535 2536 2537 2538
	if (slot >= nritems) {
		btrfs_print_leaf(root, leaf);
		printk("slot %d too large, nritems %d\n", slot, nritems);
		BUG_ON(1);
	}
2539 2540 2541 2542 2543 2544

	/*
	 * item0..itemN ... dataN.offset..dataN.size .. data0.size
	 */
	/* first correct the data pointers */
	for (i = slot; i < nritems; i++) {
2545 2546
		u32 ioff;
		item = btrfs_item_nr(leaf, i);
2547 2548 2549 2550 2551 2552 2553 2554

		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);
		}
2555 2556
		ioff = btrfs_item_offset(leaf, item);
		btrfs_set_item_offset(leaf, item, ioff - data_size);
2557
	}
2558

2559 2560 2561 2562 2563
	if (leaf->map_token) {
		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
		leaf->map_token = NULL;
	}

2564
	/* shift the data */
2565
	memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
2566 2567
		      data_end - data_size, btrfs_leaf_data(leaf) +
		      data_end, old_data - data_end);
2568

2569
	data_end = old_data;
2570 2571 2572 2573
	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);
2574 2575

	ret = 0;
2576 2577
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
2578
		BUG();
2579
	}
2580 2581 2582
	return ret;
}

C
Chris Mason 已提交
2583 2584 2585 2586
/*
 * 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.
 */
2587
int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
2588 2589
			    struct btrfs_root *root,
			    struct btrfs_path *path,
2590 2591
			    struct btrfs_key *cpu_key, u32 *data_size,
			    int nr)
2592
{
2593 2594
	struct extent_buffer *leaf;
	struct btrfs_item *item;
C
Chris Mason 已提交
2595
	int ret = 0;
2596
	int slot;
2597
	int slot_orig;
2598
	int i;
2599
	u32 nritems;
2600 2601
	u32 total_size = 0;
	u32 total_data = 0;
2602
	unsigned int data_end;
C
Chris Mason 已提交
2603 2604
	struct btrfs_disk_key disk_key;

2605 2606 2607
	for (i = 0; i < nr; i++) {
		total_data += data_size[i];
	}
2608

2609 2610
	total_size = total_data + (nr - 1) * sizeof(struct btrfs_item);
	ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1);
2611
	if (ret == 0) {
2612
		return -EEXIST;
C
Chris Mason 已提交
2613
	}
2614 2615
	if (ret < 0)
		goto out;
2616

2617
	slot_orig = path->slots[0];
2618
	leaf = path->nodes[0];
C
Chris Mason 已提交
2619

2620
	nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
2621
	data_end = leaf_data_end(root, leaf);
2622

C
Chris Mason 已提交
2623
	if (btrfs_leaf_free_space(root, leaf) <
2624
	    sizeof(struct btrfs_item) + total_size) {
2625 2626
		btrfs_print_leaf(root, leaf);
		printk("not enough freespace need %u have %d\n",
2627
		       total_size, btrfs_leaf_free_space(root, leaf));
2628
		BUG();
2629
	}
2630

2631
	slot = path->slots[0];
2632
	BUG_ON(slot < 0);
2633

2634 2635
	if (slot != nritems) {
		int i;
2636
		unsigned int old_data = btrfs_item_end_nr(leaf, slot);
2637

2638 2639 2640 2641 2642 2643
		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);
		}
2644 2645 2646 2647
		/*
		 * item0..itemN ... dataN.offset..dataN.size .. data0.size
		 */
		/* first correct the data pointers */
2648
		WARN_ON(leaf->map_token);
C
Chris Mason 已提交
2649
		for (i = slot; i < nritems; i++) {
2650
			u32 ioff;
2651

2652
			item = btrfs_item_nr(leaf, i);
2653 2654 2655 2656 2657 2658 2659 2660
			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);
			}

2661
			ioff = btrfs_item_offset(leaf, item);
2662
			btrfs_set_item_offset(leaf, item, ioff - total_data);
C
Chris Mason 已提交
2663
		}
2664 2665 2666 2667
		if (leaf->map_token) {
			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
			leaf->map_token = NULL;
		}
2668 2669

		/* shift the items */
2670
		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr),
2671
			      btrfs_item_nr_offset(slot),
C
Chris Mason 已提交
2672
			      (nritems - slot) * sizeof(struct btrfs_item));
2673 2674

		/* shift the data */
2675
		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
2676
			      data_end - total_data, btrfs_leaf_data(leaf) +
C
Chris Mason 已提交
2677
			      data_end, old_data - data_end);
2678 2679
		data_end = old_data;
	}
2680

2681
	/* setup the item for the new data */
2682 2683 2684 2685 2686 2687 2688 2689 2690
	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);
2691
	btrfs_mark_buffer_dirty(leaf);
C
Chris Mason 已提交
2692 2693

	ret = 0;
2694 2695
	if (slot == 0) {
		btrfs_cpu_key_to_disk(&disk_key, cpu_key);
2696
		ret = fixup_low_keys(trans, root, path, &disk_key, 1);
2697
	}
C
Chris Mason 已提交
2698

2699 2700
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
2701
		BUG();
2702
	}
2703
out:
2704 2705 2706 2707 2708 2709 2710
	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.
 */
2711 2712 2713
int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_key *cpu_key, void *data, u32
		      data_size)
2714 2715
{
	int ret = 0;
C
Chris Mason 已提交
2716
	struct btrfs_path *path;
2717 2718
	struct extent_buffer *leaf;
	unsigned long ptr;
2719

C
Chris Mason 已提交
2720 2721 2722
	path = btrfs_alloc_path();
	BUG_ON(!path);
	ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
2723
	if (!ret) {
2724 2725 2726 2727
		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);
2728
	}
C
Chris Mason 已提交
2729
	btrfs_free_path(path);
C
Chris Mason 已提交
2730
	return ret;
2731 2732
}

C
Chris Mason 已提交
2733
/*
C
Chris Mason 已提交
2734
 * delete the pointer from a given node.
C
Chris Mason 已提交
2735 2736 2737 2738 2739
 *
 * 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.
 */
2740 2741
static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		   struct btrfs_path *path, int level, int slot)
2742
{
2743
	struct extent_buffer *parent = path->nodes[level];
2744
	u32 nritems;
C
Chris Mason 已提交
2745
	int ret = 0;
2746
	int wret;
2747

2748
	nritems = btrfs_header_nritems(parent);
2749
	if (slot != nritems -1) {
2750 2751 2752
		memmove_extent_buffer(parent,
			      btrfs_node_key_ptr_offset(slot),
			      btrfs_node_key_ptr_offset(slot + 1),
C
Chris Mason 已提交
2753 2754
			      sizeof(struct btrfs_key_ptr) *
			      (nritems - slot - 1));
2755
	}
2756
	nritems--;
2757
	btrfs_set_header_nritems(parent, nritems);
2758
	if (nritems == 0 && parent == root->node) {
2759
		BUG_ON(btrfs_header_level(root->node) != 1);
2760
		/* just turn the root into a leaf and break */
2761
		btrfs_set_header_level(root->node, 0);
2762
	} else if (slot == 0) {
2763 2764 2765 2766
		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 已提交
2767 2768
		if (wret)
			ret = wret;
2769
	}
C
Chris Mason 已提交
2770
	btrfs_mark_buffer_dirty(parent);
C
Chris Mason 已提交
2771
	return ret;
2772 2773
}

C
Chris Mason 已提交
2774 2775 2776 2777
/*
 * delete the item at the leaf level in path.  If that empties
 * the leaf, remove it from the tree
 */
2778 2779
int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		    struct btrfs_path *path, int slot, int nr)
2780
{
2781 2782
	struct extent_buffer *leaf;
	struct btrfs_item *item;
2783 2784
	int last_off;
	int dsize = 0;
C
Chris Mason 已提交
2785 2786
	int ret = 0;
	int wret;
2787
	int i;
2788
	u32 nritems;
2789

2790
	leaf = path->nodes[0];
2791 2792 2793 2794 2795
	last_off = btrfs_item_offset_nr(leaf, slot + nr - 1);

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

2796
	nritems = btrfs_header_nritems(leaf);
2797

2798
	if (slot + nr != nritems) {
2799
		int i;
C
Chris Mason 已提交
2800
		int data_end = leaf_data_end(root, leaf);
2801 2802

		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
C
Chris Mason 已提交
2803 2804
			      data_end + dsize,
			      btrfs_leaf_data(leaf) + data_end,
2805
			      last_off - data_end);
2806

2807
		for (i = slot + nr; i < nritems; i++) {
2808
			u32 ioff;
2809

2810
			item = btrfs_item_nr(leaf, i);
2811 2812 2813 2814 2815 2816 2817
			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);
			}
2818 2819
			ioff = btrfs_item_offset(leaf, item);
			btrfs_set_item_offset(leaf, item, ioff + dsize);
C
Chris Mason 已提交
2820
		}
2821 2822 2823 2824 2825 2826

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

2827
		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
2828
			      btrfs_item_nr_offset(slot + nr),
C
Chris Mason 已提交
2829
			      sizeof(struct btrfs_item) *
2830
			      (nritems - slot - nr));
2831
	}
2832 2833
	btrfs_set_header_nritems(leaf, nritems - nr);
	nritems -= nr;
2834

C
Chris Mason 已提交
2835
	/* delete the leaf if we've emptied it */
2836
	if (nritems == 0) {
2837 2838
		if (leaf == root->node) {
			btrfs_set_header_level(leaf, 0);
2839
		} else {
2840
			u64 root_gen = btrfs_header_generation(path->nodes[1]);
2841
			wret = del_ptr(trans, root, path, 1, path->slots[1]);
C
Chris Mason 已提交
2842 2843
			if (wret)
				ret = wret;
2844
			wret = btrfs_free_extent(trans, root,
2845 2846 2847
					 leaf->start, leaf->len,
					 btrfs_header_owner(path->nodes[1]),
					 root_gen, 0, 0, 1);
C
Chris Mason 已提交
2848 2849
			if (wret)
				ret = wret;
2850
		}
2851
	} else {
2852
		int used = leaf_space_used(leaf, 0, nritems);
C
Chris Mason 已提交
2853
		if (slot == 0) {
2854 2855 2856
			struct btrfs_disk_key disk_key;

			btrfs_item_key(leaf, &disk_key, 0);
2857
			wret = fixup_low_keys(trans, root, path,
2858
					      &disk_key, 1);
C
Chris Mason 已提交
2859 2860 2861 2862
			if (wret)
				ret = wret;
		}

C
Chris Mason 已提交
2863
		/* delete the leaf if it is mostly empty */
2864
		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
2865 2866 2867 2868
			/* push_leaf_left fixes the path.
			 * make sure the path still points to our leaf
			 * for possible call to del_ptr below
			 */
2869
			slot = path->slots[1];
2870 2871
			extent_buffer_get(leaf);

2872
			wret = push_leaf_left(trans, root, path, 1, 1);
2873
			if (wret < 0 && wret != -ENOSPC)
C
Chris Mason 已提交
2874
				ret = wret;
2875 2876 2877

			if (path->nodes[0] == leaf &&
			    btrfs_header_nritems(leaf)) {
2878
				wret = push_leaf_right(trans, root, path, 1, 1);
2879
				if (wret < 0 && wret != -ENOSPC)
C
Chris Mason 已提交
2880 2881
					ret = wret;
			}
2882 2883

			if (btrfs_header_nritems(leaf) == 0) {
2884
				u64 root_gen;
2885 2886
				u64 bytenr = leaf->start;
				u32 blocksize = leaf->len;
2887

2888 2889 2890
				root_gen = btrfs_header_generation(
							   path->nodes[1]);

2891
				wret = del_ptr(trans, root, path, 1, slot);
C
Chris Mason 已提交
2892 2893
				if (wret)
					ret = wret;
2894 2895

				free_extent_buffer(leaf);
2896
				wret = btrfs_free_extent(trans, root, bytenr,
2897 2898 2899
					     blocksize,
					     btrfs_header_owner(path->nodes[1]),
					     root_gen, 0, 0, 1);
C
Chris Mason 已提交
2900 2901
				if (wret)
					ret = wret;
C
Chris Mason 已提交
2902
			} else {
2903 2904 2905 2906 2907 2908 2909
				/* 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);
2910
				free_extent_buffer(leaf);
2911
			}
2912
		} else {
2913
			btrfs_mark_buffer_dirty(leaf);
2914 2915
		}
	}
C
Chris Mason 已提交
2916
	return ret;
2917 2918
}

2919
/*
2920
 * search the tree again to find a leaf with lesser keys
2921 2922 2923 2924 2925
 * 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)
{
2926 2927 2928
	struct btrfs_key key;
	struct btrfs_disk_key found_key;
	int ret;
2929

2930
	btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
2931

2932 2933 2934 2935 2936 2937 2938 2939
	if (key.offset > 0)
		key.offset--;
	else if (key.type > 0)
		key.type--;
	else if (key.objectid > 0)
		key.objectid--;
	else
		return 1;
2940

2941 2942 2943 2944 2945 2946 2947 2948 2949
	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;
2950 2951
}

C
Chris Mason 已提交
2952
/*
2953
 * search the tree again to find a leaf with greater keys
C
Chris Mason 已提交
2954 2955
 * returns 0 if it found something or 1 if there are no greater leaves.
 * returns < 0 on io errors.
C
Chris Mason 已提交
2956
 */
C
Chris Mason 已提交
2957
int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
2958 2959 2960
{
	int slot;
	int level = 1;
2961 2962
	struct extent_buffer *c;
	struct extent_buffer *next = NULL;
2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974
	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);
2975
	path->keep_locks = 1;
2976 2977 2978 2979 2980 2981
	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
	path->keep_locks = 0;

	if (ret < 0)
		return ret;

2982 2983
	nritems = btrfs_header_nritems(path->nodes[0]);
	if (nritems > 0 && path->slots[0] < nritems - 1) {
2984 2985
		goto done;
	}
2986

C
Chris Mason 已提交
2987
	while(level < BTRFS_MAX_LEVEL) {
2988
		if (!path->nodes[level])
C
Chris Mason 已提交
2989
			return 1;
2990

2991 2992
		slot = path->slots[level] + 1;
		c = path->nodes[level];
2993
		if (slot >= btrfs_header_nritems(c)) {
2994
			level++;
2995
			if (level == BTRFS_MAX_LEVEL) {
2996
				return 1;
2997
			}
2998 2999
			continue;
		}
3000

3001 3002
		if (next) {
			btrfs_tree_unlock(next);
3003
			free_extent_buffer(next);
3004
		}
3005

3006
		if (level == 1 && path->locks[1] && path->reada)
3007
			reada_for_search(root, path, level, slot, 0);
3008

3009
		next = read_node_slot(root, c, slot);
3010 3011 3012 3013 3014 3015 3016 3017 3018
		if (!path->skip_locking) {
			if (!btrfs_tree_locked(c)) {
				int i;
				WARN_ON(1);
printk("path %p no lock on level %d\n", path, level);
for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
printk("path %p level %d slot %d nritems %d\n", path, i, path->slots[i], btrfs_header_nritems(path->nodes[i]));
}
			}
3019
			btrfs_tree_lock(next);
3020
		}
3021 3022 3023 3024 3025 3026
		break;
	}
	path->slots[level] = slot;
	while(1) {
		level--;
		c = path->nodes[level];
3027 3028
		if (path->locks[level])
			btrfs_tree_unlock(c);
3029
		free_extent_buffer(c);
3030 3031
		path->nodes[level] = next;
		path->slots[level] = 0;
3032
		path->locks[level] = 1;
3033 3034
		if (!level)
			break;
3035 3036
		if (level == 1 && path->locks[1] && path->reada)
			reada_for_search(root, path, level, slot, 0);
3037
		next = read_node_slot(root, next, 0);
3038 3039
		if (!path->skip_locking) {
			WARN_ON(!btrfs_tree_locked(path->nodes[level]));
3040
			btrfs_tree_lock(next);
3041
		}
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;
}