ctree.c 77.1 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;
C
Chris Mason 已提交
66
	for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
67
		if (!p->nodes[i])
68 69 70 71 72
			continue;
		if (p->locks[i]) {
			btrfs_tree_unlock(p->nodes[i]);
			p->locks[i] = 0;
		}
73
		free_extent_buffer(p->nodes[i]);
74
	}
C
Chris Mason 已提交
75
	memset(p, 0, sizeof(*p));
76 77
}

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
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;
}

109 110 111 112 113 114 115 116
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);
	}
}

117 118 119 120 121 122 123 124 125 126
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;
127
	struct btrfs_root *new_root;
128

129 130 131 132 133 134
	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;
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

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

	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);
163
	btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN);
164 165

	WARN_ON(btrfs_header_generation(buf) > trans->transid);
166 167 168
	ret = btrfs_inc_ref(trans, new_root, buf);
	kfree(new_root);

169 170 171 172 173 174 175 176 177
	if (ret)
		return ret;

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

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

193 194 195 196 197
	if (*cow_ret == buf)
		unlock_orig = 1;

	WARN_ON(!btrfs_tree_locked(buf));

198 199 200 201 202 203 204
	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);
205
	WARN_ON(root->ref_cows && trans->transid != root->last_trans);
206

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

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

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

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

		spin_lock(&root->node_lock);
C
Chris Mason 已提交
245
		root->node = cow;
246
		extent_buffer_get(cow);
247 248
		spin_unlock(&root->node_lock);

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

277 278 279 280
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)
281 282
{
	u64 search_start;
C
Chris Mason 已提交
283
	u64 header_trans;
284
	int ret;
C
Chris Mason 已提交
285

286 287 288 289 290 291 292 293 294 295
	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 已提交
296 297

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

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

321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
/*
 * 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;
}


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

368 369 370
	/* FIXME this code needs locking */
	return 0;

371 372 373 374
	parent_level = btrfs_header_level(parent);
	if (cache_only && parent_level != 1)
		return 0;

375 376 377 378 379 380 381 382 383 384
	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);
	}
385

386 387
	parent_nritems = btrfs_header_nritems(parent);
	blocksize = btrfs_level_size(root, parent_level - 1);
388 389 390 391 392 393 394
	end_slot = parent_nritems;

	if (parent_nritems == 1)
		return 0;

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

396 397 398 399 400 401 402 403
		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);
		}
404 405 406 407 408
		btrfs_node_key(parent, &disk_key, i);
		if (!progress_passed && comp_keys(&disk_key, progress) < 0)
			continue;

		progress_passed = 1;
409
		blocknr = btrfs_node_blockptr(parent, i);
410
		gen = btrfs_node_ptr_generation(parent, i);
411 412
		if (last_block == 0)
			last_block = blocknr;
413

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

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

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

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

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

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

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

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

540
	u32 nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
541 542

	if (path->nodes[level + 1])
543
		parent = path->nodes[level + 1];
544 545 546 547 548

	if (nritems == 0)
		return 0;

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

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

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

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

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

	while(low < high) {
		mid = (low + high) / 2;
680 681 682 683 684
		offset = p + mid * item_size;

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

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

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

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

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

	BUG_ON(level == 0);

760
	return read_tree_block(root, btrfs_node_blockptr(parent, slot),
761 762
		       btrfs_level_size(root, level - 1),
		       btrfs_node_ptr_generation(parent, slot));
763 764
}

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

	if (level == 0)
		return 0;

783
	mid = path->nodes[level];
784
	WARN_ON(!path->locks[level]);
785 786
	WARN_ON(btrfs_header_generation(mid) != trans->transid);

787
	orig_ptr = btrfs_node_blockptr(mid, orig_slot);
788

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

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

800
		if (btrfs_header_nritems(mid) != 1)
801 802 803
			return 0;

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

810
		spin_lock(&root->node_lock);
811
		root->node = child;
812 813
		spin_unlock(&root->node_lock);

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

833
	if (btrfs_header_nritems(mid) < 2)
834 835
		err_on_enospc = 1;

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

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

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

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

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

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

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

	if (level == 0)
		return 1;

1002
	mid = path->nodes[level];
1003
	WARN_ON(btrfs_header_generation(mid) != trans->transid);
1004 1005 1006
	orig_ptr = btrfs_node_blockptr(mid, orig_slot);

	if (level < BTRFS_MAX_LEVEL - 1)
1007
		parent = path->nodes[level + 1];
1008 1009
	pslot = path->slots[level + 1];

1010
	if (!parent)
1011 1012
		return 1;

1013
	left = read_node_slot(root, parent, pslot - 1);
1014 1015

	/* first, try to make some room in the middle buffer */
1016
	if (left) {
1017
		u32 left_nr;
1018 1019

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

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

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

1128
	if (level != 1)
1129 1130 1131
		return;

	if (!path->nodes[level])
1132 1133
		return;

1134
	node = path->nodes[level];
1135 1136
	WARN_ON(!path->skip_locking && !btrfs_tree_locked(node));

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

1145 1146 1147
	highest_read = search;
	lowest_read = search;

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

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);
			if (path->slots[i] >= nritems - 1) {
				skip_level = i + 1;
				continue;
			}
		}
		t = path->nodes[i];
		if (i >= lowest_unlock && i > skip_level && path->locks[i]) {
			btrfs_tree_unlock(t);
			path->locks[i] = 0;
		}
	}
}

C
Chris Mason 已提交
1218 1219 1220 1221 1222 1223
/*
 * 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 已提交
1224 1225
 * be inserted, and 1 is returned.  If there are other errors during the
 * search a negative error number is returned.
C
Chris Mason 已提交
1226 1227 1228 1229
 *
 * 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 已提交
1230
 */
1231 1232 1233
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)
1234
{
1235
	struct extent_buffer *b;
1236 1237 1238
	int slot;
	int ret;
	int level;
1239
	int should_reada = p->reada;
1240
	int lowest_unlock = 1;
1241 1242
	u8 lowest_level = 0;

1243 1244
	lowest_level = p->lowest_level;
	WARN_ON(lowest_level && ins_len);
C
Chris Mason 已提交
1245
	WARN_ON(p->nodes[0] != NULL);
1246 1247 1248 1249 1250 1251 1252 1253 1254
	// WARN_ON(!mutex_is_locked(&root->fs_info->fs_mutex));
	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;
1255
again:
1256 1257 1258 1259 1260
	if (!p->skip_locking)
		b = btrfs_lock_root_node(root);
	else
		b = btrfs_root_node(root);

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

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

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

			b = read_node_slot(root, b, slot);
1322 1323 1324
			if (!p->skip_locking)
				btrfs_tree_lock(b);
			unlock_up(p, level, lowest_unlock);
1325 1326
		} else {
			p->slots[level] = slot;
1327
			if (ins_len > 0 && btrfs_leaf_free_space(root, b) <
C
Chris Mason 已提交
1328
			    sizeof(struct btrfs_item) + ins_len) {
1329
				int sret = split_leaf(trans, root, key,
1330
						      p, ins_len, ret == 0);
C
Chris Mason 已提交
1331 1332 1333 1334
				BUG_ON(sret > 0);
				if (sret)
					return sret;
			}
1335
			unlock_up(p, level, lowest_unlock);
1336 1337 1338
			return ret;
		}
	}
C
Chris Mason 已提交
1339
	return 1;
1340 1341
}

C
Chris Mason 已提交
1342 1343 1344 1345 1346 1347
/*
 * 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 已提交
1348 1349 1350
 *
 * 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 已提交
1351
 */
1352 1353 1354
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)
1355 1356
{
	int i;
C
Chris Mason 已提交
1357
	int ret = 0;
1358 1359
	struct extent_buffer *t;

C
Chris Mason 已提交
1360
	for (i = level; i < BTRFS_MAX_LEVEL; i++) {
1361
		int tslot = path->slots[i];
1362
		if (!path->nodes[i])
1363
			break;
1364 1365
		t = path->nodes[i];
		btrfs_set_node_key(t, key, tslot);
1366 1367 1368 1369 1370 1371 1372
		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 已提交
1373
		btrfs_mark_buffer_dirty(path->nodes[i]);
1374 1375 1376
		if (tslot != 0)
			break;
	}
C
Chris Mason 已提交
1377
	return ret;
1378 1379
}

C
Chris Mason 已提交
1380 1381
/*
 * try to push data from one node into the next node left in the
1382
 * tree.
C
Chris Mason 已提交
1383 1384 1385
 *
 * 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 已提交
1386
 */
1387 1388
static int push_node_left(struct btrfs_trans_handle *trans,
			  struct btrfs_root *root, struct extent_buffer *dst,
1389
			  struct extent_buffer *src, int empty)
1390 1391
{
	int push_items = 0;
1392 1393
	int src_nritems;
	int dst_nritems;
C
Chris Mason 已提交
1394
	int ret = 0;
1395

1396 1397
	src_nritems = btrfs_header_nritems(src);
	dst_nritems = btrfs_header_nritems(dst);
C
Chris Mason 已提交
1398
	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
1399 1400
	WARN_ON(btrfs_header_generation(src) != trans->transid);
	WARN_ON(btrfs_header_generation(dst) != trans->transid);
1401

1402
	if (!empty && src_nritems <= 8)
1403 1404
		return 1;

1405
	if (push_items <= 0) {
1406
		return 1;
1407
	}
1408

1409
	if (empty) {
1410
		push_items = min(src_nritems, push_items);
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
		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);
1423

1424 1425 1426 1427 1428
	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));

1429
	if (push_items < src_nritems) {
1430 1431 1432 1433 1434 1435 1436 1437 1438
		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);
1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
	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
 */
1451 1452 1453 1454
static int balance_node_right(struct btrfs_trans_handle *trans,
			      struct btrfs_root *root,
			      struct extent_buffer *dst,
			      struct extent_buffer *src)
1455 1456 1457 1458 1459 1460 1461
{
	int push_items = 0;
	int max_push;
	int src_nritems;
	int dst_nritems;
	int ret = 0;

1462 1463 1464
	WARN_ON(btrfs_header_generation(src) != trans->transid);
	WARN_ON(btrfs_header_generation(dst) != trans->transid);

1465 1466
	src_nritems = btrfs_header_nritems(src);
	dst_nritems = btrfs_header_nritems(dst);
C
Chris Mason 已提交
1467
	push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
1468
	if (push_items <= 0) {
1469
		return 1;
1470 1471 1472 1473 1474
	}

	if (src_nritems < 4) {
		return 1;
	}
1475 1476 1477

	max_push = src_nritems / 2 + 1;
	/* don't try to empty the node */
1478
	if (max_push >= src_nritems) {
1479
		return 1;
1480
	}
Y
Yan 已提交
1481

1482 1483 1484
	if (max_push < push_items)
		push_items = max_push;

1485 1486 1487 1488
	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 已提交
1489

1490 1491 1492 1493
	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));
1494

1495 1496
	btrfs_set_header_nritems(src, src_nritems - push_items);
	btrfs_set_header_nritems(dst, dst_nritems + push_items);
1497

1498 1499
	btrfs_mark_buffer_dirty(src);
	btrfs_mark_buffer_dirty(dst);
C
Chris Mason 已提交
1500
	return ret;
1501 1502
}

C
Chris Mason 已提交
1503 1504 1505 1506
/*
 * 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 已提交
1507 1508
 *
 * returns zero on success or < 0 on failure.
C
Chris Mason 已提交
1509
 */
1510
static int noinline insert_new_root(struct btrfs_trans_handle *trans,
1511 1512
			   struct btrfs_root *root,
			   struct btrfs_path *path, int level)
C
Chris Mason 已提交
1513
{
1514 1515
	u64 root_gen;
	u64 lower_gen;
1516 1517
	struct extent_buffer *lower;
	struct extent_buffer *c;
1518
	struct extent_buffer *old;
1519
	struct btrfs_disk_key lower_key;
C
Chris Mason 已提交
1520 1521 1522 1523

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

1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534
	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);

1535
	c = btrfs_alloc_free_block(trans, root, root->nodesize,
1536 1537
				   root->root_key.objectid,
				   root_gen, lower_key.objectid, level,
1538
				   root->node->start, 0);
1539 1540
	if (IS_ERR(c))
		return PTR_ERR(c);
1541

1542 1543 1544
	memset_extent_buffer(c, 0, 0, root->nodesize);
	btrfs_set_header_nritems(c, 1);
	btrfs_set_header_level(c, level);
1545
	btrfs_set_header_bytenr(c, c->start);
1546 1547 1548 1549 1550 1551
	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);
1552 1553 1554 1555 1556

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

1557
	btrfs_set_node_key(c, &lower_key, 0);
1558
	btrfs_set_node_blockptr(c, 0, lower->start);
1559 1560 1561 1562
	lower_gen = btrfs_header_generation(lower);
	WARN_ON(lower_gen == 0);

	btrfs_set_node_ptr_generation(c, 0, lower_gen);
1563

1564
	btrfs_mark_buffer_dirty(c);
1565

1566 1567
	spin_lock(&root->node_lock);
	old = root->node;
1568
	root->node = c;
1569 1570 1571 1572 1573
	spin_unlock(&root->node_lock);

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

1574
	add_root_to_dirty_list(root);
1575 1576
	extent_buffer_get(c);
	path->nodes[level] = c;
1577
	path->locks[level] = 1;
C
Chris Mason 已提交
1578
	path->slots[level] = 0;
1579 1580 1581 1582

	if (root->ref_cows && lower_gen != trans->transid) {
		struct btrfs_path *back_path = btrfs_alloc_path();
		int ret;
1583
		mutex_lock(&root->fs_info->alloc_mutex);
1584 1585 1586 1587 1588 1589
		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);
1590
		mutex_unlock(&root->fs_info->alloc_mutex);
1591 1592
		btrfs_free_path(back_path);
	}
C
Chris Mason 已提交
1593 1594 1595
	return 0;
}

C
Chris Mason 已提交
1596 1597 1598
/*
 * worker function to insert a single pointer in a node.
 * the node should have enough room for the pointer already
C
Chris Mason 已提交
1599
 *
C
Chris Mason 已提交
1600 1601
 * slot and level indicate where you want the key to go, and
 * blocknr is the block the key points to.
C
Chris Mason 已提交
1602 1603
 *
 * returns zero on success and < 0 on any error
C
Chris Mason 已提交
1604
 */
1605 1606
static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, struct btrfs_disk_key
1607
		      *key, u64 bytenr, int slot, int level)
C
Chris Mason 已提交
1608
{
1609
	struct extent_buffer *lower;
C
Chris Mason 已提交
1610
	int nritems;
C
Chris Mason 已提交
1611 1612

	BUG_ON(!path->nodes[level]);
1613 1614
	lower = path->nodes[level];
	nritems = btrfs_header_nritems(lower);
C
Chris Mason 已提交
1615 1616
	if (slot > nritems)
		BUG();
C
Chris Mason 已提交
1617
	if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
C
Chris Mason 已提交
1618 1619
		BUG();
	if (slot != nritems) {
1620 1621 1622
		memmove_extent_buffer(lower,
			      btrfs_node_key_ptr_offset(slot + 1),
			      btrfs_node_key_ptr_offset(slot),
C
Chris Mason 已提交
1623
			      (nritems - slot) * sizeof(struct btrfs_key_ptr));
C
Chris Mason 已提交
1624
	}
1625
	btrfs_set_node_key(lower, key, slot);
1626
	btrfs_set_node_blockptr(lower, slot, bytenr);
1627 1628
	WARN_ON(trans->transid == 0);
	btrfs_set_node_ptr_generation(lower, slot, trans->transid);
1629 1630
	btrfs_set_header_nritems(lower, nritems + 1);
	btrfs_mark_buffer_dirty(lower);
C
Chris Mason 已提交
1631 1632 1633
	return 0;
}

C
Chris Mason 已提交
1634 1635 1636 1637 1638 1639
/*
 * 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 已提交
1640 1641
 *
 * returns 0 on success and < 0 on failure
C
Chris Mason 已提交
1642
 */
1643 1644
static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_path *path, int level)
1645
{
1646
	u64 root_gen;
1647 1648 1649
	struct extent_buffer *c;
	struct extent_buffer *split;
	struct btrfs_disk_key disk_key;
1650
	int mid;
C
Chris Mason 已提交
1651
	int ret;
C
Chris Mason 已提交
1652
	int wret;
1653
	u32 c_nritems;
1654

1655
	c = path->nodes[level];
1656
	WARN_ON(btrfs_header_generation(c) != trans->transid);
1657
	if (c == root->node) {
C
Chris Mason 已提交
1658
		/* trying to split the root, lets make a new one */
1659
		ret = insert_new_root(trans, root, path, level + 1);
C
Chris Mason 已提交
1660 1661
		if (ret)
			return ret;
1662 1663
	} else {
		ret = push_nodes_for_insert(trans, root, path, level);
1664 1665
		c = path->nodes[level];
		if (!ret && btrfs_header_nritems(c) <
1666
		    BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
1667
			return 0;
1668 1669
		if (ret < 0)
			return ret;
1670
	}
1671

1672
	c_nritems = btrfs_header_nritems(c);
1673 1674 1675 1676 1677 1678
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

	btrfs_node_key(c, &disk_key, 0);
1679
	split = btrfs_alloc_free_block(trans, root, root->nodesize,
1680 1681 1682 1683
					 root->root_key.objectid,
					 root_gen,
					 btrfs_disk_key_objectid(&disk_key),
					 level, c->start, 0);
1684 1685 1686 1687 1688
	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));
1689
	btrfs_set_header_bytenr(split, split->start);
1690 1691
	btrfs_set_header_generation(split, trans->transid);
	btrfs_set_header_owner(split, root->root_key.objectid);
1692
	btrfs_set_header_flags(split, 0);
1693 1694 1695
	write_extent_buffer(split, root->fs_info->fsid,
			    (unsigned long)btrfs_header_fsid(split),
			    BTRFS_FSID_SIZE);
1696 1697 1698
	write_extent_buffer(split, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(split),
			    BTRFS_UUID_SIZE);
1699

1700
	mid = (c_nritems + 1) / 2;
1701 1702 1703 1704 1705 1706 1707

	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 已提交
1708 1709
	ret = 0;

1710 1711 1712 1713
	btrfs_mark_buffer_dirty(c);
	btrfs_mark_buffer_dirty(split);

	btrfs_node_key(split, &disk_key, 0);
1714
	wret = insert_ptr(trans, root, path, &disk_key, split->start,
1715
			  path->slots[level + 1] + 1,
C
Chris Mason 已提交
1716
			  level + 1);
C
Chris Mason 已提交
1717 1718 1719
	if (wret)
		ret = wret;

C
Chris Mason 已提交
1720
	if (path->slots[level] >= mid) {
C
Chris Mason 已提交
1721
		path->slots[level] -= mid;
1722
		btrfs_tree_unlock(c);
1723 1724
		free_extent_buffer(c);
		path->nodes[level] = split;
C
Chris Mason 已提交
1725 1726
		path->slots[level + 1] += 1;
	} else {
1727
		btrfs_tree_unlock(split);
1728
		free_extent_buffer(split);
1729
	}
C
Chris Mason 已提交
1730
	return ret;
1731 1732
}

C
Chris Mason 已提交
1733 1734 1735 1736 1737
/*
 * 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
 */
1738
static int leaf_space_used(struct extent_buffer *l, int start, int nr)
1739 1740
{
	int data_len;
1741
	int nritems = btrfs_header_nritems(l);
1742
	int end = min(nritems, start + nr) - 1;
1743 1744 1745

	if (!nr)
		return 0;
1746 1747
	data_len = btrfs_item_end_nr(l, start);
	data_len = data_len - btrfs_item_offset_nr(l, end);
C
Chris Mason 已提交
1748
	data_len += sizeof(struct btrfs_item) * nr;
1749
	WARN_ON(data_len < 0);
1750 1751 1752
	return data_len;
}

1753 1754 1755 1756 1757
/*
 * 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
 */
1758
int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf)
1759
{
1760 1761 1762 1763 1764
	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 已提交
1765
		       ret, (unsigned long) BTRFS_LEAF_DATA_SIZE(root),
1766 1767 1768
		       leaf_space_used(leaf, 0, nritems), nritems);
	}
	return ret;
1769 1770
}

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

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

1807
	right = read_node_slot(root, upper, slot + 1);
1808
	btrfs_tree_lock(right);
C
Chris Mason 已提交
1809
	free_space = btrfs_leaf_free_space(root, right);
1810 1811
	if (free_space < data_size + sizeof(struct btrfs_item))
		goto out_unlock;
1812

C
Chris Mason 已提交
1813
	/* cow and double check */
1814 1815
	ret = btrfs_cow_block(trans, root, right, upper,
			      slot + 1, &right);
1816 1817 1818
	if (ret)
		goto out_unlock;

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

1823
	left_nritems = btrfs_header_nritems(left);
1824 1825
	if (left_nritems == 0)
		goto out_unlock;
1826

1827 1828 1829 1830 1831 1832 1833
	if (empty)
		nr = 0;
	else
		nr = 1;

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

C
Chris Mason 已提交
1836 1837
		if (path->slots[0] == i)
			push_space += data_size + sizeof(*item);
1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848

		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 已提交
1849 1850
			break;
		push_items++;
1851
		push_space += this_item_size + sizeof(*item);
1852 1853 1854
		if (i == 0)
			break;
		i--;
1855 1856 1857 1858
	}
	if (left->map_token) {
		unmap_extent_buffer(left, left->map_token, KM_USER1);
		left->map_token = NULL;
C
Chris Mason 已提交
1859
	}
1860

1861 1862
	if (push_items == 0)
		goto out_unlock;
1863

1864
	if (!empty && push_items == left_nritems)
1865
		WARN_ON(1);
1866

C
Chris Mason 已提交
1867
	/* push left to right */
1868
	right_nritems = btrfs_header_nritems(right);
1869

1870
	push_space = btrfs_item_end_nr(left, left_nritems - push_items);
C
Chris Mason 已提交
1871
	push_space -= leaf_data_end(root, left);
1872

C
Chris Mason 已提交
1873
	/* make room in the right data area */
1874 1875 1876 1877 1878 1879
	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 已提交
1880
	/* copy from the left data area */
1881
	copy_extent_buffer(right, left, btrfs_leaf_data(right) +
C
Chris Mason 已提交
1882 1883 1884
		     BTRFS_LEAF_DATA_SIZE(root) - push_space,
		     btrfs_leaf_data(left) + leaf_data_end(root, left),
		     push_space);
1885 1886 1887 1888 1889

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

C
Chris Mason 已提交
1890
	/* copy the items from left to right */
1891 1892 1893
	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 已提交
1894 1895

	/* update the item pointers */
1896
	right_nritems += push_items;
1897
	btrfs_set_header_nritems(right, right_nritems);
C
Chris Mason 已提交
1898
	push_space = BTRFS_LEAF_DATA_SIZE(root);
1899
	for (i = 0; i < right_nritems; i++) {
1900
		item = btrfs_item_nr(right, i);
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914
		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 已提交
1915
	}
1916
	left_nritems -= push_items;
1917
	btrfs_set_header_nritems(left, left_nritems);
C
Chris Mason 已提交
1918

1919 1920
	if (left_nritems)
		btrfs_mark_buffer_dirty(left);
1921
	btrfs_mark_buffer_dirty(right);
1922

1923 1924
	btrfs_item_key(right, &disk_key, 0);
	btrfs_set_node_key(upper, &disk_key, slot + 1);
C
Chris Mason 已提交
1925
	btrfs_mark_buffer_dirty(upper);
C
Chris Mason 已提交
1926

C
Chris Mason 已提交
1927
	/* then fixup the leaf pointer in the path */
1928 1929
	if (path->slots[0] >= left_nritems) {
		path->slots[0] -= left_nritems;
1930 1931 1932
		if (btrfs_header_nritems(path->nodes[0]) == 0)
			clean_tree_block(trans, root, path->nodes[0]);
		btrfs_tree_unlock(path->nodes[0]);
1933 1934
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = right;
C
Chris Mason 已提交
1935 1936
		path->slots[1] += 1;
	} else {
1937
		btrfs_tree_unlock(right);
1938
		free_extent_buffer(right);
C
Chris Mason 已提交
1939 1940
	}
	return 0;
1941 1942 1943 1944 1945

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

C
Chris Mason 已提交
1948 1949 1950 1951
/*
 * 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
 */
1952
static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
1953 1954
			  *root, struct btrfs_path *path, int data_size,
			  int empty)
1955
{
1956 1957 1958
	struct btrfs_disk_key disk_key;
	struct extent_buffer *right = path->nodes[0];
	struct extent_buffer *left;
1959 1960 1961 1962 1963
	int slot;
	int i;
	int free_space;
	int push_space = 0;
	int push_items = 0;
C
Chris Mason 已提交
1964
	struct btrfs_item *item;
1965
	u32 old_left_nritems;
1966
	u32 right_nritems;
1967
	u32 nr;
C
Chris Mason 已提交
1968 1969
	int ret = 0;
	int wret;
1970 1971
	u32 this_item_size;
	u32 old_left_item_size;
1972 1973

	slot = path->slots[1];
1974
	if (slot == 0)
1975
		return 1;
1976
	if (!path->nodes[1])
1977
		return 1;
1978

1979 1980 1981 1982 1983
	right_nritems = btrfs_header_nritems(right);
	if (right_nritems == 0) {
		return 1;
	}

1984
	left = read_node_slot(root, path->nodes[1], slot - 1);
1985
	btrfs_tree_lock(left);
C
Chris Mason 已提交
1986
	free_space = btrfs_leaf_free_space(root, left);
C
Chris Mason 已提交
1987
	if (free_space < data_size + sizeof(struct btrfs_item)) {
1988 1989
		ret = 1;
		goto out;
1990
	}
C
Chris Mason 已提交
1991 1992

	/* cow and double check */
1993 1994
	ret = btrfs_cow_block(trans, root, left,
			      path->nodes[1], slot - 1, &left);
1995 1996
	if (ret) {
		/* we hit -ENOSPC, but it isn't fatal here */
1997 1998
		ret = 1;
		goto out;
1999
	}
2000

C
Chris Mason 已提交
2001
	free_space = btrfs_leaf_free_space(root, left);
C
Chris Mason 已提交
2002
	if (free_space < data_size + sizeof(struct btrfs_item)) {
2003 2004
		ret = 1;
		goto out;
C
Chris Mason 已提交
2005 2006
	}

2007 2008 2009 2010 2011 2012
	if (empty)
		nr = right_nritems;
	else
		nr = right_nritems - 1;

	for (i = 0; i < nr; i++) {
2013
		item = btrfs_item_nr(right, i);
2014 2015 2016 2017 2018 2019 2020 2021
		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);
		}

2022 2023
		if (path->slots[0] == i)
			push_space += data_size + sizeof(*item);
2024 2025 2026

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

2029
		push_items++;
2030 2031 2032 2033 2034 2035
		push_space += this_item_size + sizeof(*item);
	}

	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
2036
	}
2037

2038
	if (push_items == 0) {
2039 2040
		ret = 1;
		goto out;
2041
	}
2042
	if (!empty && push_items == btrfs_header_nritems(right))
2043
		WARN_ON(1);
2044

2045
	/* push data from right to left */
2046 2047 2048 2049 2050
	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 已提交
2051
	push_space = BTRFS_LEAF_DATA_SIZE(root) -
2052 2053 2054
		     btrfs_item_offset_nr(right, push_items -1);

	copy_extent_buffer(left, right, btrfs_leaf_data(left) +
C
Chris Mason 已提交
2055 2056
		     leaf_data_end(root, left) - push_space,
		     btrfs_leaf_data(right) +
2057
		     btrfs_item_offset_nr(right, push_items - 1),
C
Chris Mason 已提交
2058
		     push_space);
2059
	old_left_nritems = btrfs_header_nritems(left);
2060 2061
	BUG_ON(old_left_nritems < 0);

2062
	old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1);
C
Chris Mason 已提交
2063
	for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
2064
		u32 ioff;
2065

2066
		item = btrfs_item_nr(left, i);
2067 2068 2069 2070 2071 2072 2073 2074
		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);
		}

2075 2076
		ioff = btrfs_item_offset(left, item);
		btrfs_set_item_offset(left, item,
2077
		      ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size));
2078
	}
2079
	btrfs_set_header_nritems(left, old_left_nritems + push_items);
2080 2081 2082 2083
	if (left->map_token) {
		unmap_extent_buffer(left, left->map_token, KM_USER1);
		left->map_token = NULL;
	}
2084 2085

	/* fixup right node */
2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099
	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),
2100 2101 2102
			      btrfs_item_nr_offset(push_items),
			     (btrfs_header_nritems(right) - push_items) *
			     sizeof(struct btrfs_item));
2103
	}
2104 2105
	right_nritems -= push_items;
	btrfs_set_header_nritems(right, right_nritems);
C
Chris Mason 已提交
2106
	push_space = BTRFS_LEAF_DATA_SIZE(root);
2107 2108
	for (i = 0; i < right_nritems; i++) {
		item = btrfs_item_nr(right, i);
2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123

		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;
2124
	}
2125

2126
	btrfs_mark_buffer_dirty(left);
2127 2128
	if (right_nritems)
		btrfs_mark_buffer_dirty(right);
2129

2130 2131
	btrfs_item_key(right, &disk_key, 0);
	wret = fixup_low_keys(trans, root, path, &disk_key, 1);
C
Chris Mason 已提交
2132 2133
	if (wret)
		ret = wret;
2134 2135 2136 2137

	/* then fixup the leaf pointer in the path */
	if (path->slots[0] < push_items) {
		path->slots[0] += old_left_nritems;
2138 2139 2140
		if (btrfs_header_nritems(path->nodes[0]) == 0)
			clean_tree_block(trans, root, path->nodes[0]);
		btrfs_tree_unlock(path->nodes[0]);
2141 2142
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = left;
2143 2144
		path->slots[1] -= 1;
	} else {
2145
		btrfs_tree_unlock(left);
2146
		free_extent_buffer(left);
2147 2148
		path->slots[0] -= push_items;
	}
2149
	BUG_ON(path->slots[0] < 0);
C
Chris Mason 已提交
2150
	return ret;
2151 2152 2153 2154
out:
	btrfs_tree_unlock(left);
	free_extent_buffer(left);
	return ret;
2155 2156
}

C
Chris Mason 已提交
2157 2158 2159
/*
 * 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 已提交
2160 2161
 *
 * returns 0 if all went well and < 0 on failure.
C
Chris Mason 已提交
2162
 */
2163
static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
2164
		      *root, struct btrfs_key *ins_key,
2165
		      struct btrfs_path *path, int data_size, int extend)
2166
{
2167
	u64 root_gen;
2168
	struct extent_buffer *l;
2169
	u32 nritems;
2170 2171
	int mid;
	int slot;
2172
	struct extent_buffer *right;
C
Chris Mason 已提交
2173
	int space_needed = data_size + sizeof(struct btrfs_item);
2174 2175 2176
	int data_copy_size;
	int rt_data_off;
	int i;
2177
	int ret = 0;
C
Chris Mason 已提交
2178
	int wret;
2179 2180
	int double_split;
	int num_doubles = 0;
2181
	struct btrfs_disk_key disk_key;
C
Chris Mason 已提交
2182

2183 2184 2185
	if (extend)
		space_needed = data_size;

2186 2187 2188 2189 2190
	if (root->ref_cows)
		root_gen = trans->transid;
	else
		root_gen = 0;

C
Chris Mason 已提交
2191
	/* first try to make some room by pushing left and right */
2192
	if (ins_key->type != BTRFS_DIR_ITEM_KEY) {
2193
		wret = push_leaf_right(trans, root, path, data_size, 0);
2194
		if (wret < 0) {
C
Chris Mason 已提交
2195
			return wret;
2196 2197
		}
		if (wret) {
2198
			wret = push_leaf_left(trans, root, path, data_size, 0);
2199 2200 2201 2202
			if (wret < 0)
				return wret;
		}
		l = path->nodes[0];
C
Chris Mason 已提交
2203

2204
		/* did the pushes work? */
2205
		if (btrfs_leaf_free_space(root, l) >= space_needed)
2206
			return 0;
2207
	}
C
Chris Mason 已提交
2208

C
Chris Mason 已提交
2209
	if (!path->nodes[1]) {
2210
		ret = insert_new_root(trans, root, path, 1);
C
Chris Mason 已提交
2211 2212 2213
		if (ret)
			return ret;
	}
2214 2215 2216
again:
	double_split = 0;
	l = path->nodes[0];
2217
	slot = path->slots[0];
2218
	nritems = btrfs_header_nritems(l);
2219
	mid = (nritems + 1)/ 2;
2220

2221 2222
	btrfs_item_key(l, &disk_key, 0);

2223
	right = btrfs_alloc_free_block(trans, root, root->leafsize,
2224 2225 2226
					 root->root_key.objectid,
					 root_gen, disk_key.objectid, 0,
					 l->start, 0);
2227 2228
	if (IS_ERR(right)) {
		BUG_ON(1);
2229
		return PTR_ERR(right);
2230
	}
2231 2232

	memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
2233
	btrfs_set_header_bytenr(right, right->start);
2234 2235 2236 2237 2238 2239
	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);
2240 2241 2242 2243

	write_extent_buffer(right, root->fs_info->chunk_tree_uuid,
			    (unsigned long)btrfs_header_chunk_tree_uuid(right),
			    BTRFS_UUID_SIZE);
2244 2245 2246 2247 2248 2249
	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);
2250
				btrfs_set_header_nritems(right, 0);
2251
				wret = insert_ptr(trans, root, path,
2252
						  &disk_key, right->start,
2253 2254 2255
						  path->slots[1] + 1, 1);
				if (wret)
					ret = wret;
2256 2257

				btrfs_tree_unlock(path->nodes[0]);
2258 2259
				free_extent_buffer(path->nodes[0]);
				path->nodes[0] = right;
2260 2261
				path->slots[0] = 0;
				path->slots[1] += 1;
2262
				btrfs_mark_buffer_dirty(right);
2263 2264 2265
				return ret;
			}
			mid = slot;
2266 2267 2268 2269 2270
			if (mid != nritems &&
			    leaf_space_used(l, mid, nritems - mid) +
			    space_needed > BTRFS_LEAF_DATA_SIZE(root)) {
				double_split = 1;
			}
2271 2272 2273 2274
		}
	} else {
		if (leaf_space_used(l, 0, mid + 1) + space_needed >
			BTRFS_LEAF_DATA_SIZE(root)) {
2275
			if (!extend && slot == 0) {
2276
				btrfs_cpu_key_to_disk(&disk_key, ins_key);
2277
				btrfs_set_header_nritems(right, 0);
2278 2279
				wret = insert_ptr(trans, root, path,
						  &disk_key,
2280
						  right->start,
2281
						  path->slots[1], 1);
2282 2283
				if (wret)
					ret = wret;
2284
				btrfs_tree_unlock(path->nodes[0]);
2285 2286
				free_extent_buffer(path->nodes[0]);
				path->nodes[0] = right;
2287
				path->slots[0] = 0;
2288 2289 2290 2291 2292 2293
				if (path->slots[1] == 0) {
					wret = fixup_low_keys(trans, root,
					           path, &disk_key, 1);
					if (wret)
						ret = wret;
				}
2294
				btrfs_mark_buffer_dirty(right);
2295
				return ret;
2296 2297 2298 2299 2300 2301 2302 2303 2304
			} 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;
				}
2305
			}
2306 2307
		}
	}
2308 2309 2310 2311 2312 2313 2314 2315 2316
	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 已提交
2317 2318 2319
		     btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
		     data_copy_size, btrfs_leaf_data(l) +
		     leaf_data_end(root, l), data_copy_size);
2320

C
Chris Mason 已提交
2321
	rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
2322
		      btrfs_item_end_nr(l, mid);
C
Chris Mason 已提交
2323

2324 2325
	for (i = 0; i < nritems; i++) {
		struct btrfs_item *item = btrfs_item_nr(right, i);
2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336
		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);
2337
		btrfs_set_item_offset(right, item, ioff + rt_data_off);
C
Chris Mason 已提交
2338
	}
C
Chris Mason 已提交
2339

2340 2341 2342 2343 2344
	if (right->map_token) {
		unmap_extent_buffer(right, right->map_token, KM_USER1);
		right->map_token = NULL;
	}

2345
	btrfs_set_header_nritems(l, mid);
C
Chris Mason 已提交
2346
	ret = 0;
2347
	btrfs_item_key(right, &disk_key, 0);
2348 2349
	wret = insert_ptr(trans, root, path, &disk_key, right->start,
			  path->slots[1] + 1, 1);
C
Chris Mason 已提交
2350 2351
	if (wret)
		ret = wret;
2352 2353 2354

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

2357
	if (mid <= slot) {
2358
		btrfs_tree_unlock(path->nodes[0]);
2359 2360
		free_extent_buffer(path->nodes[0]);
		path->nodes[0] = right;
2361 2362
		path->slots[0] -= mid;
		path->slots[1] += 1;
2363 2364
	} else {
		btrfs_tree_unlock(right);
2365
		free_extent_buffer(right);
2366
	}
2367

2368
	BUG_ON(path->slots[0] < 0);
2369

2370 2371 2372 2373
	if (double_split) {
		BUG_ON(num_doubles != 0);
		num_doubles++;
		goto again;
2374
	}
2375 2376 2377
	return ret;
}

C
Chris Mason 已提交
2378 2379 2380
int btrfs_truncate_item(struct btrfs_trans_handle *trans,
			struct btrfs_root *root,
			struct btrfs_path *path,
2381
			u32 new_size, int from_end)
C
Chris Mason 已提交
2382 2383 2384 2385
{
	int ret = 0;
	int slot;
	int slot_orig;
2386 2387
	struct extent_buffer *leaf;
	struct btrfs_item *item;
C
Chris Mason 已提交
2388 2389 2390 2391 2392 2393 2394 2395
	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];
2396
	leaf = path->nodes[0];
2397 2398 2399 2400 2401
	slot = path->slots[0];

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

2403
	nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
2404 2405
	data_end = leaf_data_end(root, leaf);

2406
	old_data_start = btrfs_item_offset_nr(leaf, slot);
2407

C
Chris Mason 已提交
2408 2409 2410 2411 2412 2413 2414 2415 2416 2417
	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++) {
2418 2419
		u32 ioff;
		item = btrfs_item_nr(leaf, i);
2420 2421 2422 2423 2424 2425 2426 2427 2428

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

2429 2430
		ioff = btrfs_item_offset(leaf, item);
		btrfs_set_item_offset(leaf, item, ioff + size_diff);
C
Chris Mason 已提交
2431
	}
2432 2433 2434 2435 2436 2437

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

C
Chris Mason 已提交
2438
	/* shift the data */
2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 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
	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);
	}
2478 2479 2480 2481

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

	ret = 0;
2484 2485
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
C
Chris Mason 已提交
2486
		BUG();
2487
	}
C
Chris Mason 已提交
2488 2489 2490
	return ret;
}

2491 2492 2493
int btrfs_extend_item(struct btrfs_trans_handle *trans,
		      struct btrfs_root *root, struct btrfs_path *path,
		      u32 data_size)
2494 2495 2496 2497
{
	int ret = 0;
	int slot;
	int slot_orig;
2498 2499
	struct extent_buffer *leaf;
	struct btrfs_item *item;
2500 2501 2502 2503 2504 2505 2506
	u32 nritems;
	unsigned int data_end;
	unsigned int old_data;
	unsigned int old_size;
	int i;

	slot_orig = path->slots[0];
2507
	leaf = path->nodes[0];
2508

2509
	nritems = btrfs_header_nritems(leaf);
2510 2511
	data_end = leaf_data_end(root, leaf);

2512 2513
	if (btrfs_leaf_free_space(root, leaf) < data_size) {
		btrfs_print_leaf(root, leaf);
2514
		BUG();
2515
	}
2516
	slot = path->slots[0];
2517
	old_data = btrfs_item_end_nr(leaf, slot);
2518 2519

	BUG_ON(slot < 0);
2520 2521 2522 2523 2524
	if (slot >= nritems) {
		btrfs_print_leaf(root, leaf);
		printk("slot %d too large, nritems %d\n", slot, nritems);
		BUG_ON(1);
	}
2525 2526 2527 2528 2529 2530

	/*
	 * item0..itemN ... dataN.offset..dataN.size .. data0.size
	 */
	/* first correct the data pointers */
	for (i = slot; i < nritems; i++) {
2531 2532
		u32 ioff;
		item = btrfs_item_nr(leaf, i);
2533 2534 2535 2536 2537 2538 2539 2540

		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);
		}
2541 2542
		ioff = btrfs_item_offset(leaf, item);
		btrfs_set_item_offset(leaf, item, ioff - data_size);
2543
	}
2544

2545 2546 2547 2548 2549
	if (leaf->map_token) {
		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
		leaf->map_token = NULL;
	}

2550
	/* shift the data */
2551
	memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
2552 2553
		      data_end - data_size, btrfs_leaf_data(leaf) +
		      data_end, old_data - data_end);
2554

2555
	data_end = old_data;
2556 2557 2558 2559
	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);
2560 2561

	ret = 0;
2562 2563
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
2564
		BUG();
2565
	}
2566 2567 2568
	return ret;
}

C
Chris Mason 已提交
2569 2570 2571 2572
/*
 * 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.
 */
2573
int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
2574 2575
			    struct btrfs_root *root,
			    struct btrfs_path *path,
2576 2577
			    struct btrfs_key *cpu_key, u32 *data_size,
			    int nr)
2578
{
2579 2580
	struct extent_buffer *leaf;
	struct btrfs_item *item;
C
Chris Mason 已提交
2581
	int ret = 0;
2582
	int slot;
2583
	int slot_orig;
2584
	int i;
2585
	u32 nritems;
2586 2587
	u32 total_size = 0;
	u32 total_data = 0;
2588
	unsigned int data_end;
C
Chris Mason 已提交
2589 2590
	struct btrfs_disk_key disk_key;

2591 2592 2593
	for (i = 0; i < nr; i++) {
		total_data += data_size[i];
	}
2594

2595 2596
	total_size = total_data + (nr - 1) * sizeof(struct btrfs_item);
	ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1);
2597
	if (ret == 0) {
2598
		return -EEXIST;
C
Chris Mason 已提交
2599
	}
2600 2601
	if (ret < 0)
		goto out;
2602

2603
	slot_orig = path->slots[0];
2604
	leaf = path->nodes[0];
C
Chris Mason 已提交
2605

2606
	nritems = btrfs_header_nritems(leaf);
C
Chris Mason 已提交
2607
	data_end = leaf_data_end(root, leaf);
2608

C
Chris Mason 已提交
2609
	if (btrfs_leaf_free_space(root, leaf) <
2610
	    sizeof(struct btrfs_item) + total_size) {
2611 2612
		btrfs_print_leaf(root, leaf);
		printk("not enough freespace need %u have %d\n",
2613
		       total_size, btrfs_leaf_free_space(root, leaf));
2614
		BUG();
2615
	}
2616

2617
	slot = path->slots[0];
2618
	BUG_ON(slot < 0);
2619

2620 2621
	if (slot != nritems) {
		int i;
2622
		unsigned int old_data = btrfs_item_end_nr(leaf, slot);
2623

2624 2625 2626 2627 2628 2629
		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);
		}
2630 2631 2632 2633
		/*
		 * item0..itemN ... dataN.offset..dataN.size .. data0.size
		 */
		/* first correct the data pointers */
2634
		WARN_ON(leaf->map_token);
C
Chris Mason 已提交
2635
		for (i = slot; i < nritems; i++) {
2636
			u32 ioff;
2637

2638
			item = btrfs_item_nr(leaf, i);
2639 2640 2641 2642 2643 2644 2645 2646
			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);
			}

2647
			ioff = btrfs_item_offset(leaf, item);
2648
			btrfs_set_item_offset(leaf, item, ioff - total_data);
C
Chris Mason 已提交
2649
		}
2650 2651 2652 2653
		if (leaf->map_token) {
			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
			leaf->map_token = NULL;
		}
2654 2655

		/* shift the items */
2656
		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr),
2657
			      btrfs_item_nr_offset(slot),
C
Chris Mason 已提交
2658
			      (nritems - slot) * sizeof(struct btrfs_item));
2659 2660

		/* shift the data */
2661
		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
2662
			      data_end - total_data, btrfs_leaf_data(leaf) +
C
Chris Mason 已提交
2663
			      data_end, old_data - data_end);
2664 2665
		data_end = old_data;
	}
2666

2667
	/* setup the item for the new data */
2668 2669 2670 2671 2672 2673 2674 2675 2676
	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);
2677
	btrfs_mark_buffer_dirty(leaf);
C
Chris Mason 已提交
2678 2679

	ret = 0;
2680 2681
	if (slot == 0) {
		btrfs_cpu_key_to_disk(&disk_key, cpu_key);
2682
		ret = fixup_low_keys(trans, root, path, &disk_key, 1);
2683
	}
C
Chris Mason 已提交
2684

2685 2686
	if (btrfs_leaf_free_space(root, leaf) < 0) {
		btrfs_print_leaf(root, leaf);
2687
		BUG();
2688
	}
2689
out:
2690 2691 2692 2693 2694 2695 2696
	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.
 */
2697 2698 2699
int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
		      *root, struct btrfs_key *cpu_key, void *data, u32
		      data_size)
2700 2701
{
	int ret = 0;
C
Chris Mason 已提交
2702
	struct btrfs_path *path;
2703 2704
	struct extent_buffer *leaf;
	unsigned long ptr;
2705

C
Chris Mason 已提交
2706 2707 2708
	path = btrfs_alloc_path();
	BUG_ON(!path);
	ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
2709
	if (!ret) {
2710 2711 2712 2713
		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);
2714
	}
C
Chris Mason 已提交
2715
	btrfs_free_path(path);
C
Chris Mason 已提交
2716
	return ret;
2717 2718
}

C
Chris Mason 已提交
2719
/*
C
Chris Mason 已提交
2720
 * delete the pointer from a given node.
C
Chris Mason 已提交
2721 2722 2723 2724 2725
 *
 * 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.
 */
2726 2727
static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		   struct btrfs_path *path, int level, int slot)
2728
{
2729
	struct extent_buffer *parent = path->nodes[level];
2730
	u32 nritems;
C
Chris Mason 已提交
2731
	int ret = 0;
2732
	int wret;
2733

2734
	nritems = btrfs_header_nritems(parent);
2735
	if (slot != nritems -1) {
2736 2737 2738
		memmove_extent_buffer(parent,
			      btrfs_node_key_ptr_offset(slot),
			      btrfs_node_key_ptr_offset(slot + 1),
C
Chris Mason 已提交
2739 2740
			      sizeof(struct btrfs_key_ptr) *
			      (nritems - slot - 1));
2741
	}
2742
	nritems--;
2743
	btrfs_set_header_nritems(parent, nritems);
2744
	if (nritems == 0 && parent == root->node) {
2745
		BUG_ON(btrfs_header_level(root->node) != 1);
2746
		/* just turn the root into a leaf and break */
2747
		btrfs_set_header_level(root->node, 0);
2748
	} else if (slot == 0) {
2749 2750 2751 2752
		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 已提交
2753 2754
		if (wret)
			ret = wret;
2755
	}
C
Chris Mason 已提交
2756
	btrfs_mark_buffer_dirty(parent);
C
Chris Mason 已提交
2757
	return ret;
2758 2759
}

C
Chris Mason 已提交
2760 2761 2762 2763
/*
 * delete the item at the leaf level in path.  If that empties
 * the leaf, remove it from the tree
 */
2764 2765
int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
		    struct btrfs_path *path, int slot, int nr)
2766
{
2767 2768
	struct extent_buffer *leaf;
	struct btrfs_item *item;
2769 2770
	int last_off;
	int dsize = 0;
C
Chris Mason 已提交
2771 2772
	int ret = 0;
	int wret;
2773
	int i;
2774
	u32 nritems;
2775

2776
	leaf = path->nodes[0];
2777 2778 2779 2780 2781
	last_off = btrfs_item_offset_nr(leaf, slot + nr - 1);

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

2782
	nritems = btrfs_header_nritems(leaf);
2783

2784
	if (slot + nr != nritems) {
2785
		int i;
C
Chris Mason 已提交
2786
		int data_end = leaf_data_end(root, leaf);
2787 2788

		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
C
Chris Mason 已提交
2789 2790
			      data_end + dsize,
			      btrfs_leaf_data(leaf) + data_end,
2791
			      last_off - data_end);
2792

2793
		for (i = slot + nr; i < nritems; i++) {
2794
			u32 ioff;
2795

2796
			item = btrfs_item_nr(leaf, i);
2797 2798 2799 2800 2801 2802 2803
			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);
			}
2804 2805
			ioff = btrfs_item_offset(leaf, item);
			btrfs_set_item_offset(leaf, item, ioff + dsize);
C
Chris Mason 已提交
2806
		}
2807 2808 2809 2810 2811 2812

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

2813
		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
2814
			      btrfs_item_nr_offset(slot + nr),
C
Chris Mason 已提交
2815
			      sizeof(struct btrfs_item) *
2816
			      (nritems - slot - nr));
2817
	}
2818 2819
	btrfs_set_header_nritems(leaf, nritems - nr);
	nritems -= nr;
2820

C
Chris Mason 已提交
2821
	/* delete the leaf if we've emptied it */
2822
	if (nritems == 0) {
2823 2824
		if (leaf == root->node) {
			btrfs_set_header_level(leaf, 0);
2825
		} else {
2826
			u64 root_gen = btrfs_header_generation(path->nodes[1]);
2827
			wret = del_ptr(trans, root, path, 1, path->slots[1]);
C
Chris Mason 已提交
2828 2829
			if (wret)
				ret = wret;
2830
			wret = btrfs_free_extent(trans, root,
2831 2832 2833
					 leaf->start, leaf->len,
					 btrfs_header_owner(path->nodes[1]),
					 root_gen, 0, 0, 1);
C
Chris Mason 已提交
2834 2835
			if (wret)
				ret = wret;
2836
		}
2837
	} else {
2838
		int used = leaf_space_used(leaf, 0, nritems);
C
Chris Mason 已提交
2839
		if (slot == 0) {
2840 2841 2842
			struct btrfs_disk_key disk_key;

			btrfs_item_key(leaf, &disk_key, 0);
2843
			wret = fixup_low_keys(trans, root, path,
2844
					      &disk_key, 1);
C
Chris Mason 已提交
2845 2846 2847 2848
			if (wret)
				ret = wret;
		}

C
Chris Mason 已提交
2849
		/* delete the leaf if it is mostly empty */
2850
		if (used < BTRFS_LEAF_DATA_SIZE(root) / 4) {
2851 2852 2853 2854
			/* push_leaf_left fixes the path.
			 * make sure the path still points to our leaf
			 * for possible call to del_ptr below
			 */
2855
			slot = path->slots[1];
2856 2857
			extent_buffer_get(leaf);

2858
			wret = push_leaf_left(trans, root, path, 1, 1);
2859
			if (wret < 0 && wret != -ENOSPC)
C
Chris Mason 已提交
2860
				ret = wret;
2861 2862 2863

			if (path->nodes[0] == leaf &&
			    btrfs_header_nritems(leaf)) {
2864
				wret = push_leaf_right(trans, root, path, 1, 1);
2865
				if (wret < 0 && wret != -ENOSPC)
C
Chris Mason 已提交
2866 2867
					ret = wret;
			}
2868 2869

			if (btrfs_header_nritems(leaf) == 0) {
2870
				u64 root_gen;
2871 2872
				u64 bytenr = leaf->start;
				u32 blocksize = leaf->len;
2873

2874 2875 2876
				root_gen = btrfs_header_generation(
							   path->nodes[1]);

2877
				wret = del_ptr(trans, root, path, 1, slot);
C
Chris Mason 已提交
2878 2879
				if (wret)
					ret = wret;
2880 2881

				free_extent_buffer(leaf);
2882
				wret = btrfs_free_extent(trans, root, bytenr,
2883 2884 2885
					     blocksize,
					     btrfs_header_owner(path->nodes[1]),
					     root_gen, 0, 0, 1);
C
Chris Mason 已提交
2886 2887
				if (wret)
					ret = wret;
C
Chris Mason 已提交
2888
			} else {
2889 2890 2891 2892 2893 2894 2895
				/* 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);
2896
				free_extent_buffer(leaf);
2897
			}
2898
		} else {
2899
			btrfs_mark_buffer_dirty(leaf);
2900 2901
		}
	}
C
Chris Mason 已提交
2902
	return ret;
2903 2904
}

2905
/*
2906
 * search the tree again to find a leaf with lesser keys
2907 2908 2909 2910 2911
 * 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)
{
2912 2913 2914
	struct btrfs_key key;
	struct btrfs_disk_key found_key;
	int ret;
2915

2916
	btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
2917

2918 2919 2920 2921 2922 2923 2924 2925
	if (key.offset > 0)
		key.offset--;
	else if (key.type > 0)
		key.type--;
	else if (key.objectid > 0)
		key.objectid--;
	else
		return 1;
2926

2927 2928 2929 2930 2931 2932 2933 2934 2935
	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;
2936 2937
}

C
Chris Mason 已提交
2938
/*
2939
 * search the tree again to find a leaf with greater keys
C
Chris Mason 已提交
2940 2941
 * returns 0 if it found something or 1 if there are no greater leaves.
 * returns < 0 on io errors.
C
Chris Mason 已提交
2942
 */
C
Chris Mason 已提交
2943
int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
2944 2945 2946
{
	int slot;
	int level = 1;
2947 2948
	struct extent_buffer *c;
	struct extent_buffer *next = NULL;
2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970
	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);

	path->keep_locks = 1;
	btrfs_release_path(root, path);
	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
	path->keep_locks = 0;

	if (ret < 0)
		return ret;

	if (path->slots[0] < nritems - 1) {
		goto done;
	}
2971

C
Chris Mason 已提交
2972
	while(level < BTRFS_MAX_LEVEL) {
2973
		if (!path->nodes[level])
C
Chris Mason 已提交
2974
			return 1;
2975

2976 2977
		slot = path->slots[level] + 1;
		c = path->nodes[level];
2978
		if (slot >= btrfs_header_nritems(c)) {
2979
			level++;
2980
			if (level == BTRFS_MAX_LEVEL) {
2981
				return 1;
2982
			}
2983 2984
			continue;
		}
2985

2986 2987
		if (next) {
			btrfs_tree_unlock(next);
2988
			free_extent_buffer(next);
2989
		}
2990

2991
		if (level == 1 && path->locks[1] && path->reada)
2992
			reada_for_search(root, path, level, slot, 0);
2993

2994
		next = read_node_slot(root, c, slot);
2995 2996
		if (!path->skip_locking)
			btrfs_tree_lock(next);
2997 2998 2999 3000 3001 3002
		break;
	}
	path->slots[level] = slot;
	while(1) {
		level--;
		c = path->nodes[level];
3003 3004
		if (path->locks[level])
			btrfs_tree_unlock(c);
3005
		free_extent_buffer(c);
3006 3007
		path->nodes[level] = next;
		path->slots[level] = 0;
3008
		path->locks[level] = 1;
3009 3010
		if (!level)
			break;
3011 3012
		if (level == 1 && path->locks[1] && path->reada)
			reada_for_search(root, path, level, slot, 0);
3013
		next = read_node_slot(root, next, 0);
3014 3015
		if (!path->skip_locking)
			btrfs_tree_lock(next);
3016
	}
3017 3018
done:
	unlock_up(path, 0, 1);
3019 3020
	return 0;
}
3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045

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