1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/sched.h>
20#include <linux/slab.h>
21#include <linux/rbtree.h>
22#include <linux/mm.h>
23#include "ctree.h"
24#include "disk-io.h"
25#include "transaction.h"
26#include "print-tree.h"
27#include "locking.h"
28
29static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
30 *root, struct btrfs_path *path, int level);
31static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root *root,
32 const struct btrfs_key *ins_key, struct btrfs_path *path,
33 int data_size, int extend);
34static int push_node_left(struct btrfs_trans_handle *trans,
35 struct btrfs_fs_info *fs_info,
36 struct extent_buffer *dst,
37 struct extent_buffer *src, int empty);
38static int balance_node_right(struct btrfs_trans_handle *trans,
39 struct btrfs_fs_info *fs_info,
40 struct extent_buffer *dst_buf,
41 struct extent_buffer *src_buf);
42static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
43 int level, int slot);
44static int tree_mod_log_free_eb(struct btrfs_fs_info *fs_info,
45 struct extent_buffer *eb);
46
47struct btrfs_path *btrfs_alloc_path(void)
48{
49 return kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
50}
51
52
53
54
55
56noinline void btrfs_set_path_blocking(struct btrfs_path *p)
57{
58 int i;
59 for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
60 if (!p->nodes[i] || !p->locks[i])
61 continue;
62 btrfs_set_lock_blocking_rw(p->nodes[i], p->locks[i]);
63 if (p->locks[i] == BTRFS_READ_LOCK)
64 p->locks[i] = BTRFS_READ_LOCK_BLOCKING;
65 else if (p->locks[i] == BTRFS_WRITE_LOCK)
66 p->locks[i] = BTRFS_WRITE_LOCK_BLOCKING;
67 }
68}
69
70
71
72
73
74
75
76
77
78noinline void btrfs_clear_path_blocking(struct btrfs_path *p,
79 struct extent_buffer *held, int held_rw)
80{
81 int i;
82
83 if (held) {
84 btrfs_set_lock_blocking_rw(held, held_rw);
85 if (held_rw == BTRFS_WRITE_LOCK)
86 held_rw = BTRFS_WRITE_LOCK_BLOCKING;
87 else if (held_rw == BTRFS_READ_LOCK)
88 held_rw = BTRFS_READ_LOCK_BLOCKING;
89 }
90 btrfs_set_path_blocking(p);
91
92 for (i = BTRFS_MAX_LEVEL - 1; i >= 0; i--) {
93 if (p->nodes[i] && p->locks[i]) {
94 btrfs_clear_lock_blocking_rw(p->nodes[i], p->locks[i]);
95 if (p->locks[i] == BTRFS_WRITE_LOCK_BLOCKING)
96 p->locks[i] = BTRFS_WRITE_LOCK;
97 else if (p->locks[i] == BTRFS_READ_LOCK_BLOCKING)
98 p->locks[i] = BTRFS_READ_LOCK;
99 }
100 }
101
102 if (held)
103 btrfs_clear_lock_blocking_rw(held, held_rw);
104}
105
106
107void btrfs_free_path(struct btrfs_path *p)
108{
109 if (!p)
110 return;
111 btrfs_release_path(p);
112 kmem_cache_free(btrfs_path_cachep, p);
113}
114
115
116
117
118
119
120
121noinline void btrfs_release_path(struct btrfs_path *p)
122{
123 int i;
124
125 for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
126 p->slots[i] = 0;
127 if (!p->nodes[i])
128 continue;
129 if (p->locks[i]) {
130 btrfs_tree_unlock_rw(p->nodes[i], p->locks[i]);
131 p->locks[i] = 0;
132 }
133 free_extent_buffer(p->nodes[i]);
134 p->nodes[i] = NULL;
135 }
136}
137
138
139
140
141
142
143
144
145
146
147
148struct extent_buffer *btrfs_root_node(struct btrfs_root *root)
149{
150 struct extent_buffer *eb;
151
152 while (1) {
153 rcu_read_lock();
154 eb = rcu_dereference(root->node);
155
156
157
158
159
160
161
162 if (atomic_inc_not_zero(&eb->refs)) {
163 rcu_read_unlock();
164 break;
165 }
166 rcu_read_unlock();
167 synchronize_rcu();
168 }
169 return eb;
170}
171
172
173
174
175
176struct extent_buffer *btrfs_lock_root_node(struct btrfs_root *root)
177{
178 struct extent_buffer *eb;
179
180 while (1) {
181 eb = btrfs_root_node(root);
182 btrfs_tree_lock(eb);
183 if (eb == root->node)
184 break;
185 btrfs_tree_unlock(eb);
186 free_extent_buffer(eb);
187 }
188 return eb;
189}
190
191
192
193
194
195static struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root)
196{
197 struct extent_buffer *eb;
198
199 while (1) {
200 eb = btrfs_root_node(root);
201 btrfs_tree_read_lock(eb);
202 if (eb == root->node)
203 break;
204 btrfs_tree_read_unlock(eb);
205 free_extent_buffer(eb);
206 }
207 return eb;
208}
209
210
211
212
213
214static void add_root_to_dirty_list(struct btrfs_root *root)
215{
216 struct btrfs_fs_info *fs_info = root->fs_info;
217
218 if (test_bit(BTRFS_ROOT_DIRTY, &root->state) ||
219 !test_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state))
220 return;
221
222 spin_lock(&fs_info->trans_lock);
223 if (!test_and_set_bit(BTRFS_ROOT_DIRTY, &root->state)) {
224
225 if (root->objectid == BTRFS_EXTENT_TREE_OBJECTID)
226 list_move_tail(&root->dirty_list,
227 &fs_info->dirty_cowonly_roots);
228 else
229 list_move(&root->dirty_list,
230 &fs_info->dirty_cowonly_roots);
231 }
232 spin_unlock(&fs_info->trans_lock);
233}
234
235
236
237
238
239
240int btrfs_copy_root(struct btrfs_trans_handle *trans,
241 struct btrfs_root *root,
242 struct extent_buffer *buf,
243 struct extent_buffer **cow_ret, u64 new_root_objectid)
244{
245 struct btrfs_fs_info *fs_info = root->fs_info;
246 struct extent_buffer *cow;
247 int ret = 0;
248 int level;
249 struct btrfs_disk_key disk_key;
250
251 WARN_ON(test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
252 trans->transid != fs_info->running_transaction->transid);
253 WARN_ON(test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
254 trans->transid != root->last_trans);
255
256 level = btrfs_header_level(buf);
257 if (level == 0)
258 btrfs_item_key(buf, &disk_key, 0);
259 else
260 btrfs_node_key(buf, &disk_key, 0);
261
262 cow = btrfs_alloc_tree_block(trans, root, 0, new_root_objectid,
263 &disk_key, level, buf->start, 0);
264 if (IS_ERR(cow))
265 return PTR_ERR(cow);
266
267 copy_extent_buffer_full(cow, buf);
268 btrfs_set_header_bytenr(cow, cow->start);
269 btrfs_set_header_generation(cow, trans->transid);
270 btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
271 btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN |
272 BTRFS_HEADER_FLAG_RELOC);
273 if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
274 btrfs_set_header_flag(cow, BTRFS_HEADER_FLAG_RELOC);
275 else
276 btrfs_set_header_owner(cow, new_root_objectid);
277
278 write_extent_buffer_fsid(cow, fs_info->fsid);
279
280 WARN_ON(btrfs_header_generation(buf) > trans->transid);
281 if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
282 ret = btrfs_inc_ref(trans, root, cow, 1);
283 else
284 ret = btrfs_inc_ref(trans, root, cow, 0);
285
286 if (ret)
287 return ret;
288
289 btrfs_mark_buffer_dirty(cow);
290 *cow_ret = cow;
291 return 0;
292}
293
294enum mod_log_op {
295 MOD_LOG_KEY_REPLACE,
296 MOD_LOG_KEY_ADD,
297 MOD_LOG_KEY_REMOVE,
298 MOD_LOG_KEY_REMOVE_WHILE_FREEING,
299 MOD_LOG_KEY_REMOVE_WHILE_MOVING,
300 MOD_LOG_MOVE_KEYS,
301 MOD_LOG_ROOT_REPLACE,
302};
303
304struct tree_mod_move {
305 int dst_slot;
306 int nr_items;
307};
308
309struct tree_mod_root {
310 u64 logical;
311 u8 level;
312};
313
314struct tree_mod_elem {
315 struct rb_node node;
316 u64 logical;
317 u64 seq;
318 enum mod_log_op op;
319
320
321 int slot;
322
323
324 u64 generation;
325
326
327 struct btrfs_disk_key key;
328 u64 blockptr;
329
330
331 struct tree_mod_move move;
332
333
334 struct tree_mod_root old_root;
335};
336
337static inline void tree_mod_log_read_lock(struct btrfs_fs_info *fs_info)
338{
339 read_lock(&fs_info->tree_mod_log_lock);
340}
341
342static inline void tree_mod_log_read_unlock(struct btrfs_fs_info *fs_info)
343{
344 read_unlock(&fs_info->tree_mod_log_lock);
345}
346
347static inline void tree_mod_log_write_lock(struct btrfs_fs_info *fs_info)
348{
349 write_lock(&fs_info->tree_mod_log_lock);
350}
351
352static inline void tree_mod_log_write_unlock(struct btrfs_fs_info *fs_info)
353{
354 write_unlock(&fs_info->tree_mod_log_lock);
355}
356
357
358
359
360static inline u64 btrfs_inc_tree_mod_seq(struct btrfs_fs_info *fs_info)
361{
362 return atomic64_inc_return(&fs_info->tree_mod_seq);
363}
364
365
366
367
368
369
370
371
372
373u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info,
374 struct seq_list *elem)
375{
376 tree_mod_log_write_lock(fs_info);
377 spin_lock(&fs_info->tree_mod_seq_lock);
378 if (!elem->seq) {
379 elem->seq = btrfs_inc_tree_mod_seq(fs_info);
380 list_add_tail(&elem->list, &fs_info->tree_mod_seq_list);
381 }
382 spin_unlock(&fs_info->tree_mod_seq_lock);
383 tree_mod_log_write_unlock(fs_info);
384
385 return elem->seq;
386}
387
388void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info,
389 struct seq_list *elem)
390{
391 struct rb_root *tm_root;
392 struct rb_node *node;
393 struct rb_node *next;
394 struct seq_list *cur_elem;
395 struct tree_mod_elem *tm;
396 u64 min_seq = (u64)-1;
397 u64 seq_putting = elem->seq;
398
399 if (!seq_putting)
400 return;
401
402 spin_lock(&fs_info->tree_mod_seq_lock);
403 list_del(&elem->list);
404 elem->seq = 0;
405
406 list_for_each_entry(cur_elem, &fs_info->tree_mod_seq_list, list) {
407 if (cur_elem->seq < min_seq) {
408 if (seq_putting > cur_elem->seq) {
409
410
411
412
413 spin_unlock(&fs_info->tree_mod_seq_lock);
414 return;
415 }
416 min_seq = cur_elem->seq;
417 }
418 }
419 spin_unlock(&fs_info->tree_mod_seq_lock);
420
421
422
423
424
425 tree_mod_log_write_lock(fs_info);
426 tm_root = &fs_info->tree_mod_log;
427 for (node = rb_first(tm_root); node; node = next) {
428 next = rb_next(node);
429 tm = rb_entry(node, struct tree_mod_elem, node);
430 if (tm->seq > min_seq)
431 continue;
432 rb_erase(node, tm_root);
433 kfree(tm);
434 }
435 tree_mod_log_write_unlock(fs_info);
436}
437
438
439
440
441
442
443
444
445
446
447
448static noinline int
449__tree_mod_log_insert(struct btrfs_fs_info *fs_info, struct tree_mod_elem *tm)
450{
451 struct rb_root *tm_root;
452 struct rb_node **new;
453 struct rb_node *parent = NULL;
454 struct tree_mod_elem *cur;
455
456 tm->seq = btrfs_inc_tree_mod_seq(fs_info);
457
458 tm_root = &fs_info->tree_mod_log;
459 new = &tm_root->rb_node;
460 while (*new) {
461 cur = rb_entry(*new, struct tree_mod_elem, node);
462 parent = *new;
463 if (cur->logical < tm->logical)
464 new = &((*new)->rb_left);
465 else if (cur->logical > tm->logical)
466 new = &((*new)->rb_right);
467 else if (cur->seq < tm->seq)
468 new = &((*new)->rb_left);
469 else if (cur->seq > tm->seq)
470 new = &((*new)->rb_right);
471 else
472 return -EEXIST;
473 }
474
475 rb_link_node(&tm->node, parent, new);
476 rb_insert_color(&tm->node, tm_root);
477 return 0;
478}
479
480
481
482
483
484
485
486static inline int tree_mod_dont_log(struct btrfs_fs_info *fs_info,
487 struct extent_buffer *eb) {
488 smp_mb();
489 if (list_empty(&(fs_info)->tree_mod_seq_list))
490 return 1;
491 if (eb && btrfs_header_level(eb) == 0)
492 return 1;
493
494 tree_mod_log_write_lock(fs_info);
495 if (list_empty(&(fs_info)->tree_mod_seq_list)) {
496 tree_mod_log_write_unlock(fs_info);
497 return 1;
498 }
499
500 return 0;
501}
502
503
504static inline int tree_mod_need_log(const struct btrfs_fs_info *fs_info,
505 struct extent_buffer *eb)
506{
507 smp_mb();
508 if (list_empty(&(fs_info)->tree_mod_seq_list))
509 return 0;
510 if (eb && btrfs_header_level(eb) == 0)
511 return 0;
512
513 return 1;
514}
515
516static struct tree_mod_elem *
517alloc_tree_mod_elem(struct extent_buffer *eb, int slot,
518 enum mod_log_op op, gfp_t flags)
519{
520 struct tree_mod_elem *tm;
521
522 tm = kzalloc(sizeof(*tm), flags);
523 if (!tm)
524 return NULL;
525
526 tm->logical = eb->start;
527 if (op != MOD_LOG_KEY_ADD) {
528 btrfs_node_key(eb, &tm->key, slot);
529 tm->blockptr = btrfs_node_blockptr(eb, slot);
530 }
531 tm->op = op;
532 tm->slot = slot;
533 tm->generation = btrfs_node_ptr_generation(eb, slot);
534 RB_CLEAR_NODE(&tm->node);
535
536 return tm;
537}
538
539static noinline int
540tree_mod_log_insert_key(struct btrfs_fs_info *fs_info,
541 struct extent_buffer *eb, int slot,
542 enum mod_log_op op, gfp_t flags)
543{
544 struct tree_mod_elem *tm;
545 int ret;
546
547 if (!tree_mod_need_log(fs_info, eb))
548 return 0;
549
550 tm = alloc_tree_mod_elem(eb, slot, op, flags);
551 if (!tm)
552 return -ENOMEM;
553
554 if (tree_mod_dont_log(fs_info, eb)) {
555 kfree(tm);
556 return 0;
557 }
558
559 ret = __tree_mod_log_insert(fs_info, tm);
560 tree_mod_log_write_unlock(fs_info);
561 if (ret)
562 kfree(tm);
563
564 return ret;
565}
566
567static noinline int
568tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
569 struct extent_buffer *eb, int dst_slot, int src_slot,
570 int nr_items)
571{
572 struct tree_mod_elem *tm = NULL;
573 struct tree_mod_elem **tm_list = NULL;
574 int ret = 0;
575 int i;
576 int locked = 0;
577
578 if (!tree_mod_need_log(fs_info, eb))
579 return 0;
580
581 tm_list = kcalloc(nr_items, sizeof(struct tree_mod_elem *), GFP_NOFS);
582 if (!tm_list)
583 return -ENOMEM;
584
585 tm = kzalloc(sizeof(*tm), GFP_NOFS);
586 if (!tm) {
587 ret = -ENOMEM;
588 goto free_tms;
589 }
590
591 tm->logical = eb->start;
592 tm->slot = src_slot;
593 tm->move.dst_slot = dst_slot;
594 tm->move.nr_items = nr_items;
595 tm->op = MOD_LOG_MOVE_KEYS;
596
597 for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
598 tm_list[i] = alloc_tree_mod_elem(eb, i + dst_slot,
599 MOD_LOG_KEY_REMOVE_WHILE_MOVING, GFP_NOFS);
600 if (!tm_list[i]) {
601 ret = -ENOMEM;
602 goto free_tms;
603 }
604 }
605
606 if (tree_mod_dont_log(fs_info, eb))
607 goto free_tms;
608 locked = 1;
609
610
611
612
613
614
615 for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
616 ret = __tree_mod_log_insert(fs_info, tm_list[i]);
617 if (ret)
618 goto free_tms;
619 }
620
621 ret = __tree_mod_log_insert(fs_info, tm);
622 if (ret)
623 goto free_tms;
624 tree_mod_log_write_unlock(fs_info);
625 kfree(tm_list);
626
627 return 0;
628free_tms:
629 for (i = 0; i < nr_items; i++) {
630 if (tm_list[i] && !RB_EMPTY_NODE(&tm_list[i]->node))
631 rb_erase(&tm_list[i]->node, &fs_info->tree_mod_log);
632 kfree(tm_list[i]);
633 }
634 if (locked)
635 tree_mod_log_write_unlock(fs_info);
636 kfree(tm_list);
637 kfree(tm);
638
639 return ret;
640}
641
642static inline int
643__tree_mod_log_free_eb(struct btrfs_fs_info *fs_info,
644 struct tree_mod_elem **tm_list,
645 int nritems)
646{
647 int i, j;
648 int ret;
649
650 for (i = nritems - 1; i >= 0; i--) {
651 ret = __tree_mod_log_insert(fs_info, tm_list[i]);
652 if (ret) {
653 for (j = nritems - 1; j > i; j--)
654 rb_erase(&tm_list[j]->node,
655 &fs_info->tree_mod_log);
656 return ret;
657 }
658 }
659
660 return 0;
661}
662
663static noinline int
664tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
665 struct extent_buffer *old_root,
666 struct extent_buffer *new_root,
667 int log_removal)
668{
669 struct tree_mod_elem *tm = NULL;
670 struct tree_mod_elem **tm_list = NULL;
671 int nritems = 0;
672 int ret = 0;
673 int i;
674
675 if (!tree_mod_need_log(fs_info, NULL))
676 return 0;
677
678 if (log_removal && btrfs_header_level(old_root) > 0) {
679 nritems = btrfs_header_nritems(old_root);
680 tm_list = kcalloc(nritems, sizeof(struct tree_mod_elem *),
681 GFP_NOFS);
682 if (!tm_list) {
683 ret = -ENOMEM;
684 goto free_tms;
685 }
686 for (i = 0; i < nritems; i++) {
687 tm_list[i] = alloc_tree_mod_elem(old_root, i,
688 MOD_LOG_KEY_REMOVE_WHILE_FREEING, GFP_NOFS);
689 if (!tm_list[i]) {
690 ret = -ENOMEM;
691 goto free_tms;
692 }
693 }
694 }
695
696 tm = kzalloc(sizeof(*tm), GFP_NOFS);
697 if (!tm) {
698 ret = -ENOMEM;
699 goto free_tms;
700 }
701
702 tm->logical = new_root->start;
703 tm->old_root.logical = old_root->start;
704 tm->old_root.level = btrfs_header_level(old_root);
705 tm->generation = btrfs_header_generation(old_root);
706 tm->op = MOD_LOG_ROOT_REPLACE;
707
708 if (tree_mod_dont_log(fs_info, NULL))
709 goto free_tms;
710
711 if (tm_list)
712 ret = __tree_mod_log_free_eb(fs_info, tm_list, nritems);
713 if (!ret)
714 ret = __tree_mod_log_insert(fs_info, tm);
715
716 tree_mod_log_write_unlock(fs_info);
717 if (ret)
718 goto free_tms;
719 kfree(tm_list);
720
721 return ret;
722
723free_tms:
724 if (tm_list) {
725 for (i = 0; i < nritems; i++)
726 kfree(tm_list[i]);
727 kfree(tm_list);
728 }
729 kfree(tm);
730
731 return ret;
732}
733
734static struct tree_mod_elem *
735__tree_mod_log_search(struct btrfs_fs_info *fs_info, u64 start, u64 min_seq,
736 int smallest)
737{
738 struct rb_root *tm_root;
739 struct rb_node *node;
740 struct tree_mod_elem *cur = NULL;
741 struct tree_mod_elem *found = NULL;
742
743 tree_mod_log_read_lock(fs_info);
744 tm_root = &fs_info->tree_mod_log;
745 node = tm_root->rb_node;
746 while (node) {
747 cur = rb_entry(node, struct tree_mod_elem, node);
748 if (cur->logical < start) {
749 node = node->rb_left;
750 } else if (cur->logical > start) {
751 node = node->rb_right;
752 } else if (cur->seq < min_seq) {
753 node = node->rb_left;
754 } else if (!smallest) {
755
756 if (found)
757 BUG_ON(found->seq > cur->seq);
758 found = cur;
759 node = node->rb_left;
760 } else if (cur->seq > min_seq) {
761
762 if (found)
763 BUG_ON(found->seq < cur->seq);
764 found = cur;
765 node = node->rb_right;
766 } else {
767 found = cur;
768 break;
769 }
770 }
771 tree_mod_log_read_unlock(fs_info);
772
773 return found;
774}
775
776
777
778
779
780
781static struct tree_mod_elem *
782tree_mod_log_search_oldest(struct btrfs_fs_info *fs_info, u64 start,
783 u64 min_seq)
784{
785 return __tree_mod_log_search(fs_info, start, min_seq, 1);
786}
787
788
789
790
791
792
793static struct tree_mod_elem *
794tree_mod_log_search(struct btrfs_fs_info *fs_info, u64 start, u64 min_seq)
795{
796 return __tree_mod_log_search(fs_info, start, min_seq, 0);
797}
798
799static noinline int
800tree_mod_log_eb_copy(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
801 struct extent_buffer *src, unsigned long dst_offset,
802 unsigned long src_offset, int nr_items)
803{
804 int ret = 0;
805 struct tree_mod_elem **tm_list = NULL;
806 struct tree_mod_elem **tm_list_add, **tm_list_rem;
807 int i;
808 int locked = 0;
809
810 if (!tree_mod_need_log(fs_info, NULL))
811 return 0;
812
813 if (btrfs_header_level(dst) == 0 && btrfs_header_level(src) == 0)
814 return 0;
815
816 tm_list = kcalloc(nr_items * 2, sizeof(struct tree_mod_elem *),
817 GFP_NOFS);
818 if (!tm_list)
819 return -ENOMEM;
820
821 tm_list_add = tm_list;
822 tm_list_rem = tm_list + nr_items;
823 for (i = 0; i < nr_items; i++) {
824 tm_list_rem[i] = alloc_tree_mod_elem(src, i + src_offset,
825 MOD_LOG_KEY_REMOVE, GFP_NOFS);
826 if (!tm_list_rem[i]) {
827 ret = -ENOMEM;
828 goto free_tms;
829 }
830
831 tm_list_add[i] = alloc_tree_mod_elem(dst, i + dst_offset,
832 MOD_LOG_KEY_ADD, GFP_NOFS);
833 if (!tm_list_add[i]) {
834 ret = -ENOMEM;
835 goto free_tms;
836 }
837 }
838
839 if (tree_mod_dont_log(fs_info, NULL))
840 goto free_tms;
841 locked = 1;
842
843 for (i = 0; i < nr_items; i++) {
844 ret = __tree_mod_log_insert(fs_info, tm_list_rem[i]);
845 if (ret)
846 goto free_tms;
847 ret = __tree_mod_log_insert(fs_info, tm_list_add[i]);
848 if (ret)
849 goto free_tms;
850 }
851
852 tree_mod_log_write_unlock(fs_info);
853 kfree(tm_list);
854
855 return 0;
856
857free_tms:
858 for (i = 0; i < nr_items * 2; i++) {
859 if (tm_list[i] && !RB_EMPTY_NODE(&tm_list[i]->node))
860 rb_erase(&tm_list[i]->node, &fs_info->tree_mod_log);
861 kfree(tm_list[i]);
862 }
863 if (locked)
864 tree_mod_log_write_unlock(fs_info);
865 kfree(tm_list);
866
867 return ret;
868}
869
870static inline void
871tree_mod_log_eb_move(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
872 int dst_offset, int src_offset, int nr_items)
873{
874 int ret;
875 ret = tree_mod_log_insert_move(fs_info, dst, dst_offset, src_offset,
876 nr_items);
877 BUG_ON(ret < 0);
878}
879
880static noinline void
881tree_mod_log_set_node_key(struct btrfs_fs_info *fs_info,
882 struct extent_buffer *eb, int slot, int atomic)
883{
884 int ret;
885
886 ret = tree_mod_log_insert_key(fs_info, eb, slot,
887 MOD_LOG_KEY_REPLACE,
888 atomic ? GFP_ATOMIC : GFP_NOFS);
889 BUG_ON(ret < 0);
890}
891
892static noinline int
893tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb)
894{
895 struct tree_mod_elem **tm_list = NULL;
896 int nritems = 0;
897 int i;
898 int ret = 0;
899
900 if (btrfs_header_level(eb) == 0)
901 return 0;
902
903 if (!tree_mod_need_log(fs_info, NULL))
904 return 0;
905
906 nritems = btrfs_header_nritems(eb);
907 tm_list = kcalloc(nritems, sizeof(struct tree_mod_elem *), GFP_NOFS);
908 if (!tm_list)
909 return -ENOMEM;
910
911 for (i = 0; i < nritems; i++) {
912 tm_list[i] = alloc_tree_mod_elem(eb, i,
913 MOD_LOG_KEY_REMOVE_WHILE_FREEING, GFP_NOFS);
914 if (!tm_list[i]) {
915 ret = -ENOMEM;
916 goto free_tms;
917 }
918 }
919
920 if (tree_mod_dont_log(fs_info, eb))
921 goto free_tms;
922
923 ret = __tree_mod_log_free_eb(fs_info, tm_list, nritems);
924 tree_mod_log_write_unlock(fs_info);
925 if (ret)
926 goto free_tms;
927 kfree(tm_list);
928
929 return 0;
930
931free_tms:
932 for (i = 0; i < nritems; i++)
933 kfree(tm_list[i]);
934 kfree(tm_list);
935
936 return ret;
937}
938
939static noinline void
940tree_mod_log_set_root_pointer(struct btrfs_root *root,
941 struct extent_buffer *new_root_node,
942 int log_removal)
943{
944 int ret;
945 ret = tree_mod_log_insert_root(root->fs_info, root->node,
946 new_root_node, log_removal);
947 BUG_ON(ret < 0);
948}
949
950
951
952
953int btrfs_block_can_be_shared(struct btrfs_root *root,
954 struct extent_buffer *buf)
955{
956
957
958
959
960
961
962 if (test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
963 buf != root->node && buf != root->commit_root &&
964 (btrfs_header_generation(buf) <=
965 btrfs_root_last_snapshot(&root->root_item) ||
966 btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)))
967 return 1;
968#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
969 if (test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
970 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
971 return 1;
972#endif
973 return 0;
974}
975
976static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
977 struct btrfs_root *root,
978 struct extent_buffer *buf,
979 struct extent_buffer *cow,
980 int *last_ref)
981{
982 struct btrfs_fs_info *fs_info = root->fs_info;
983 u64 refs;
984 u64 owner;
985 u64 flags;
986 u64 new_flags = 0;
987 int ret;
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006 if (btrfs_block_can_be_shared(root, buf)) {
1007 ret = btrfs_lookup_extent_info(trans, fs_info, buf->start,
1008 btrfs_header_level(buf), 1,
1009 &refs, &flags);
1010 if (ret)
1011 return ret;
1012 if (refs == 0) {
1013 ret = -EROFS;
1014 btrfs_handle_fs_error(fs_info, ret, NULL);
1015 return ret;
1016 }
1017 } else {
1018 refs = 1;
1019 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
1020 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
1021 flags = BTRFS_BLOCK_FLAG_FULL_BACKREF;
1022 else
1023 flags = 0;
1024 }
1025
1026 owner = btrfs_header_owner(buf);
1027 BUG_ON(owner == BTRFS_TREE_RELOC_OBJECTID &&
1028 !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF));
1029
1030 if (refs > 1) {
1031 if ((owner == root->root_key.objectid ||
1032 root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) &&
1033 !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) {
1034 ret = btrfs_inc_ref(trans, root, buf, 1);
1035 BUG_ON(ret);
1036
1037 if (root->root_key.objectid ==
1038 BTRFS_TREE_RELOC_OBJECTID) {
1039 ret = btrfs_dec_ref(trans, root, buf, 0);
1040 BUG_ON(ret);
1041 ret = btrfs_inc_ref(trans, root, cow, 1);
1042 BUG_ON(ret);
1043 }
1044 new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
1045 } else {
1046
1047 if (root->root_key.objectid ==
1048 BTRFS_TREE_RELOC_OBJECTID)
1049 ret = btrfs_inc_ref(trans, root, cow, 1);
1050 else
1051 ret = btrfs_inc_ref(trans, root, cow, 0);
1052 BUG_ON(ret);
1053 }
1054 if (new_flags != 0) {
1055 int level = btrfs_header_level(buf);
1056
1057 ret = btrfs_set_disk_extent_flags(trans, fs_info,
1058 buf->start,
1059 buf->len,
1060 new_flags, level, 0);
1061 if (ret)
1062 return ret;
1063 }
1064 } else {
1065 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
1066 if (root->root_key.objectid ==
1067 BTRFS_TREE_RELOC_OBJECTID)
1068 ret = btrfs_inc_ref(trans, root, cow, 1);
1069 else
1070 ret = btrfs_inc_ref(trans, root, cow, 0);
1071 BUG_ON(ret);
1072 ret = btrfs_dec_ref(trans, root, buf, 1);
1073 BUG_ON(ret);
1074 }
1075 clean_tree_block(fs_info, buf);
1076 *last_ref = 1;
1077 }
1078 return 0;
1079}
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
1094 struct btrfs_root *root,
1095 struct extent_buffer *buf,
1096 struct extent_buffer *parent, int parent_slot,
1097 struct extent_buffer **cow_ret,
1098 u64 search_start, u64 empty_size)
1099{
1100 struct btrfs_fs_info *fs_info = root->fs_info;
1101 struct btrfs_disk_key disk_key;
1102 struct extent_buffer *cow;
1103 int level, ret;
1104 int last_ref = 0;
1105 int unlock_orig = 0;
1106 u64 parent_start = 0;
1107
1108 if (*cow_ret == buf)
1109 unlock_orig = 1;
1110
1111 btrfs_assert_tree_locked(buf);
1112
1113 WARN_ON(test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
1114 trans->transid != fs_info->running_transaction->transid);
1115 WARN_ON(test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
1116 trans->transid != root->last_trans);
1117
1118 level = btrfs_header_level(buf);
1119
1120 if (level == 0)
1121 btrfs_item_key(buf, &disk_key, 0);
1122 else
1123 btrfs_node_key(buf, &disk_key, 0);
1124
1125 if ((root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && parent)
1126 parent_start = parent->start;
1127
1128 cow = btrfs_alloc_tree_block(trans, root, parent_start,
1129 root->root_key.objectid, &disk_key, level,
1130 search_start, empty_size);
1131 if (IS_ERR(cow))
1132 return PTR_ERR(cow);
1133
1134
1135
1136 copy_extent_buffer_full(cow, buf);
1137 btrfs_set_header_bytenr(cow, cow->start);
1138 btrfs_set_header_generation(cow, trans->transid);
1139 btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
1140 btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN |
1141 BTRFS_HEADER_FLAG_RELOC);
1142 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
1143 btrfs_set_header_flag(cow, BTRFS_HEADER_FLAG_RELOC);
1144 else
1145 btrfs_set_header_owner(cow, root->root_key.objectid);
1146
1147 write_extent_buffer_fsid(cow, fs_info->fsid);
1148
1149 ret = update_ref_for_cow(trans, root, buf, cow, &last_ref);
1150 if (ret) {
1151 btrfs_abort_transaction(trans, ret);
1152 return ret;
1153 }
1154
1155 if (test_bit(BTRFS_ROOT_REF_COWS, &root->state)) {
1156 ret = btrfs_reloc_cow_block(trans, root, buf, cow);
1157 if (ret) {
1158 btrfs_abort_transaction(trans, ret);
1159 return ret;
1160 }
1161 }
1162
1163 if (buf == root->node) {
1164 WARN_ON(parent && parent != buf);
1165 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
1166 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
1167 parent_start = buf->start;
1168
1169 extent_buffer_get(cow);
1170 tree_mod_log_set_root_pointer(root, cow, 1);
1171 rcu_assign_pointer(root->node, cow);
1172
1173 btrfs_free_tree_block(trans, root, buf, parent_start,
1174 last_ref);
1175 free_extent_buffer(buf);
1176 add_root_to_dirty_list(root);
1177 } else {
1178 WARN_ON(trans->transid != btrfs_header_generation(parent));
1179 tree_mod_log_insert_key(fs_info, parent, parent_slot,
1180 MOD_LOG_KEY_REPLACE, GFP_NOFS);
1181 btrfs_set_node_blockptr(parent, parent_slot,
1182 cow->start);
1183 btrfs_set_node_ptr_generation(parent, parent_slot,
1184 trans->transid);
1185 btrfs_mark_buffer_dirty(parent);
1186 if (last_ref) {
1187 ret = tree_mod_log_free_eb(fs_info, buf);
1188 if (ret) {
1189 btrfs_abort_transaction(trans, ret);
1190 return ret;
1191 }
1192 }
1193 btrfs_free_tree_block(trans, root, buf, parent_start,
1194 last_ref);
1195 }
1196 if (unlock_orig)
1197 btrfs_tree_unlock(buf);
1198 free_extent_buffer_stale(buf);
1199 btrfs_mark_buffer_dirty(cow);
1200 *cow_ret = cow;
1201 return 0;
1202}
1203
1204
1205
1206
1207
1208static struct tree_mod_elem *
1209__tree_mod_log_oldest_root(struct btrfs_fs_info *fs_info,
1210 struct extent_buffer *eb_root, u64 time_seq)
1211{
1212 struct tree_mod_elem *tm;
1213 struct tree_mod_elem *found = NULL;
1214 u64 root_logical = eb_root->start;
1215 int looped = 0;
1216
1217 if (!time_seq)
1218 return NULL;
1219
1220
1221
1222
1223
1224
1225
1226 while (1) {
1227 tm = tree_mod_log_search_oldest(fs_info, root_logical,
1228 time_seq);
1229 if (!looped && !tm)
1230 return NULL;
1231
1232
1233
1234
1235
1236 if (!tm)
1237 break;
1238
1239
1240
1241
1242
1243
1244 if (tm->op != MOD_LOG_ROOT_REPLACE)
1245 break;
1246
1247 found = tm;
1248 root_logical = tm->old_root.logical;
1249 looped = 1;
1250 }
1251
1252
1253 if (!found)
1254 found = tm;
1255
1256 return found;
1257}
1258
1259
1260
1261
1262
1263
1264static void
1265__tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct extent_buffer *eb,
1266 u64 time_seq, struct tree_mod_elem *first_tm)
1267{
1268 u32 n;
1269 struct rb_node *next;
1270 struct tree_mod_elem *tm = first_tm;
1271 unsigned long o_dst;
1272 unsigned long o_src;
1273 unsigned long p_size = sizeof(struct btrfs_key_ptr);
1274
1275 n = btrfs_header_nritems(eb);
1276 tree_mod_log_read_lock(fs_info);
1277 while (tm && tm->seq >= time_seq) {
1278
1279
1280
1281
1282
1283 switch (tm->op) {
1284 case MOD_LOG_KEY_REMOVE_WHILE_FREEING:
1285 BUG_ON(tm->slot < n);
1286
1287 case MOD_LOG_KEY_REMOVE_WHILE_MOVING:
1288 case MOD_LOG_KEY_REMOVE:
1289 btrfs_set_node_key(eb, &tm->key, tm->slot);
1290 btrfs_set_node_blockptr(eb, tm->slot, tm->blockptr);
1291 btrfs_set_node_ptr_generation(eb, tm->slot,
1292 tm->generation);
1293 n++;
1294 break;
1295 case MOD_LOG_KEY_REPLACE:
1296 BUG_ON(tm->slot >= n);
1297 btrfs_set_node_key(eb, &tm->key, tm->slot);
1298 btrfs_set_node_blockptr(eb, tm->slot, tm->blockptr);
1299 btrfs_set_node_ptr_generation(eb, tm->slot,
1300 tm->generation);
1301 break;
1302 case MOD_LOG_KEY_ADD:
1303
1304 n--;
1305 break;
1306 case MOD_LOG_MOVE_KEYS:
1307 o_dst = btrfs_node_key_ptr_offset(tm->slot);
1308 o_src = btrfs_node_key_ptr_offset(tm->move.dst_slot);
1309 memmove_extent_buffer(eb, o_dst, o_src,
1310 tm->move.nr_items * p_size);
1311 break;
1312 case MOD_LOG_ROOT_REPLACE:
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322 break;
1323 }
1324 next = rb_next(&tm->node);
1325 if (!next)
1326 break;
1327 tm = rb_entry(next, struct tree_mod_elem, node);
1328 if (tm->logical != first_tm->logical)
1329 break;
1330 }
1331 tree_mod_log_read_unlock(fs_info);
1332 btrfs_set_header_nritems(eb, n);
1333}
1334
1335
1336
1337
1338
1339
1340
1341
1342static struct extent_buffer *
1343tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
1344 struct extent_buffer *eb, u64 time_seq)
1345{
1346 struct extent_buffer *eb_rewin;
1347 struct tree_mod_elem *tm;
1348
1349 if (!time_seq)
1350 return eb;
1351
1352 if (btrfs_header_level(eb) == 0)
1353 return eb;
1354
1355 tm = tree_mod_log_search(fs_info, eb->start, time_seq);
1356 if (!tm)
1357 return eb;
1358
1359 btrfs_set_path_blocking(path);
1360 btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1361
1362 if (tm->op == MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
1363 BUG_ON(tm->slot != 0);
1364 eb_rewin = alloc_dummy_extent_buffer(fs_info, eb->start);
1365 if (!eb_rewin) {
1366 btrfs_tree_read_unlock_blocking(eb);
1367 free_extent_buffer(eb);
1368 return NULL;
1369 }
1370 btrfs_set_header_bytenr(eb_rewin, eb->start);
1371 btrfs_set_header_backref_rev(eb_rewin,
1372 btrfs_header_backref_rev(eb));
1373 btrfs_set_header_owner(eb_rewin, btrfs_header_owner(eb));
1374 btrfs_set_header_level(eb_rewin, btrfs_header_level(eb));
1375 } else {
1376 eb_rewin = btrfs_clone_extent_buffer(eb);
1377 if (!eb_rewin) {
1378 btrfs_tree_read_unlock_blocking(eb);
1379 free_extent_buffer(eb);
1380 return NULL;
1381 }
1382 }
1383
1384 btrfs_clear_path_blocking(path, NULL, BTRFS_READ_LOCK);
1385 btrfs_tree_read_unlock_blocking(eb);
1386 free_extent_buffer(eb);
1387
1388 extent_buffer_get(eb_rewin);
1389 btrfs_tree_read_lock(eb_rewin);
1390 __tree_mod_log_rewind(fs_info, eb_rewin, time_seq, tm);
1391 WARN_ON(btrfs_header_nritems(eb_rewin) >
1392 BTRFS_NODEPTRS_PER_BLOCK(fs_info));
1393
1394 return eb_rewin;
1395}
1396
1397
1398
1399
1400
1401
1402
1403
1404static inline struct extent_buffer *
1405get_old_root(struct btrfs_root *root, u64 time_seq)
1406{
1407 struct btrfs_fs_info *fs_info = root->fs_info;
1408 struct tree_mod_elem *tm;
1409 struct extent_buffer *eb = NULL;
1410 struct extent_buffer *eb_root;
1411 struct extent_buffer *old;
1412 struct tree_mod_root *old_root = NULL;
1413 u64 old_generation = 0;
1414 u64 logical;
1415
1416 eb_root = btrfs_read_lock_root_node(root);
1417 tm = __tree_mod_log_oldest_root(fs_info, eb_root, time_seq);
1418 if (!tm)
1419 return eb_root;
1420
1421 if (tm->op == MOD_LOG_ROOT_REPLACE) {
1422 old_root = &tm->old_root;
1423 old_generation = tm->generation;
1424 logical = old_root->logical;
1425 } else {
1426 logical = eb_root->start;
1427 }
1428
1429 tm = tree_mod_log_search(fs_info, logical, time_seq);
1430 if (old_root && tm && tm->op != MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
1431 btrfs_tree_read_unlock(eb_root);
1432 free_extent_buffer(eb_root);
1433 old = read_tree_block(fs_info, logical, 0);
1434 if (WARN_ON(IS_ERR(old) || !extent_buffer_uptodate(old))) {
1435 if (!IS_ERR(old))
1436 free_extent_buffer(old);
1437 btrfs_warn(fs_info,
1438 "failed to read tree block %llu from get_old_root",
1439 logical);
1440 } else {
1441 eb = btrfs_clone_extent_buffer(old);
1442 free_extent_buffer(old);
1443 }
1444 } else if (old_root) {
1445 btrfs_tree_read_unlock(eb_root);
1446 free_extent_buffer(eb_root);
1447 eb = alloc_dummy_extent_buffer(fs_info, logical);
1448 } else {
1449 btrfs_set_lock_blocking_rw(eb_root, BTRFS_READ_LOCK);
1450 eb = btrfs_clone_extent_buffer(eb_root);
1451 btrfs_tree_read_unlock_blocking(eb_root);
1452 free_extent_buffer(eb_root);
1453 }
1454
1455 if (!eb)
1456 return NULL;
1457 extent_buffer_get(eb);
1458 btrfs_tree_read_lock(eb);
1459 if (old_root) {
1460 btrfs_set_header_bytenr(eb, eb->start);
1461 btrfs_set_header_backref_rev(eb, BTRFS_MIXED_BACKREF_REV);
1462 btrfs_set_header_owner(eb, btrfs_header_owner(eb_root));
1463 btrfs_set_header_level(eb, old_root->level);
1464 btrfs_set_header_generation(eb, old_generation);
1465 }
1466 if (tm)
1467 __tree_mod_log_rewind(fs_info, eb, time_seq, tm);
1468 else
1469 WARN_ON(btrfs_header_level(eb) != 0);
1470 WARN_ON(btrfs_header_nritems(eb) > BTRFS_NODEPTRS_PER_BLOCK(fs_info));
1471
1472 return eb;
1473}
1474
1475int btrfs_old_root_level(struct btrfs_root *root, u64 time_seq)
1476{
1477 struct tree_mod_elem *tm;
1478 int level;
1479 struct extent_buffer *eb_root = btrfs_root_node(root);
1480
1481 tm = __tree_mod_log_oldest_root(root->fs_info, eb_root, time_seq);
1482 if (tm && tm->op == MOD_LOG_ROOT_REPLACE) {
1483 level = tm->old_root.level;
1484 } else {
1485 level = btrfs_header_level(eb_root);
1486 }
1487 free_extent_buffer(eb_root);
1488
1489 return level;
1490}
1491
1492static inline int should_cow_block(struct btrfs_trans_handle *trans,
1493 struct btrfs_root *root,
1494 struct extent_buffer *buf)
1495{
1496 if (btrfs_is_testing(root->fs_info))
1497 return 0;
1498
1499
1500 smp_rmb();
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513 if (btrfs_header_generation(buf) == trans->transid &&
1514 !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN) &&
1515 !(root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID &&
1516 btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)) &&
1517 !test_bit(BTRFS_ROOT_FORCE_COW, &root->state))
1518 return 0;
1519 return 1;
1520}
1521
1522
1523
1524
1525
1526
1527noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,
1528 struct btrfs_root *root, struct extent_buffer *buf,
1529 struct extent_buffer *parent, int parent_slot,
1530 struct extent_buffer **cow_ret)
1531{
1532 struct btrfs_fs_info *fs_info = root->fs_info;
1533 u64 search_start;
1534 int ret;
1535
1536 if (trans->transaction != fs_info->running_transaction)
1537 WARN(1, KERN_CRIT "trans %llu running %llu\n",
1538 trans->transid,
1539 fs_info->running_transaction->transid);
1540
1541 if (trans->transid != fs_info->generation)
1542 WARN(1, KERN_CRIT "trans %llu running %llu\n",
1543 trans->transid, fs_info->generation);
1544
1545 if (!should_cow_block(trans, root, buf)) {
1546 trans->dirty = true;
1547 *cow_ret = buf;
1548 return 0;
1549 }
1550
1551 search_start = buf->start & ~((u64)SZ_1G - 1);
1552
1553 if (parent)
1554 btrfs_set_lock_blocking(parent);
1555 btrfs_set_lock_blocking(buf);
1556
1557 ret = __btrfs_cow_block(trans, root, buf, parent,
1558 parent_slot, cow_ret, search_start, 0);
1559
1560 trace_btrfs_cow_block(root, buf, *cow_ret);
1561
1562 return ret;
1563}
1564
1565
1566
1567
1568
1569static int close_blocks(u64 blocknr, u64 other, u32 blocksize)
1570{
1571 if (blocknr < other && other - (blocknr + blocksize) < 32768)
1572 return 1;
1573 if (blocknr > other && blocknr - (other + blocksize) < 32768)
1574 return 1;
1575 return 0;
1576}
1577
1578
1579
1580
1581static int comp_keys(const struct btrfs_disk_key *disk,
1582 const struct btrfs_key *k2)
1583{
1584 struct btrfs_key k1;
1585
1586 btrfs_disk_key_to_cpu(&k1, disk);
1587
1588 return btrfs_comp_cpu_keys(&k1, k2);
1589}
1590
1591
1592
1593
1594int btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2)
1595{
1596 if (k1->objectid > k2->objectid)
1597 return 1;
1598 if (k1->objectid < k2->objectid)
1599 return -1;
1600 if (k1->type > k2->type)
1601 return 1;
1602 if (k1->type < k2->type)
1603 return -1;
1604 if (k1->offset > k2->offset)
1605 return 1;
1606 if (k1->offset < k2->offset)
1607 return -1;
1608 return 0;
1609}
1610
1611
1612
1613
1614
1615
1616int btrfs_realloc_node(struct btrfs_trans_handle *trans,
1617 struct btrfs_root *root, struct extent_buffer *parent,
1618 int start_slot, u64 *last_ret,
1619 struct btrfs_key *progress)
1620{
1621 struct btrfs_fs_info *fs_info = root->fs_info;
1622 struct extent_buffer *cur;
1623 u64 blocknr;
1624 u64 gen;
1625 u64 search_start = *last_ret;
1626 u64 last_block = 0;
1627 u64 other;
1628 u32 parent_nritems;
1629 int end_slot;
1630 int i;
1631 int err = 0;
1632 int parent_level;
1633 int uptodate;
1634 u32 blocksize;
1635 int progress_passed = 0;
1636 struct btrfs_disk_key disk_key;
1637
1638 parent_level = btrfs_header_level(parent);
1639
1640 WARN_ON(trans->transaction != fs_info->running_transaction);
1641 WARN_ON(trans->transid != fs_info->generation);
1642
1643 parent_nritems = btrfs_header_nritems(parent);
1644 blocksize = fs_info->nodesize;
1645 end_slot = parent_nritems - 1;
1646
1647 if (parent_nritems <= 1)
1648 return 0;
1649
1650 btrfs_set_lock_blocking(parent);
1651
1652 for (i = start_slot; i <= end_slot; i++) {
1653 int close = 1;
1654
1655 btrfs_node_key(parent, &disk_key, i);
1656 if (!progress_passed && comp_keys(&disk_key, progress) < 0)
1657 continue;
1658
1659 progress_passed = 1;
1660 blocknr = btrfs_node_blockptr(parent, i);
1661 gen = btrfs_node_ptr_generation(parent, i);
1662 if (last_block == 0)
1663 last_block = blocknr;
1664
1665 if (i > 0) {
1666 other = btrfs_node_blockptr(parent, i - 1);
1667 close = close_blocks(blocknr, other, blocksize);
1668 }
1669 if (!close && i < end_slot) {
1670 other = btrfs_node_blockptr(parent, i + 1);
1671 close = close_blocks(blocknr, other, blocksize);
1672 }
1673 if (close) {
1674 last_block = blocknr;
1675 continue;
1676 }
1677
1678 cur = find_extent_buffer(fs_info, blocknr);
1679 if (cur)
1680 uptodate = btrfs_buffer_uptodate(cur, gen, 0);
1681 else
1682 uptodate = 0;
1683 if (!cur || !uptodate) {
1684 if (!cur) {
1685 cur = read_tree_block(fs_info, blocknr, gen);
1686 if (IS_ERR(cur)) {
1687 return PTR_ERR(cur);
1688 } else if (!extent_buffer_uptodate(cur)) {
1689 free_extent_buffer(cur);
1690 return -EIO;
1691 }
1692 } else if (!uptodate) {
1693 err = btrfs_read_buffer(cur, gen);
1694 if (err) {
1695 free_extent_buffer(cur);
1696 return err;
1697 }
1698 }
1699 }
1700 if (search_start == 0)
1701 search_start = last_block;
1702
1703 btrfs_tree_lock(cur);
1704 btrfs_set_lock_blocking(cur);
1705 err = __btrfs_cow_block(trans, root, cur, parent, i,
1706 &cur, search_start,
1707 min(16 * blocksize,
1708 (end_slot - i) * blocksize));
1709 if (err) {
1710 btrfs_tree_unlock(cur);
1711 free_extent_buffer(cur);
1712 break;
1713 }
1714 search_start = cur->start;
1715 last_block = cur->start;
1716 *last_ret = search_start;
1717 btrfs_tree_unlock(cur);
1718 free_extent_buffer(cur);
1719 }
1720 return err;
1721}
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733static noinline int generic_bin_search(struct extent_buffer *eb,
1734 unsigned long p, int item_size,
1735 const struct btrfs_key *key,
1736 int max, int *slot)
1737{
1738 int low = 0;
1739 int high = max;
1740 int mid;
1741 int ret;
1742 struct btrfs_disk_key *tmp = NULL;
1743 struct btrfs_disk_key unaligned;
1744 unsigned long offset;
1745 char *kaddr = NULL;
1746 unsigned long map_start = 0;
1747 unsigned long map_len = 0;
1748 int err;
1749
1750 if (low > high) {
1751 btrfs_err(eb->fs_info,
1752 "%s: low (%d) > high (%d) eb %llu owner %llu level %d",
1753 __func__, low, high, eb->start,
1754 btrfs_header_owner(eb), btrfs_header_level(eb));
1755 return -EINVAL;
1756 }
1757
1758 while (low < high) {
1759 mid = (low + high) / 2;
1760 offset = p + mid * item_size;
1761
1762 if (!kaddr || offset < map_start ||
1763 (offset + sizeof(struct btrfs_disk_key)) >
1764 map_start + map_len) {
1765
1766 err = map_private_extent_buffer(eb, offset,
1767 sizeof(struct btrfs_disk_key),
1768 &kaddr, &map_start, &map_len);
1769
1770 if (!err) {
1771 tmp = (struct btrfs_disk_key *)(kaddr + offset -
1772 map_start);
1773 } else if (err == 1) {
1774 read_extent_buffer(eb, &unaligned,
1775 offset, sizeof(unaligned));
1776 tmp = &unaligned;
1777 } else {
1778 return err;
1779 }
1780
1781 } else {
1782 tmp = (struct btrfs_disk_key *)(kaddr + offset -
1783 map_start);
1784 }
1785 ret = comp_keys(tmp, key);
1786
1787 if (ret < 0)
1788 low = mid + 1;
1789 else if (ret > 0)
1790 high = mid;
1791 else {
1792 *slot = mid;
1793 return 0;
1794 }
1795 }
1796 *slot = low;
1797 return 1;
1798}
1799
1800
1801
1802
1803
1804static int bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
1805 int level, int *slot)
1806{
1807 if (level == 0)
1808 return generic_bin_search(eb,
1809 offsetof(struct btrfs_leaf, items),
1810 sizeof(struct btrfs_item),
1811 key, btrfs_header_nritems(eb),
1812 slot);
1813 else
1814 return generic_bin_search(eb,
1815 offsetof(struct btrfs_node, ptrs),
1816 sizeof(struct btrfs_key_ptr),
1817 key, btrfs_header_nritems(eb),
1818 slot);
1819}
1820
1821int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
1822 int level, int *slot)
1823{
1824 return bin_search(eb, key, level, slot);
1825}
1826
1827static void root_add_used(struct btrfs_root *root, u32 size)
1828{
1829 spin_lock(&root->accounting_lock);
1830 btrfs_set_root_used(&root->root_item,
1831 btrfs_root_used(&root->root_item) + size);
1832 spin_unlock(&root->accounting_lock);
1833}
1834
1835static void root_sub_used(struct btrfs_root *root, u32 size)
1836{
1837 spin_lock(&root->accounting_lock);
1838 btrfs_set_root_used(&root->root_item,
1839 btrfs_root_used(&root->root_item) - size);
1840 spin_unlock(&root->accounting_lock);
1841}
1842
1843
1844
1845
1846static noinline struct extent_buffer *
1847read_node_slot(struct btrfs_fs_info *fs_info, struct extent_buffer *parent,
1848 int slot)
1849{
1850 int level = btrfs_header_level(parent);
1851 struct extent_buffer *eb;
1852
1853 if (slot < 0 || slot >= btrfs_header_nritems(parent))
1854 return ERR_PTR(-ENOENT);
1855
1856 BUG_ON(level == 0);
1857
1858 eb = read_tree_block(fs_info, btrfs_node_blockptr(parent, slot),
1859 btrfs_node_ptr_generation(parent, slot));
1860 if (!IS_ERR(eb) && !extent_buffer_uptodate(eb)) {
1861 free_extent_buffer(eb);
1862 eb = ERR_PTR(-EIO);
1863 }
1864
1865 return eb;
1866}
1867
1868
1869
1870
1871
1872
1873static noinline int balance_level(struct btrfs_trans_handle *trans,
1874 struct btrfs_root *root,
1875 struct btrfs_path *path, int level)
1876{
1877 struct btrfs_fs_info *fs_info = root->fs_info;
1878 struct extent_buffer *right = NULL;
1879 struct extent_buffer *mid;
1880 struct extent_buffer *left = NULL;
1881 struct extent_buffer *parent = NULL;
1882 int ret = 0;
1883 int wret;
1884 int pslot;
1885 int orig_slot = path->slots[level];
1886 u64 orig_ptr;
1887
1888 if (level == 0)
1889 return 0;
1890
1891 mid = path->nodes[level];
1892
1893 WARN_ON(path->locks[level] != BTRFS_WRITE_LOCK &&
1894 path->locks[level] != BTRFS_WRITE_LOCK_BLOCKING);
1895 WARN_ON(btrfs_header_generation(mid) != trans->transid);
1896
1897 orig_ptr = btrfs_node_blockptr(mid, orig_slot);
1898
1899 if (level < BTRFS_MAX_LEVEL - 1) {
1900 parent = path->nodes[level + 1];
1901 pslot = path->slots[level + 1];
1902 }
1903
1904
1905
1906
1907
1908 if (!parent) {
1909 struct extent_buffer *child;
1910
1911 if (btrfs_header_nritems(mid) != 1)
1912 return 0;
1913
1914
1915 child = read_node_slot(fs_info, mid, 0);
1916 if (IS_ERR(child)) {
1917 ret = PTR_ERR(child);
1918 btrfs_handle_fs_error(fs_info, ret, NULL);
1919 goto enospc;
1920 }
1921
1922 btrfs_tree_lock(child);
1923 btrfs_set_lock_blocking(child);
1924 ret = btrfs_cow_block(trans, root, child, mid, 0, &child);
1925 if (ret) {
1926 btrfs_tree_unlock(child);
1927 free_extent_buffer(child);
1928 goto enospc;
1929 }
1930
1931 tree_mod_log_set_root_pointer(root, child, 1);
1932 rcu_assign_pointer(root->node, child);
1933
1934 add_root_to_dirty_list(root);
1935 btrfs_tree_unlock(child);
1936
1937 path->locks[level] = 0;
1938 path->nodes[level] = NULL;
1939 clean_tree_block(fs_info, mid);
1940 btrfs_tree_unlock(mid);
1941
1942 free_extent_buffer(mid);
1943
1944 root_sub_used(root, mid->len);
1945 btrfs_free_tree_block(trans, root, mid, 0, 1);
1946
1947 free_extent_buffer_stale(mid);
1948 return 0;
1949 }
1950 if (btrfs_header_nritems(mid) >
1951 BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 4)
1952 return 0;
1953
1954 left = read_node_slot(fs_info, parent, pslot - 1);
1955 if (IS_ERR(left))
1956 left = NULL;
1957
1958 if (left) {
1959 btrfs_tree_lock(left);
1960 btrfs_set_lock_blocking(left);
1961 wret = btrfs_cow_block(trans, root, left,
1962 parent, pslot - 1, &left);
1963 if (wret) {
1964 ret = wret;
1965 goto enospc;
1966 }
1967 }
1968
1969 right = read_node_slot(fs_info, parent, pslot + 1);
1970 if (IS_ERR(right))
1971 right = NULL;
1972
1973 if (right) {
1974 btrfs_tree_lock(right);
1975 btrfs_set_lock_blocking(right);
1976 wret = btrfs_cow_block(trans, root, right,
1977 parent, pslot + 1, &right);
1978 if (wret) {
1979 ret = wret;
1980 goto enospc;
1981 }
1982 }
1983
1984
1985 if (left) {
1986 orig_slot += btrfs_header_nritems(left);
1987 wret = push_node_left(trans, fs_info, left, mid, 1);
1988 if (wret < 0)
1989 ret = wret;
1990 }
1991
1992
1993
1994
1995 if (right) {
1996 wret = push_node_left(trans, fs_info, mid, right, 1);
1997 if (wret < 0 && wret != -ENOSPC)
1998 ret = wret;
1999 if (btrfs_header_nritems(right) == 0) {
2000 clean_tree_block(fs_info, right);
2001 btrfs_tree_unlock(right);
2002 del_ptr(root, path, level + 1, pslot + 1);
2003 root_sub_used(root, right->len);
2004 btrfs_free_tree_block(trans, root, right, 0, 1);
2005 free_extent_buffer_stale(right);
2006 right = NULL;
2007 } else {
2008 struct btrfs_disk_key right_key;
2009 btrfs_node_key(right, &right_key, 0);
2010 tree_mod_log_set_node_key(fs_info, parent,
2011 pslot + 1, 0);
2012 btrfs_set_node_key(parent, &right_key, pslot + 1);
2013 btrfs_mark_buffer_dirty(parent);
2014 }
2015 }
2016 if (btrfs_header_nritems(mid) == 1) {
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026 if (!left) {
2027 ret = -EROFS;
2028 btrfs_handle_fs_error(fs_info, ret, NULL);
2029 goto enospc;
2030 }
2031 wret = balance_node_right(trans, fs_info, mid, left);
2032 if (wret < 0) {
2033 ret = wret;
2034 goto enospc;
2035 }
2036 if (wret == 1) {
2037 wret = push_node_left(trans, fs_info, left, mid, 1);
2038 if (wret < 0)
2039 ret = wret;
2040 }
2041 BUG_ON(wret == 1);
2042 }
2043 if (btrfs_header_nritems(mid) == 0) {
2044 clean_tree_block(fs_info, mid);
2045 btrfs_tree_unlock(mid);
2046 del_ptr(root, path, level + 1, pslot);
2047 root_sub_used(root, mid->len);
2048 btrfs_free_tree_block(trans, root, mid, 0, 1);
2049 free_extent_buffer_stale(mid);
2050 mid = NULL;
2051 } else {
2052
2053 struct btrfs_disk_key mid_key;
2054 btrfs_node_key(mid, &mid_key, 0);
2055 tree_mod_log_set_node_key(fs_info, parent, pslot, 0);
2056 btrfs_set_node_key(parent, &mid_key, pslot);
2057 btrfs_mark_buffer_dirty(parent);
2058 }
2059
2060
2061 if (left) {
2062 if (btrfs_header_nritems(left) > orig_slot) {
2063 extent_buffer_get(left);
2064
2065 path->nodes[level] = left;
2066 path->slots[level + 1] -= 1;
2067 path->slots[level] = orig_slot;
2068 if (mid) {
2069 btrfs_tree_unlock(mid);
2070 free_extent_buffer(mid);
2071 }
2072 } else {
2073 orig_slot -= btrfs_header_nritems(left);
2074 path->slots[level] = orig_slot;
2075 }
2076 }
2077
2078 if (orig_ptr !=
2079 btrfs_node_blockptr(path->nodes[level], path->slots[level]))
2080 BUG();
2081enospc:
2082 if (right) {
2083 btrfs_tree_unlock(right);
2084 free_extent_buffer(right);
2085 }
2086 if (left) {
2087 if (path->nodes[level] != left)
2088 btrfs_tree_unlock(left);
2089 free_extent_buffer(left);
2090 }
2091 return ret;
2092}
2093
2094
2095
2096
2097
2098static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
2099 struct btrfs_root *root,
2100 struct btrfs_path *path, int level)
2101{
2102 struct btrfs_fs_info *fs_info = root->fs_info;
2103 struct extent_buffer *right = NULL;
2104 struct extent_buffer *mid;
2105 struct extent_buffer *left = NULL;
2106 struct extent_buffer *parent = NULL;
2107 int ret = 0;
2108 int wret;
2109 int pslot;
2110 int orig_slot = path->slots[level];
2111
2112 if (level == 0)
2113 return 1;
2114
2115 mid = path->nodes[level];
2116 WARN_ON(btrfs_header_generation(mid) != trans->transid);
2117
2118 if (level < BTRFS_MAX_LEVEL - 1) {
2119 parent = path->nodes[level + 1];
2120 pslot = path->slots[level + 1];
2121 }
2122
2123 if (!parent)
2124 return 1;
2125
2126 left = read_node_slot(fs_info, parent, pslot - 1);
2127 if (IS_ERR(left))
2128 left = NULL;
2129
2130
2131 if (left) {
2132 u32 left_nr;
2133
2134 btrfs_tree_lock(left);
2135 btrfs_set_lock_blocking(left);
2136
2137 left_nr = btrfs_header_nritems(left);
2138 if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
2139 wret = 1;
2140 } else {
2141 ret = btrfs_cow_block(trans, root, left, parent,
2142 pslot - 1, &left);
2143 if (ret)
2144 wret = 1;
2145 else {
2146 wret = push_node_left(trans, fs_info,
2147 left, mid, 0);
2148 }
2149 }
2150 if (wret < 0)
2151 ret = wret;
2152 if (wret == 0) {
2153 struct btrfs_disk_key disk_key;
2154 orig_slot += left_nr;
2155 btrfs_node_key(mid, &disk_key, 0);
2156 tree_mod_log_set_node_key(fs_info, parent, pslot, 0);
2157 btrfs_set_node_key(parent, &disk_key, pslot);
2158 btrfs_mark_buffer_dirty(parent);
2159 if (btrfs_header_nritems(left) > orig_slot) {
2160 path->nodes[level] = left;
2161 path->slots[level + 1] -= 1;
2162 path->slots[level] = orig_slot;
2163 btrfs_tree_unlock(mid);
2164 free_extent_buffer(mid);
2165 } else {
2166 orig_slot -=
2167 btrfs_header_nritems(left);
2168 path->slots[level] = orig_slot;
2169 btrfs_tree_unlock(left);
2170 free_extent_buffer(left);
2171 }
2172 return 0;
2173 }
2174 btrfs_tree_unlock(left);
2175 free_extent_buffer(left);
2176 }
2177 right = read_node_slot(fs_info, parent, pslot + 1);
2178 if (IS_ERR(right))
2179 right = NULL;
2180
2181
2182
2183
2184 if (right) {
2185 u32 right_nr;
2186
2187 btrfs_tree_lock(right);
2188 btrfs_set_lock_blocking(right);
2189
2190 right_nr = btrfs_header_nritems(right);
2191 if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
2192 wret = 1;
2193 } else {
2194 ret = btrfs_cow_block(trans, root, right,
2195 parent, pslot + 1,
2196 &right);
2197 if (ret)
2198 wret = 1;
2199 else {
2200 wret = balance_node_right(trans, fs_info,
2201 right, mid);
2202 }
2203 }
2204 if (wret < 0)
2205 ret = wret;
2206 if (wret == 0) {
2207 struct btrfs_disk_key disk_key;
2208
2209 btrfs_node_key(right, &disk_key, 0);
2210 tree_mod_log_set_node_key(fs_info, parent,
2211 pslot + 1, 0);
2212 btrfs_set_node_key(parent, &disk_key, pslot + 1);
2213 btrfs_mark_buffer_dirty(parent);
2214
2215 if (btrfs_header_nritems(mid) <= orig_slot) {
2216 path->nodes[level] = right;
2217 path->slots[level + 1] += 1;
2218 path->slots[level] = orig_slot -
2219 btrfs_header_nritems(mid);
2220 btrfs_tree_unlock(mid);
2221 free_extent_buffer(mid);
2222 } else {
2223 btrfs_tree_unlock(right);
2224 free_extent_buffer(right);
2225 }
2226 return 0;
2227 }
2228 btrfs_tree_unlock(right);
2229 free_extent_buffer(right);
2230 }
2231 return 1;
2232}
2233
2234
2235
2236
2237
2238static void reada_for_search(struct btrfs_fs_info *fs_info,
2239 struct btrfs_path *path,
2240 int level, int slot, u64 objectid)
2241{
2242 struct extent_buffer *node;
2243 struct btrfs_disk_key disk_key;
2244 u32 nritems;
2245 u64 search;
2246 u64 target;
2247 u64 nread = 0;
2248 struct extent_buffer *eb;
2249 u32 nr;
2250 u32 blocksize;
2251 u32 nscan = 0;
2252
2253 if (level != 1)
2254 return;
2255
2256 if (!path->nodes[level])
2257 return;
2258
2259 node = path->nodes[level];
2260
2261 search = btrfs_node_blockptr(node, slot);
2262 blocksize = fs_info->nodesize;
2263 eb = find_extent_buffer(fs_info, search);
2264 if (eb) {
2265 free_extent_buffer(eb);
2266 return;
2267 }
2268
2269 target = search;
2270
2271 nritems = btrfs_header_nritems(node);
2272 nr = slot;
2273
2274 while (1) {
2275 if (path->reada == READA_BACK) {
2276 if (nr == 0)
2277 break;
2278 nr--;
2279 } else if (path->reada == READA_FORWARD) {
2280 nr++;
2281 if (nr >= nritems)
2282 break;
2283 }
2284 if (path->reada == READA_BACK && objectid) {
2285 btrfs_node_key(node, &disk_key, nr);
2286 if (btrfs_disk_key_objectid(&disk_key) != objectid)
2287 break;
2288 }
2289 search = btrfs_node_blockptr(node, nr);
2290 if ((search <= target && target - search <= 65536) ||
2291 (search > target && search - target <= 65536)) {
2292 readahead_tree_block(fs_info, search);
2293 nread += blocksize;
2294 }
2295 nscan++;
2296 if ((nread > 65536 || nscan > 32))
2297 break;
2298 }
2299}
2300
2301static noinline void reada_for_balance(struct btrfs_fs_info *fs_info,
2302 struct btrfs_path *path, int level)
2303{
2304 int slot;
2305 int nritems;
2306 struct extent_buffer *parent;
2307 struct extent_buffer *eb;
2308 u64 gen;
2309 u64 block1 = 0;
2310 u64 block2 = 0;
2311
2312 parent = path->nodes[level + 1];
2313 if (!parent)
2314 return;
2315
2316 nritems = btrfs_header_nritems(parent);
2317 slot = path->slots[level + 1];
2318
2319 if (slot > 0) {
2320 block1 = btrfs_node_blockptr(parent, slot - 1);
2321 gen = btrfs_node_ptr_generation(parent, slot - 1);
2322 eb = find_extent_buffer(fs_info, block1);
2323
2324
2325
2326
2327
2328 if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)
2329 block1 = 0;
2330 free_extent_buffer(eb);
2331 }
2332 if (slot + 1 < nritems) {
2333 block2 = btrfs_node_blockptr(parent, slot + 1);
2334 gen = btrfs_node_ptr_generation(parent, slot + 1);
2335 eb = find_extent_buffer(fs_info, block2);
2336 if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)
2337 block2 = 0;
2338 free_extent_buffer(eb);
2339 }
2340
2341 if (block1)
2342 readahead_tree_block(fs_info, block1);
2343 if (block2)
2344 readahead_tree_block(fs_info, block2);
2345}
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361static noinline void unlock_up(struct btrfs_path *path, int level,
2362 int lowest_unlock, int min_write_lock_level,
2363 int *write_lock_level)
2364{
2365 int i;
2366 int skip_level = level;
2367 int no_skips = 0;
2368 struct extent_buffer *t;
2369
2370 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
2371 if (!path->nodes[i])
2372 break;
2373 if (!path->locks[i])
2374 break;
2375 if (!no_skips && path->slots[i] == 0) {
2376 skip_level = i + 1;
2377 continue;
2378 }
2379 if (!no_skips && path->keep_locks) {
2380 u32 nritems;
2381 t = path->nodes[i];
2382 nritems = btrfs_header_nritems(t);
2383 if (nritems < 1 || path->slots[i] >= nritems - 1) {
2384 skip_level = i + 1;
2385 continue;
2386 }
2387 }
2388 if (skip_level < i && i >= lowest_unlock)
2389 no_skips = 1;
2390
2391 t = path->nodes[i];
2392 if (i >= lowest_unlock && i > skip_level && path->locks[i]) {
2393 btrfs_tree_unlock_rw(t, path->locks[i]);
2394 path->locks[i] = 0;
2395 if (write_lock_level &&
2396 i > min_write_lock_level &&
2397 i <= *write_lock_level) {
2398 *write_lock_level = i - 1;
2399 }
2400 }
2401 }
2402}
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413noinline void btrfs_unlock_up_safe(struct btrfs_path *path, int level)
2414{
2415 int i;
2416
2417 if (path->keep_locks)
2418 return;
2419
2420 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
2421 if (!path->nodes[i])
2422 continue;
2423 if (!path->locks[i])
2424 continue;
2425 btrfs_tree_unlock_rw(path->nodes[i], path->locks[i]);
2426 path->locks[i] = 0;
2427 }
2428}
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438static int
2439read_block_for_search(struct btrfs_root *root, struct btrfs_path *p,
2440 struct extent_buffer **eb_ret, int level, int slot,
2441 const struct btrfs_key *key)
2442{
2443 struct btrfs_fs_info *fs_info = root->fs_info;
2444 u64 blocknr;
2445 u64 gen;
2446 struct extent_buffer *b = *eb_ret;
2447 struct extent_buffer *tmp;
2448 int ret;
2449
2450 blocknr = btrfs_node_blockptr(b, slot);
2451 gen = btrfs_node_ptr_generation(b, slot);
2452
2453 tmp = find_extent_buffer(fs_info, blocknr);
2454 if (tmp) {
2455
2456 if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {
2457 *eb_ret = tmp;
2458 return 0;
2459 }
2460
2461
2462
2463
2464
2465
2466
2467 btrfs_set_path_blocking(p);
2468
2469
2470 ret = btrfs_read_buffer(tmp, gen);
2471 if (!ret) {
2472 *eb_ret = tmp;
2473 return 0;
2474 }
2475 free_extent_buffer(tmp);
2476 btrfs_release_path(p);
2477 return -EIO;
2478 }
2479
2480
2481
2482
2483
2484
2485
2486
2487 btrfs_unlock_up_safe(p, level + 1);
2488 btrfs_set_path_blocking(p);
2489
2490 free_extent_buffer(tmp);
2491 if (p->reada != READA_NONE)
2492 reada_for_search(fs_info, p, level, slot, key->objectid);
2493
2494 btrfs_release_path(p);
2495
2496 ret = -EAGAIN;
2497 tmp = read_tree_block(fs_info, blocknr, 0);
2498 if (!IS_ERR(tmp)) {
2499
2500
2501
2502
2503
2504
2505 if (!btrfs_buffer_uptodate(tmp, 0, 0))
2506 ret = -EIO;
2507 free_extent_buffer(tmp);
2508 } else {
2509 ret = PTR_ERR(tmp);
2510 }
2511 return ret;
2512}
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523static int
2524setup_nodes_for_search(struct btrfs_trans_handle *trans,
2525 struct btrfs_root *root, struct btrfs_path *p,
2526 struct extent_buffer *b, int level, int ins_len,
2527 int *write_lock_level)
2528{
2529 struct btrfs_fs_info *fs_info = root->fs_info;
2530 int ret;
2531
2532 if ((p->search_for_split || ins_len > 0) && btrfs_header_nritems(b) >=
2533 BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3) {
2534 int sret;
2535
2536 if (*write_lock_level < level + 1) {
2537 *write_lock_level = level + 1;
2538 btrfs_release_path(p);
2539 goto again;
2540 }
2541
2542 btrfs_set_path_blocking(p);
2543 reada_for_balance(fs_info, p, level);
2544 sret = split_node(trans, root, p, level);
2545 btrfs_clear_path_blocking(p, NULL, 0);
2546
2547 BUG_ON(sret > 0);
2548 if (sret) {
2549 ret = sret;
2550 goto done;
2551 }
2552 b = p->nodes[level];
2553 } else if (ins_len < 0 && btrfs_header_nritems(b) <
2554 BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 2) {
2555 int sret;
2556
2557 if (*write_lock_level < level + 1) {
2558 *write_lock_level = level + 1;
2559 btrfs_release_path(p);
2560 goto again;
2561 }
2562
2563 btrfs_set_path_blocking(p);
2564 reada_for_balance(fs_info, p, level);
2565 sret = balance_level(trans, root, p, level);
2566 btrfs_clear_path_blocking(p, NULL, 0);
2567
2568 if (sret) {
2569 ret = sret;
2570 goto done;
2571 }
2572 b = p->nodes[level];
2573 if (!b) {
2574 btrfs_release_path(p);
2575 goto again;
2576 }
2577 BUG_ON(btrfs_header_nritems(b) == 1);
2578 }
2579 return 0;
2580
2581again:
2582 ret = -EAGAIN;
2583done:
2584 return ret;
2585}
2586
2587static void key_search_validate(struct extent_buffer *b,
2588 const struct btrfs_key *key,
2589 int level)
2590{
2591#ifdef CONFIG_BTRFS_ASSERT
2592 struct btrfs_disk_key disk_key;
2593
2594 btrfs_cpu_key_to_disk(&disk_key, key);
2595
2596 if (level == 0)
2597 ASSERT(!memcmp_extent_buffer(b, &disk_key,
2598 offsetof(struct btrfs_leaf, items[0].key),
2599 sizeof(disk_key)));
2600 else
2601 ASSERT(!memcmp_extent_buffer(b, &disk_key,
2602 offsetof(struct btrfs_node, ptrs[0].key),
2603 sizeof(disk_key)));
2604#endif
2605}
2606
2607static int key_search(struct extent_buffer *b, const struct btrfs_key *key,
2608 int level, int *prev_cmp, int *slot)
2609{
2610 if (*prev_cmp != 0) {
2611 *prev_cmp = bin_search(b, key, level, slot);
2612 return *prev_cmp;
2613 }
2614
2615 key_search_validate(b, key, level);
2616 *slot = 0;
2617
2618 return 0;
2619}
2620
2621int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path,
2622 u64 iobjectid, u64 ioff, u8 key_type,
2623 struct btrfs_key *found_key)
2624{
2625 int ret;
2626 struct btrfs_key key;
2627 struct extent_buffer *eb;
2628
2629 ASSERT(path);
2630 ASSERT(found_key);
2631
2632 key.type = key_type;
2633 key.objectid = iobjectid;
2634 key.offset = ioff;
2635
2636 ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
2637 if (ret < 0)
2638 return ret;
2639
2640 eb = path->nodes[0];
2641 if (ret && path->slots[0] >= btrfs_header_nritems(eb)) {
2642 ret = btrfs_next_leaf(fs_root, path);
2643 if (ret)
2644 return ret;
2645 eb = path->nodes[0];
2646 }
2647
2648 btrfs_item_key_to_cpu(eb, found_key, path->slots[0]);
2649 if (found_key->type != key.type ||
2650 found_key->objectid != key.objectid)
2651 return 1;
2652
2653 return 0;
2654}
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root,
2670 const struct btrfs_key *key, struct btrfs_path *p,
2671 int ins_len, int cow)
2672{
2673 struct btrfs_fs_info *fs_info = root->fs_info;
2674 struct extent_buffer *b;
2675 int slot;
2676 int ret;
2677 int err;
2678 int level;
2679 int lowest_unlock = 1;
2680 int root_lock;
2681
2682 int write_lock_level = 0;
2683 u8 lowest_level = 0;
2684 int min_write_lock_level;
2685 int prev_cmp;
2686
2687 lowest_level = p->lowest_level;
2688 WARN_ON(lowest_level && ins_len > 0);
2689 WARN_ON(p->nodes[0] != NULL);
2690 BUG_ON(!cow && ins_len);
2691
2692 if (ins_len < 0) {
2693 lowest_unlock = 2;
2694
2695
2696
2697
2698
2699 write_lock_level = 2;
2700 } else if (ins_len > 0) {
2701
2702
2703
2704
2705 write_lock_level = 1;
2706 }
2707
2708 if (!cow)
2709 write_lock_level = -1;
2710
2711 if (cow && (p->keep_locks || p->lowest_level))
2712 write_lock_level = BTRFS_MAX_LEVEL;
2713
2714 min_write_lock_level = write_lock_level;
2715
2716again:
2717 prev_cmp = -1;
2718
2719
2720
2721 root_lock = BTRFS_READ_LOCK;
2722 level = 0;
2723 if (p->search_commit_root) {
2724
2725
2726
2727
2728 if (p->need_commit_sem)
2729 down_read(&fs_info->commit_root_sem);
2730 b = root->commit_root;
2731 extent_buffer_get(b);
2732 level = btrfs_header_level(b);
2733 if (p->need_commit_sem)
2734 up_read(&fs_info->commit_root_sem);
2735 if (!p->skip_locking)
2736 btrfs_tree_read_lock(b);
2737 } else {
2738 if (p->skip_locking) {
2739 b = btrfs_root_node(root);
2740 level = btrfs_header_level(b);
2741 } else {
2742
2743
2744
2745 b = btrfs_read_lock_root_node(root);
2746 level = btrfs_header_level(b);
2747 if (level <= write_lock_level) {
2748
2749 btrfs_tree_read_unlock(b);
2750 free_extent_buffer(b);
2751 b = btrfs_lock_root_node(root);
2752 root_lock = BTRFS_WRITE_LOCK;
2753
2754
2755 level = btrfs_header_level(b);
2756 }
2757 }
2758 }
2759 p->nodes[level] = b;
2760 if (!p->skip_locking)
2761 p->locks[level] = root_lock;
2762
2763 while (b) {
2764 level = btrfs_header_level(b);
2765
2766
2767
2768
2769
2770 if (cow) {
2771
2772
2773
2774
2775
2776 if (!should_cow_block(trans, root, b)) {
2777 trans->dirty = true;
2778 goto cow_done;
2779 }
2780
2781
2782
2783
2784
2785 if (level > write_lock_level ||
2786 (level + 1 > write_lock_level &&
2787 level + 1 < BTRFS_MAX_LEVEL &&
2788 p->nodes[level + 1])) {
2789 write_lock_level = level + 1;
2790 btrfs_release_path(p);
2791 goto again;
2792 }
2793
2794 btrfs_set_path_blocking(p);
2795 err = btrfs_cow_block(trans, root, b,
2796 p->nodes[level + 1],
2797 p->slots[level + 1], &b);
2798 if (err) {
2799 ret = err;
2800 goto done;
2801 }
2802 }
2803cow_done:
2804 p->nodes[level] = b;
2805 btrfs_clear_path_blocking(p, NULL, 0);
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818 if (!ins_len && !p->keep_locks) {
2819 int u = level + 1;
2820
2821 if (u < BTRFS_MAX_LEVEL && p->locks[u]) {
2822 btrfs_tree_unlock_rw(p->nodes[u], p->locks[u]);
2823 p->locks[u] = 0;
2824 }
2825 }
2826
2827 ret = key_search(b, key, level, &prev_cmp, &slot);
2828 if (ret < 0)
2829 goto done;
2830
2831 if (level != 0) {
2832 int dec = 0;
2833 if (ret && slot > 0) {
2834 dec = 1;
2835 slot -= 1;
2836 }
2837 p->slots[level] = slot;
2838 err = setup_nodes_for_search(trans, root, p, b, level,
2839 ins_len, &write_lock_level);
2840 if (err == -EAGAIN)
2841 goto again;
2842 if (err) {
2843 ret = err;
2844 goto done;
2845 }
2846 b = p->nodes[level];
2847 slot = p->slots[level];
2848
2849
2850
2851
2852
2853
2854
2855 if (slot == 0 && ins_len &&
2856 write_lock_level < level + 1) {
2857 write_lock_level = level + 1;
2858 btrfs_release_path(p);
2859 goto again;
2860 }
2861
2862 unlock_up(p, level, lowest_unlock,
2863 min_write_lock_level, &write_lock_level);
2864
2865 if (level == lowest_level) {
2866 if (dec)
2867 p->slots[level]++;
2868 goto done;
2869 }
2870
2871 err = read_block_for_search(root, p, &b, level,
2872 slot, key);
2873 if (err == -EAGAIN)
2874 goto again;
2875 if (err) {
2876 ret = err;
2877 goto done;
2878 }
2879
2880 if (!p->skip_locking) {
2881 level = btrfs_header_level(b);
2882 if (level <= write_lock_level) {
2883 err = btrfs_try_tree_write_lock(b);
2884 if (!err) {
2885 btrfs_set_path_blocking(p);
2886 btrfs_tree_lock(b);
2887 btrfs_clear_path_blocking(p, b,
2888 BTRFS_WRITE_LOCK);
2889 }
2890 p->locks[level] = BTRFS_WRITE_LOCK;
2891 } else {
2892 err = btrfs_tree_read_lock_atomic(b);
2893 if (!err) {
2894 btrfs_set_path_blocking(p);
2895 btrfs_tree_read_lock(b);
2896 btrfs_clear_path_blocking(p, b,
2897 BTRFS_READ_LOCK);
2898 }
2899 p->locks[level] = BTRFS_READ_LOCK;
2900 }
2901 p->nodes[level] = b;
2902 }
2903 } else {
2904 p->slots[level] = slot;
2905 if (ins_len > 0 &&
2906 btrfs_leaf_free_space(fs_info, b) < ins_len) {
2907 if (write_lock_level < 1) {
2908 write_lock_level = 1;
2909 btrfs_release_path(p);
2910 goto again;
2911 }
2912
2913 btrfs_set_path_blocking(p);
2914 err = split_leaf(trans, root, key,
2915 p, ins_len, ret == 0);
2916 btrfs_clear_path_blocking(p, NULL, 0);
2917
2918 BUG_ON(err > 0);
2919 if (err) {
2920 ret = err;
2921 goto done;
2922 }
2923 }
2924 if (!p->search_for_split)
2925 unlock_up(p, level, lowest_unlock,
2926 min_write_lock_level, &write_lock_level);
2927 goto done;
2928 }
2929 }
2930 ret = 1;
2931done:
2932
2933
2934
2935
2936 if (!p->leave_spinning)
2937 btrfs_set_path_blocking(p);
2938 if (ret < 0 && !p->skip_release_on_error)
2939 btrfs_release_path(p);
2940 return ret;
2941}
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key,
2955 struct btrfs_path *p, u64 time_seq)
2956{
2957 struct btrfs_fs_info *fs_info = root->fs_info;
2958 struct extent_buffer *b;
2959 int slot;
2960 int ret;
2961 int err;
2962 int level;
2963 int lowest_unlock = 1;
2964 u8 lowest_level = 0;
2965 int prev_cmp = -1;
2966
2967 lowest_level = p->lowest_level;
2968 WARN_ON(p->nodes[0] != NULL);
2969
2970 if (p->search_commit_root) {
2971 BUG_ON(time_seq);
2972 return btrfs_search_slot(NULL, root, key, p, 0, 0);
2973 }
2974
2975again:
2976 b = get_old_root(root, time_seq);
2977 level = btrfs_header_level(b);
2978 p->locks[level] = BTRFS_READ_LOCK;
2979
2980 while (b) {
2981 level = btrfs_header_level(b);
2982 p->nodes[level] = b;
2983 btrfs_clear_path_blocking(p, NULL, 0);
2984
2985
2986
2987
2988
2989
2990
2991 btrfs_unlock_up_safe(p, level + 1);
2992
2993
2994
2995
2996
2997 prev_cmp = -1;
2998 ret = key_search(b, key, level, &prev_cmp, &slot);
2999
3000 if (level != 0) {
3001 int dec = 0;
3002 if (ret && slot > 0) {
3003 dec = 1;
3004 slot -= 1;
3005 }
3006 p->slots[level] = slot;
3007 unlock_up(p, level, lowest_unlock, 0, NULL);
3008
3009 if (level == lowest_level) {
3010 if (dec)
3011 p->slots[level]++;
3012 goto done;
3013 }
3014
3015 err = read_block_for_search(root, p, &b, level,
3016 slot, key);
3017 if (err == -EAGAIN)
3018 goto again;
3019 if (err) {
3020 ret = err;
3021 goto done;
3022 }
3023
3024 level = btrfs_header_level(b);
3025 err = btrfs_tree_read_lock_atomic(b);
3026 if (!err) {
3027 btrfs_set_path_blocking(p);
3028 btrfs_tree_read_lock(b);
3029 btrfs_clear_path_blocking(p, b,
3030 BTRFS_READ_LOCK);
3031 }
3032 b = tree_mod_log_rewind(fs_info, p, b, time_seq);
3033 if (!b) {
3034 ret = -ENOMEM;
3035 goto done;
3036 }
3037 p->locks[level] = BTRFS_READ_LOCK;
3038 p->nodes[level] = b;
3039 } else {
3040 p->slots[level] = slot;
3041 unlock_up(p, level, lowest_unlock, 0, NULL);
3042 goto done;
3043 }
3044 }
3045 ret = 1;
3046done:
3047 if (!p->leave_spinning)
3048 btrfs_set_path_blocking(p);
3049 if (ret < 0)
3050 btrfs_release_path(p);
3051
3052 return ret;
3053}
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067int btrfs_search_slot_for_read(struct btrfs_root *root,
3068 const struct btrfs_key *key,
3069 struct btrfs_path *p, int find_higher,
3070 int return_any)
3071{
3072 int ret;
3073 struct extent_buffer *leaf;
3074
3075again:
3076 ret = btrfs_search_slot(NULL, root, key, p, 0, 0);
3077 if (ret <= 0)
3078 return ret;
3079
3080
3081
3082
3083
3084
3085
3086 leaf = p->nodes[0];
3087
3088 if (find_higher) {
3089 if (p->slots[0] >= btrfs_header_nritems(leaf)) {
3090 ret = btrfs_next_leaf(root, p);
3091 if (ret <= 0)
3092 return ret;
3093 if (!return_any)
3094 return 1;
3095
3096
3097
3098
3099 return_any = 0;
3100 find_higher = 0;
3101 btrfs_release_path(p);
3102 goto again;
3103 }
3104 } else {
3105 if (p->slots[0] == 0) {
3106 ret = btrfs_prev_leaf(root, p);
3107 if (ret < 0)
3108 return ret;
3109 if (!ret) {
3110 leaf = p->nodes[0];
3111 if (p->slots[0] == btrfs_header_nritems(leaf))
3112 p->slots[0]--;
3113 return 0;
3114 }
3115 if (!return_any)
3116 return 1;
3117
3118
3119
3120
3121 return_any = 0;
3122 find_higher = 1;
3123 btrfs_release_path(p);
3124 goto again;
3125 } else {
3126 --p->slots[0];
3127 }
3128 }
3129 return 0;
3130}
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140static void fixup_low_keys(struct btrfs_fs_info *fs_info,
3141 struct btrfs_path *path,
3142 struct btrfs_disk_key *key, int level)
3143{
3144 int i;
3145 struct extent_buffer *t;
3146
3147 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
3148 int tslot = path->slots[i];
3149 if (!path->nodes[i])
3150 break;
3151 t = path->nodes[i];
3152 tree_mod_log_set_node_key(fs_info, t, tslot, 1);
3153 btrfs_set_node_key(t, key, tslot);
3154 btrfs_mark_buffer_dirty(path->nodes[i]);
3155 if (tslot != 0)
3156 break;
3157 }
3158}
3159
3160
3161
3162
3163
3164
3165
3166void btrfs_set_item_key_safe(struct btrfs_fs_info *fs_info,
3167 struct btrfs_path *path,
3168 const struct btrfs_key *new_key)
3169{
3170 struct btrfs_disk_key disk_key;
3171 struct extent_buffer *eb;
3172 int slot;
3173
3174 eb = path->nodes[0];
3175 slot = path->slots[0];
3176 if (slot > 0) {
3177 btrfs_item_key(eb, &disk_key, slot - 1);
3178 BUG_ON(comp_keys(&disk_key, new_key) >= 0);
3179 }
3180 if (slot < btrfs_header_nritems(eb) - 1) {
3181 btrfs_item_key(eb, &disk_key, slot + 1);
3182 BUG_ON(comp_keys(&disk_key, new_key) <= 0);
3183 }
3184
3185 btrfs_cpu_key_to_disk(&disk_key, new_key);
3186 btrfs_set_item_key(eb, &disk_key, slot);
3187 btrfs_mark_buffer_dirty(eb);
3188 if (slot == 0)
3189 fixup_low_keys(fs_info, path, &disk_key, 1);
3190}
3191
3192
3193
3194
3195
3196
3197
3198
3199static int push_node_left(struct btrfs_trans_handle *trans,
3200 struct btrfs_fs_info *fs_info,
3201 struct extent_buffer *dst,
3202 struct extent_buffer *src, int empty)
3203{
3204 int push_items = 0;
3205 int src_nritems;
3206 int dst_nritems;
3207 int ret = 0;
3208
3209 src_nritems = btrfs_header_nritems(src);
3210 dst_nritems = btrfs_header_nritems(dst);
3211 push_items = BTRFS_NODEPTRS_PER_BLOCK(fs_info) - dst_nritems;
3212 WARN_ON(btrfs_header_generation(src) != trans->transid);
3213 WARN_ON(btrfs_header_generation(dst) != trans->transid);
3214
3215 if (!empty && src_nritems <= 8)
3216 return 1;
3217
3218 if (push_items <= 0)
3219 return 1;
3220
3221 if (empty) {
3222 push_items = min(src_nritems, push_items);
3223 if (push_items < src_nritems) {
3224
3225
3226
3227 if (src_nritems - push_items < 8) {
3228 if (push_items <= 8)
3229 return 1;
3230 push_items -= 8;
3231 }
3232 }
3233 } else
3234 push_items = min(src_nritems - 8, push_items);
3235
3236 ret = tree_mod_log_eb_copy(fs_info, dst, src, dst_nritems, 0,
3237 push_items);
3238 if (ret) {
3239 btrfs_abort_transaction(trans, ret);
3240 return ret;
3241 }
3242 copy_extent_buffer(dst, src,
3243 btrfs_node_key_ptr_offset(dst_nritems),
3244 btrfs_node_key_ptr_offset(0),
3245 push_items * sizeof(struct btrfs_key_ptr));
3246
3247 if (push_items < src_nritems) {
3248
3249
3250
3251
3252 memmove_extent_buffer(src, btrfs_node_key_ptr_offset(0),
3253 btrfs_node_key_ptr_offset(push_items),
3254 (src_nritems - push_items) *
3255 sizeof(struct btrfs_key_ptr));
3256 }
3257 btrfs_set_header_nritems(src, src_nritems - push_items);
3258 btrfs_set_header_nritems(dst, dst_nritems + push_items);
3259 btrfs_mark_buffer_dirty(src);
3260 btrfs_mark_buffer_dirty(dst);
3261
3262 return ret;
3263}
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274static int balance_node_right(struct btrfs_trans_handle *trans,
3275 struct btrfs_fs_info *fs_info,
3276 struct extent_buffer *dst,
3277 struct extent_buffer *src)
3278{
3279 int push_items = 0;
3280 int max_push;
3281 int src_nritems;
3282 int dst_nritems;
3283 int ret = 0;
3284
3285 WARN_ON(btrfs_header_generation(src) != trans->transid);
3286 WARN_ON(btrfs_header_generation(dst) != trans->transid);
3287
3288 src_nritems = btrfs_header_nritems(src);
3289 dst_nritems = btrfs_header_nritems(dst);
3290 push_items = BTRFS_NODEPTRS_PER_BLOCK(fs_info) - dst_nritems;
3291 if (push_items <= 0)
3292 return 1;
3293
3294 if (src_nritems < 4)
3295 return 1;
3296
3297 max_push = src_nritems / 2 + 1;
3298
3299 if (max_push >= src_nritems)
3300 return 1;
3301
3302 if (max_push < push_items)
3303 push_items = max_push;
3304
3305 tree_mod_log_eb_move(fs_info, dst, push_items, 0, dst_nritems);
3306 memmove_extent_buffer(dst, btrfs_node_key_ptr_offset(push_items),
3307 btrfs_node_key_ptr_offset(0),
3308 (dst_nritems) *
3309 sizeof(struct btrfs_key_ptr));
3310
3311 ret = tree_mod_log_eb_copy(fs_info, dst, src, 0,
3312 src_nritems - push_items, push_items);
3313 if (ret) {
3314 btrfs_abort_transaction(trans, ret);
3315 return ret;
3316 }
3317 copy_extent_buffer(dst, src,
3318 btrfs_node_key_ptr_offset(0),
3319 btrfs_node_key_ptr_offset(src_nritems - push_items),
3320 push_items * sizeof(struct btrfs_key_ptr));
3321
3322 btrfs_set_header_nritems(src, src_nritems - push_items);
3323 btrfs_set_header_nritems(dst, dst_nritems + push_items);
3324
3325 btrfs_mark_buffer_dirty(src);
3326 btrfs_mark_buffer_dirty(dst);
3327
3328 return ret;
3329}
3330
3331
3332
3333
3334
3335
3336
3337
3338static noinline int insert_new_root(struct btrfs_trans_handle *trans,
3339 struct btrfs_root *root,
3340 struct btrfs_path *path, int level)
3341{
3342 struct btrfs_fs_info *fs_info = root->fs_info;
3343 u64 lower_gen;
3344 struct extent_buffer *lower;
3345 struct extent_buffer *c;
3346 struct extent_buffer *old;
3347 struct btrfs_disk_key lower_key;
3348
3349 BUG_ON(path->nodes[level]);
3350 BUG_ON(path->nodes[level-1] != root->node);
3351
3352 lower = path->nodes[level-1];
3353 if (level == 1)
3354 btrfs_item_key(lower, &lower_key, 0);
3355 else
3356 btrfs_node_key(lower, &lower_key, 0);
3357
3358 c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
3359 &lower_key, level, root->node->start, 0);
3360 if (IS_ERR(c))
3361 return PTR_ERR(c);
3362
3363 root_add_used(root, fs_info->nodesize);
3364
3365 memzero_extent_buffer(c, 0, sizeof(struct btrfs_header));
3366 btrfs_set_header_nritems(c, 1);
3367 btrfs_set_header_level(c, level);
3368 btrfs_set_header_bytenr(c, c->start);
3369 btrfs_set_header_generation(c, trans->transid);
3370 btrfs_set_header_backref_rev(c, BTRFS_MIXED_BACKREF_REV);
3371 btrfs_set_header_owner(c, root->root_key.objectid);
3372
3373 write_extent_buffer_fsid(c, fs_info->fsid);
3374 write_extent_buffer_chunk_tree_uuid(c, fs_info->chunk_tree_uuid);
3375
3376 btrfs_set_node_key(c, &lower_key, 0);
3377 btrfs_set_node_blockptr(c, 0, lower->start);
3378 lower_gen = btrfs_header_generation(lower);
3379 WARN_ON(lower_gen != trans->transid);
3380
3381 btrfs_set_node_ptr_generation(c, 0, lower_gen);
3382
3383 btrfs_mark_buffer_dirty(c);
3384
3385 old = root->node;
3386 tree_mod_log_set_root_pointer(root, c, 0);
3387 rcu_assign_pointer(root->node, c);
3388
3389
3390 free_extent_buffer(old);
3391
3392 add_root_to_dirty_list(root);
3393 extent_buffer_get(c);
3394 path->nodes[level] = c;
3395 path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
3396 path->slots[level] = 0;
3397 return 0;
3398}
3399
3400
3401
3402
3403
3404
3405
3406
3407static void insert_ptr(struct btrfs_trans_handle *trans,
3408 struct btrfs_fs_info *fs_info, struct btrfs_path *path,
3409 struct btrfs_disk_key *key, u64 bytenr,
3410 int slot, int level)
3411{
3412 struct extent_buffer *lower;
3413 int nritems;
3414 int ret;
3415
3416 BUG_ON(!path->nodes[level]);
3417 btrfs_assert_tree_locked(path->nodes[level]);
3418 lower = path->nodes[level];
3419 nritems = btrfs_header_nritems(lower);
3420 BUG_ON(slot > nritems);
3421 BUG_ON(nritems == BTRFS_NODEPTRS_PER_BLOCK(fs_info));
3422 if (slot != nritems) {
3423 if (level)
3424 tree_mod_log_eb_move(fs_info, lower, slot + 1,
3425 slot, nritems - slot);
3426 memmove_extent_buffer(lower,
3427 btrfs_node_key_ptr_offset(slot + 1),
3428 btrfs_node_key_ptr_offset(slot),
3429 (nritems - slot) * sizeof(struct btrfs_key_ptr));
3430 }
3431 if (level) {
3432 ret = tree_mod_log_insert_key(fs_info, lower, slot,
3433 MOD_LOG_KEY_ADD, GFP_NOFS);
3434 BUG_ON(ret < 0);
3435 }
3436 btrfs_set_node_key(lower, key, slot);
3437 btrfs_set_node_blockptr(lower, slot, bytenr);
3438 WARN_ON(trans->transid == 0);
3439 btrfs_set_node_ptr_generation(lower, slot, trans->transid);
3440 btrfs_set_header_nritems(lower, nritems + 1);
3441 btrfs_mark_buffer_dirty(lower);
3442}
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453static noinline int split_node(struct btrfs_trans_handle *trans,
3454 struct btrfs_root *root,
3455 struct btrfs_path *path, int level)
3456{
3457 struct btrfs_fs_info *fs_info = root->fs_info;
3458 struct extent_buffer *c;
3459 struct extent_buffer *split;
3460 struct btrfs_disk_key disk_key;
3461 int mid;
3462 int ret;
3463 u32 c_nritems;
3464
3465 c = path->nodes[level];
3466 WARN_ON(btrfs_header_generation(c) != trans->transid);
3467 if (c == root->node) {
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478 ret = insert_new_root(trans, root, path, level + 1);
3479 if (ret)
3480 return ret;
3481 } else {
3482 ret = push_nodes_for_insert(trans, root, path, level);
3483 c = path->nodes[level];
3484 if (!ret && btrfs_header_nritems(c) <
3485 BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3)
3486 return 0;
3487 if (ret < 0)
3488 return ret;
3489 }
3490
3491 c_nritems = btrfs_header_nritems(c);
3492 mid = (c_nritems + 1) / 2;
3493 btrfs_node_key(c, &disk_key, mid);
3494
3495 split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
3496 &disk_key, level, c->start, 0);
3497 if (IS_ERR(split))
3498 return PTR_ERR(split);
3499
3500 root_add_used(root, fs_info->nodesize);
3501
3502 memzero_extent_buffer(split, 0, sizeof(struct btrfs_header));
3503 btrfs_set_header_level(split, btrfs_header_level(c));
3504 btrfs_set_header_bytenr(split, split->start);
3505 btrfs_set_header_generation(split, trans->transid);
3506 btrfs_set_header_backref_rev(split, BTRFS_MIXED_BACKREF_REV);
3507 btrfs_set_header_owner(split, root->root_key.objectid);
3508 write_extent_buffer_fsid(split, fs_info->fsid);
3509 write_extent_buffer_chunk_tree_uuid(split, fs_info->chunk_tree_uuid);
3510
3511 ret = tree_mod_log_eb_copy(fs_info, split, c, 0, mid, c_nritems - mid);
3512 if (ret) {
3513 btrfs_abort_transaction(trans, ret);
3514 return ret;
3515 }
3516 copy_extent_buffer(split, c,
3517 btrfs_node_key_ptr_offset(0),
3518 btrfs_node_key_ptr_offset(mid),
3519 (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
3520 btrfs_set_header_nritems(split, c_nritems - mid);
3521 btrfs_set_header_nritems(c, mid);
3522 ret = 0;
3523
3524 btrfs_mark_buffer_dirty(c);
3525 btrfs_mark_buffer_dirty(split);
3526
3527 insert_ptr(trans, fs_info, path, &disk_key, split->start,
3528 path->slots[level + 1] + 1, level + 1);
3529
3530 if (path->slots[level] >= mid) {
3531 path->slots[level] -= mid;
3532 btrfs_tree_unlock(c);
3533 free_extent_buffer(c);
3534 path->nodes[level] = split;
3535 path->slots[level + 1] += 1;
3536 } else {
3537 btrfs_tree_unlock(split);
3538 free_extent_buffer(split);
3539 }
3540 return ret;
3541}
3542
3543
3544
3545
3546
3547
3548static int leaf_space_used(struct extent_buffer *l, int start, int nr)
3549{
3550 struct btrfs_item *start_item;
3551 struct btrfs_item *end_item;
3552 struct btrfs_map_token token;
3553 int data_len;
3554 int nritems = btrfs_header_nritems(l);
3555 int end = min(nritems, start + nr) - 1;
3556
3557 if (!nr)
3558 return 0;
3559 btrfs_init_map_token(&token);
3560 start_item = btrfs_item_nr(start);
3561 end_item = btrfs_item_nr(end);
3562 data_len = btrfs_token_item_offset(l, start_item, &token) +
3563 btrfs_token_item_size(l, start_item, &token);
3564 data_len = data_len - btrfs_token_item_offset(l, end_item, &token);
3565 data_len += sizeof(struct btrfs_item) * nr;
3566 WARN_ON(data_len < 0);
3567 return data_len;
3568}
3569
3570
3571
3572
3573
3574
3575noinline int btrfs_leaf_free_space(struct btrfs_fs_info *fs_info,
3576 struct extent_buffer *leaf)
3577{
3578 int nritems = btrfs_header_nritems(leaf);
3579 int ret;
3580
3581 ret = BTRFS_LEAF_DATA_SIZE(fs_info) - leaf_space_used(leaf, 0, nritems);
3582 if (ret < 0) {
3583 btrfs_crit(fs_info,
3584 "leaf free space ret %d, leaf data size %lu, used %d nritems %d",
3585 ret,
3586 (unsigned long) BTRFS_LEAF_DATA_SIZE(fs_info),
3587 leaf_space_used(leaf, 0, nritems), nritems);
3588 }
3589 return ret;
3590}
3591
3592
3593
3594
3595
3596static noinline int __push_leaf_right(struct btrfs_fs_info *fs_info,
3597 struct btrfs_path *path,
3598 int data_size, int empty,
3599 struct extent_buffer *right,
3600 int free_space, u32 left_nritems,
3601 u32 min_slot)
3602{
3603 struct extent_buffer *left = path->nodes[0];
3604 struct extent_buffer *upper = path->nodes[1];
3605 struct btrfs_map_token token;
3606 struct btrfs_disk_key disk_key;
3607 int slot;
3608 u32 i;
3609 int push_space = 0;
3610 int push_items = 0;
3611 struct btrfs_item *item;
3612 u32 nr;
3613 u32 right_nritems;
3614 u32 data_end;
3615 u32 this_item_size;
3616
3617 btrfs_init_map_token(&token);
3618
3619 if (empty)
3620 nr = 0;
3621 else
3622 nr = max_t(u32, 1, min_slot);
3623
3624 if (path->slots[0] >= left_nritems)
3625 push_space += data_size;
3626
3627 slot = path->slots[1];
3628 i = left_nritems - 1;
3629 while (i >= nr) {
3630 item = btrfs_item_nr(i);
3631
3632 if (!empty && push_items > 0) {
3633 if (path->slots[0] > i)
3634 break;
3635 if (path->slots[0] == i) {
3636 int space = btrfs_leaf_free_space(fs_info, left);
3637 if (space + push_space * 2 > free_space)
3638 break;
3639 }
3640 }
3641
3642 if (path->slots[0] == i)
3643 push_space += data_size;
3644
3645 this_item_size = btrfs_item_size(left, item);
3646 if (this_item_size + sizeof(*item) + push_space > free_space)
3647 break;
3648
3649 push_items++;
3650 push_space += this_item_size + sizeof(*item);
3651 if (i == 0)
3652 break;
3653 i--;
3654 }
3655
3656 if (push_items == 0)
3657 goto out_unlock;
3658
3659 WARN_ON(!empty && push_items == left_nritems);
3660
3661
3662 right_nritems = btrfs_header_nritems(right);
3663
3664 push_space = btrfs_item_end_nr(left, left_nritems - push_items);
3665 push_space -= leaf_data_end(fs_info, left);
3666
3667
3668 data_end = leaf_data_end(fs_info, right);
3669 memmove_extent_buffer(right,
3670 BTRFS_LEAF_DATA_OFFSET + data_end - push_space,
3671 BTRFS_LEAF_DATA_OFFSET + data_end,
3672 BTRFS_LEAF_DATA_SIZE(fs_info) - data_end);
3673
3674
3675 copy_extent_buffer(right, left, BTRFS_LEAF_DATA_OFFSET +
3676 BTRFS_LEAF_DATA_SIZE(fs_info) - push_space,
3677 BTRFS_LEAF_DATA_OFFSET + leaf_data_end(fs_info, left),
3678 push_space);
3679
3680 memmove_extent_buffer(right, btrfs_item_nr_offset(push_items),
3681 btrfs_item_nr_offset(0),
3682 right_nritems * sizeof(struct btrfs_item));
3683
3684
3685 copy_extent_buffer(right, left, btrfs_item_nr_offset(0),
3686 btrfs_item_nr_offset(left_nritems - push_items),
3687 push_items * sizeof(struct btrfs_item));
3688
3689
3690 right_nritems += push_items;
3691 btrfs_set_header_nritems(right, right_nritems);
3692 push_space = BTRFS_LEAF_DATA_SIZE(fs_info);
3693 for (i = 0; i < right_nritems; i++) {
3694 item = btrfs_item_nr(i);
3695 push_space -= btrfs_token_item_size(right, item, &token);
3696 btrfs_set_token_item_offset(right, item, push_space, &token);
3697 }
3698
3699 left_nritems -= push_items;
3700 btrfs_set_header_nritems(left, left_nritems);
3701
3702 if (left_nritems)
3703 btrfs_mark_buffer_dirty(left);
3704 else
3705 clean_tree_block(fs_info, left);
3706
3707 btrfs_mark_buffer_dirty(right);
3708
3709 btrfs_item_key(right, &disk_key, 0);
3710 btrfs_set_node_key(upper, &disk_key, slot + 1);
3711 btrfs_mark_buffer_dirty(upper);
3712
3713
3714 if (path->slots[0] >= left_nritems) {
3715 path->slots[0] -= left_nritems;
3716 if (btrfs_header_nritems(path->nodes[0]) == 0)
3717 clean_tree_block(fs_info, path->nodes[0]);
3718 btrfs_tree_unlock(path->nodes[0]);
3719 free_extent_buffer(path->nodes[0]);
3720 path->nodes[0] = right;
3721 path->slots[1] += 1;
3722 } else {
3723 btrfs_tree_unlock(right);
3724 free_extent_buffer(right);
3725 }
3726 return 0;
3727
3728out_unlock:
3729 btrfs_tree_unlock(right);
3730 free_extent_buffer(right);
3731 return 1;
3732}
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
3745 *root, struct btrfs_path *path,
3746 int min_data_size, int data_size,
3747 int empty, u32 min_slot)
3748{
3749 struct btrfs_fs_info *fs_info = root->fs_info;
3750 struct extent_buffer *left = path->nodes[0];
3751 struct extent_buffer *right;
3752 struct extent_buffer *upper;
3753 int slot;
3754 int free_space;
3755 u32 left_nritems;
3756 int ret;
3757
3758 if (!path->nodes[1])
3759 return 1;
3760
3761 slot = path->slots[1];
3762 upper = path->nodes[1];
3763 if (slot >= btrfs_header_nritems(upper) - 1)
3764 return 1;
3765
3766 btrfs_assert_tree_locked(path->nodes[1]);
3767
3768 right = read_node_slot(fs_info, upper, slot + 1);
3769
3770
3771
3772
3773 if (IS_ERR(right))
3774 return 1;
3775
3776 btrfs_tree_lock(right);
3777 btrfs_set_lock_blocking(right);
3778
3779 free_space = btrfs_leaf_free_space(fs_info, right);
3780 if (free_space < data_size)
3781 goto out_unlock;
3782
3783
3784 ret = btrfs_cow_block(trans, root, right, upper,
3785 slot + 1, &right);
3786 if (ret)
3787 goto out_unlock;
3788
3789 free_space = btrfs_leaf_free_space(fs_info, right);
3790 if (free_space < data_size)
3791 goto out_unlock;
3792
3793 left_nritems = btrfs_header_nritems(left);
3794 if (left_nritems == 0)
3795 goto out_unlock;
3796
3797 if (path->slots[0] == left_nritems && !empty) {
3798
3799
3800
3801
3802 btrfs_tree_unlock(left);
3803 free_extent_buffer(left);
3804 path->nodes[0] = right;
3805 path->slots[0] = 0;
3806 path->slots[1]++;
3807 return 0;
3808 }
3809
3810 return __push_leaf_right(fs_info, path, min_data_size, empty,
3811 right, free_space, left_nritems, min_slot);
3812out_unlock:
3813 btrfs_tree_unlock(right);
3814 free_extent_buffer(right);
3815 return 1;
3816}
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826static noinline int __push_leaf_left(struct btrfs_fs_info *fs_info,
3827 struct btrfs_path *path, int data_size,
3828 int empty, struct extent_buffer *left,
3829 int free_space, u32 right_nritems,
3830 u32 max_slot)
3831{
3832 struct btrfs_disk_key disk_key;
3833 struct extent_buffer *right = path->nodes[0];
3834 int i;
3835 int push_space = 0;
3836 int push_items = 0;
3837 struct btrfs_item *item;
3838 u32 old_left_nritems;
3839 u32 nr;
3840 int ret = 0;
3841 u32 this_item_size;
3842 u32 old_left_item_size;
3843 struct btrfs_map_token token;
3844
3845 btrfs_init_map_token(&token);
3846
3847 if (empty)
3848 nr = min(right_nritems, max_slot);
3849 else
3850 nr = min(right_nritems - 1, max_slot);
3851
3852 for (i = 0; i < nr; i++) {
3853 item = btrfs_item_nr(i);
3854
3855 if (!empty && push_items > 0) {
3856 if (path->slots[0] < i)
3857 break;
3858 if (path->slots[0] == i) {
3859 int space = btrfs_leaf_free_space(fs_info, right);
3860 if (space + push_space * 2 > free_space)
3861 break;
3862 }
3863 }
3864
3865 if (path->slots[0] == i)
3866 push_space += data_size;
3867
3868 this_item_size = btrfs_item_size(right, item);
3869 if (this_item_size + sizeof(*item) + push_space > free_space)
3870 break;
3871
3872 push_items++;
3873 push_space += this_item_size + sizeof(*item);
3874 }
3875
3876 if (push_items == 0) {
3877 ret = 1;
3878 goto out;
3879 }
3880 WARN_ON(!empty && push_items == btrfs_header_nritems(right));
3881
3882
3883 copy_extent_buffer(left, right,
3884 btrfs_item_nr_offset(btrfs_header_nritems(left)),
3885 btrfs_item_nr_offset(0),
3886 push_items * sizeof(struct btrfs_item));
3887
3888 push_space = BTRFS_LEAF_DATA_SIZE(fs_info) -
3889 btrfs_item_offset_nr(right, push_items - 1);
3890
3891 copy_extent_buffer(left, right, BTRFS_LEAF_DATA_OFFSET +
3892 leaf_data_end(fs_info, left) - push_space,
3893 BTRFS_LEAF_DATA_OFFSET +
3894 btrfs_item_offset_nr(right, push_items - 1),
3895 push_space);
3896 old_left_nritems = btrfs_header_nritems(left);
3897 BUG_ON(old_left_nritems <= 0);
3898
3899 old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1);
3900 for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
3901 u32 ioff;
3902
3903 item = btrfs_item_nr(i);
3904
3905 ioff = btrfs_token_item_offset(left, item, &token);
3906 btrfs_set_token_item_offset(left, item,
3907 ioff - (BTRFS_LEAF_DATA_SIZE(fs_info) - old_left_item_size),
3908 &token);
3909 }
3910 btrfs_set_header_nritems(left, old_left_nritems + push_items);
3911
3912
3913 if (push_items > right_nritems)
3914 WARN(1, KERN_CRIT "push items %d nr %u\n", push_items,
3915 right_nritems);
3916
3917 if (push_items < right_nritems) {
3918 push_space = btrfs_item_offset_nr(right, push_items - 1) -
3919 leaf_data_end(fs_info, right);
3920 memmove_extent_buffer(right, BTRFS_LEAF_DATA_OFFSET +
3921 BTRFS_LEAF_DATA_SIZE(fs_info) - push_space,
3922 BTRFS_LEAF_DATA_OFFSET +
3923 leaf_data_end(fs_info, right), push_space);
3924
3925 memmove_extent_buffer(right, btrfs_item_nr_offset(0),
3926 btrfs_item_nr_offset(push_items),
3927 (btrfs_header_nritems(right) - push_items) *
3928 sizeof(struct btrfs_item));
3929 }
3930 right_nritems -= push_items;
3931 btrfs_set_header_nritems(right, right_nritems);
3932 push_space = BTRFS_LEAF_DATA_SIZE(fs_info);
3933 for (i = 0; i < right_nritems; i++) {
3934 item = btrfs_item_nr(i);
3935
3936 push_space = push_space - btrfs_token_item_size(right,
3937 item, &token);
3938 btrfs_set_token_item_offset(right, item, push_space, &token);
3939 }
3940
3941 btrfs_mark_buffer_dirty(left);
3942 if (right_nritems)
3943 btrfs_mark_buffer_dirty(right);
3944 else
3945 clean_tree_block(fs_info, right);
3946
3947 btrfs_item_key(right, &disk_key, 0);
3948 fixup_low_keys(fs_info, path, &disk_key, 1);
3949
3950
3951 if (path->slots[0] < push_items) {
3952 path->slots[0] += old_left_nritems;
3953 btrfs_tree_unlock(path->nodes[0]);
3954 free_extent_buffer(path->nodes[0]);
3955 path->nodes[0] = left;
3956 path->slots[1] -= 1;
3957 } else {
3958 btrfs_tree_unlock(left);
3959 free_extent_buffer(left);
3960 path->slots[0] -= push_items;
3961 }
3962 BUG_ON(path->slots[0] < 0);
3963 return ret;
3964out:
3965 btrfs_tree_unlock(left);
3966 free_extent_buffer(left);
3967 return ret;
3968}
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
3979 *root, struct btrfs_path *path, int min_data_size,
3980 int data_size, int empty, u32 max_slot)
3981{
3982 struct btrfs_fs_info *fs_info = root->fs_info;
3983 struct extent_buffer *right = path->nodes[0];
3984 struct extent_buffer *left;
3985 int slot;
3986 int free_space;
3987 u32 right_nritems;
3988 int ret = 0;
3989
3990 slot = path->slots[1];
3991 if (slot == 0)
3992 return 1;
3993 if (!path->nodes[1])
3994 return 1;
3995
3996 right_nritems = btrfs_header_nritems(right);
3997 if (right_nritems == 0)
3998 return 1;
3999
4000 btrfs_assert_tree_locked(path->nodes[1]);
4001
4002 left = read_node_slot(fs_info, path->nodes[1], slot - 1);
4003
4004
4005
4006
4007 if (IS_ERR(left))
4008 return 1;
4009
4010 btrfs_tree_lock(left);
4011 btrfs_set_lock_blocking(left);
4012
4013 free_space = btrfs_leaf_free_space(fs_info, left);
4014 if (free_space < data_size) {
4015 ret = 1;
4016 goto out;
4017 }
4018
4019
4020 ret = btrfs_cow_block(trans, root, left,
4021 path->nodes[1], slot - 1, &left);
4022 if (ret) {
4023
4024 if (ret == -ENOSPC)
4025 ret = 1;
4026 goto out;
4027 }
4028
4029 free_space = btrfs_leaf_free_space(fs_info, left);
4030 if (free_space < data_size) {
4031 ret = 1;
4032 goto out;
4033 }
4034
4035 return __push_leaf_left(fs_info, path, min_data_size,
4036 empty, left, free_space, right_nritems,
4037 max_slot);
4038out:
4039 btrfs_tree_unlock(left);
4040 free_extent_buffer(left);
4041 return ret;
4042}
4043
4044
4045
4046
4047
4048static noinline void copy_for_split(struct btrfs_trans_handle *trans,
4049 struct btrfs_fs_info *fs_info,
4050 struct btrfs_path *path,
4051 struct extent_buffer *l,
4052 struct extent_buffer *right,
4053 int slot, int mid, int nritems)
4054{
4055 int data_copy_size;
4056 int rt_data_off;
4057 int i;
4058 struct btrfs_disk_key disk_key;
4059 struct btrfs_map_token token;
4060
4061 btrfs_init_map_token(&token);
4062
4063 nritems = nritems - mid;
4064 btrfs_set_header_nritems(right, nritems);
4065 data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(fs_info, l);
4066
4067 copy_extent_buffer(right, l, btrfs_item_nr_offset(0),
4068 btrfs_item_nr_offset(mid),
4069 nritems * sizeof(struct btrfs_item));
4070
4071 copy_extent_buffer(right, l,
4072 BTRFS_LEAF_DATA_OFFSET + BTRFS_LEAF_DATA_SIZE(fs_info) -
4073 data_copy_size, BTRFS_LEAF_DATA_OFFSET +
4074 leaf_data_end(fs_info, l), data_copy_size);
4075
4076 rt_data_off = BTRFS_LEAF_DATA_SIZE(fs_info) - btrfs_item_end_nr(l, mid);
4077
4078 for (i = 0; i < nritems; i++) {
4079 struct btrfs_item *item = btrfs_item_nr(i);
4080 u32 ioff;
4081
4082 ioff = btrfs_token_item_offset(right, item, &token);
4083 btrfs_set_token_item_offset(right, item,
4084 ioff + rt_data_off, &token);
4085 }
4086
4087 btrfs_set_header_nritems(l, mid);
4088 btrfs_item_key(right, &disk_key, 0);
4089 insert_ptr(trans, fs_info, path, &disk_key, right->start,
4090 path->slots[1] + 1, 1);
4091
4092 btrfs_mark_buffer_dirty(right);
4093 btrfs_mark_buffer_dirty(l);
4094 BUG_ON(path->slots[0] != slot);
4095
4096 if (mid <= slot) {
4097 btrfs_tree_unlock(path->nodes[0]);
4098 free_extent_buffer(path->nodes[0]);
4099 path->nodes[0] = right;
4100 path->slots[0] -= mid;
4101 path->slots[1] += 1;
4102 } else {
4103 btrfs_tree_unlock(right);
4104 free_extent_buffer(right);
4105 }
4106
4107 BUG_ON(path->slots[0] < 0);
4108}
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120static noinline int push_for_double_split(struct btrfs_trans_handle *trans,
4121 struct btrfs_root *root,
4122 struct btrfs_path *path,
4123 int data_size)
4124{
4125 struct btrfs_fs_info *fs_info = root->fs_info;
4126 int ret;
4127 int progress = 0;
4128 int slot;
4129 u32 nritems;
4130 int space_needed = data_size;
4131
4132 slot = path->slots[0];
4133 if (slot < btrfs_header_nritems(path->nodes[0]))
4134 space_needed -= btrfs_leaf_free_space(fs_info, path->nodes[0]);
4135
4136
4137
4138
4139
4140 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot);
4141 if (ret < 0)
4142 return ret;
4143
4144 if (ret == 0)
4145 progress++;
4146
4147 nritems = btrfs_header_nritems(path->nodes[0]);
4148
4149
4150
4151
4152 if (path->slots[0] == 0 || path->slots[0] == nritems)
4153 return 0;
4154
4155 if (btrfs_leaf_free_space(fs_info, path->nodes[0]) >= data_size)
4156 return 0;
4157
4158
4159 slot = path->slots[0];
4160 space_needed = data_size;
4161 if (slot > 0)
4162 space_needed -= btrfs_leaf_free_space(fs_info, path->nodes[0]);
4163 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot);
4164 if (ret < 0)
4165 return ret;
4166
4167 if (ret == 0)
4168 progress++;
4169
4170 if (progress)
4171 return 0;
4172 return 1;
4173}
4174
4175
4176
4177
4178
4179
4180
4181static noinline int split_leaf(struct btrfs_trans_handle *trans,
4182 struct btrfs_root *root,
4183 const struct btrfs_key *ins_key,
4184 struct btrfs_path *path, int data_size,
4185 int extend)
4186{
4187 struct btrfs_disk_key disk_key;
4188 struct extent_buffer *l;
4189 u32 nritems;
4190 int mid;
4191 int slot;
4192 struct extent_buffer *right;
4193 struct btrfs_fs_info *fs_info = root->fs_info;
4194 int ret = 0;
4195 int wret;
4196 int split;
4197 int num_doubles = 0;
4198 int tried_avoid_double = 0;
4199
4200 l = path->nodes[0];
4201 slot = path->slots[0];
4202 if (extend && data_size + btrfs_item_size_nr(l, slot) +
4203 sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(fs_info))
4204 return -EOVERFLOW;
4205
4206
4207 if (data_size && path->nodes[1]) {
4208 int space_needed = data_size;
4209
4210 if (slot < btrfs_header_nritems(l))
4211 space_needed -= btrfs_leaf_free_space(fs_info, l);
4212
4213 wret = push_leaf_right(trans, root, path, space_needed,
4214 space_needed, 0, 0);
4215 if (wret < 0)
4216 return wret;
4217 if (wret) {
4218 space_needed = data_size;
4219 if (slot > 0)
4220 space_needed -= btrfs_leaf_free_space(fs_info,
4221 l);
4222 wret = push_leaf_left(trans, root, path, space_needed,
4223 space_needed, 0, (u32)-1);
4224 if (wret < 0)
4225 return wret;
4226 }
4227 l = path->nodes[0];
4228
4229
4230 if (btrfs_leaf_free_space(fs_info, l) >= data_size)
4231 return 0;
4232 }
4233
4234 if (!path->nodes[1]) {
4235 ret = insert_new_root(trans, root, path, 1);
4236 if (ret)
4237 return ret;
4238 }
4239again:
4240 split = 1;
4241 l = path->nodes[0];
4242 slot = path->slots[0];
4243 nritems = btrfs_header_nritems(l);
4244 mid = (nritems + 1) / 2;
4245
4246 if (mid <= slot) {
4247 if (nritems == 1 ||
4248 leaf_space_used(l, mid, nritems - mid) + data_size >
4249 BTRFS_LEAF_DATA_SIZE(fs_info)) {
4250 if (slot >= nritems) {
4251 split = 0;
4252 } else {
4253 mid = slot;
4254 if (mid != nritems &&
4255 leaf_space_used(l, mid, nritems - mid) +
4256 data_size > BTRFS_LEAF_DATA_SIZE(fs_info)) {
4257 if (data_size && !tried_avoid_double)
4258 goto push_for_double;
4259 split = 2;
4260 }
4261 }
4262 }
4263 } else {
4264 if (leaf_space_used(l, 0, mid) + data_size >
4265 BTRFS_LEAF_DATA_SIZE(fs_info)) {
4266 if (!extend && data_size && slot == 0) {
4267 split = 0;
4268 } else if ((extend || !data_size) && slot == 0) {
4269 mid = 1;
4270 } else {
4271 mid = slot;
4272 if (mid != nritems &&
4273 leaf_space_used(l, mid, nritems - mid) +
4274 data_size > BTRFS_LEAF_DATA_SIZE(fs_info)) {
4275 if (data_size && !tried_avoid_double)
4276 goto push_for_double;
4277 split = 2;
4278 }
4279 }
4280 }
4281 }
4282
4283 if (split == 0)
4284 btrfs_cpu_key_to_disk(&disk_key, ins_key);
4285 else
4286 btrfs_item_key(l, &disk_key, mid);
4287
4288 right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
4289 &disk_key, 0, l->start, 0);
4290 if (IS_ERR(right))
4291 return PTR_ERR(right);
4292
4293 root_add_used(root, fs_info->nodesize);
4294
4295 memzero_extent_buffer(right, 0, sizeof(struct btrfs_header));
4296 btrfs_set_header_bytenr(right, right->start);
4297 btrfs_set_header_generation(right, trans->transid);
4298 btrfs_set_header_backref_rev(right, BTRFS_MIXED_BACKREF_REV);
4299 btrfs_set_header_owner(right, root->root_key.objectid);
4300 btrfs_set_header_level(right, 0);
4301 write_extent_buffer_fsid(right, fs_info->fsid);
4302 write_extent_buffer_chunk_tree_uuid(right, fs_info->chunk_tree_uuid);
4303
4304 if (split == 0) {
4305 if (mid <= slot) {
4306 btrfs_set_header_nritems(right, 0);
4307 insert_ptr(trans, fs_info, path, &disk_key,
4308 right->start, path->slots[1] + 1, 1);
4309 btrfs_tree_unlock(path->nodes[0]);
4310 free_extent_buffer(path->nodes[0]);
4311 path->nodes[0] = right;
4312 path->slots[0] = 0;
4313 path->slots[1] += 1;
4314 } else {
4315 btrfs_set_header_nritems(right, 0);
4316 insert_ptr(trans, fs_info, path, &disk_key,
4317 right->start, path->slots[1], 1);
4318 btrfs_tree_unlock(path->nodes[0]);
4319 free_extent_buffer(path->nodes[0]);
4320 path->nodes[0] = right;
4321 path->slots[0] = 0;
4322 if (path->slots[1] == 0)
4323 fixup_low_keys(fs_info, path, &disk_key, 1);
4324 }
4325
4326
4327
4328
4329
4330 return ret;
4331 }
4332
4333 copy_for_split(trans, fs_info, path, l, right, slot, mid, nritems);
4334
4335 if (split == 2) {
4336 BUG_ON(num_doubles != 0);
4337 num_doubles++;
4338 goto again;
4339 }
4340
4341 return 0;
4342
4343push_for_double:
4344 push_for_double_split(trans, root, path, data_size);
4345 tried_avoid_double = 1;
4346 if (btrfs_leaf_free_space(fs_info, path->nodes[0]) >= data_size)
4347 return 0;
4348 goto again;
4349}
4350
4351static noinline int setup_leaf_for_split(struct btrfs_trans_handle *trans,
4352 struct btrfs_root *root,
4353 struct btrfs_path *path, int ins_len)
4354{
4355 struct btrfs_fs_info *fs_info = root->fs_info;
4356 struct btrfs_key key;
4357 struct extent_buffer *leaf;
4358 struct btrfs_file_extent_item *fi;
4359 u64 extent_len = 0;
4360 u32 item_size;
4361 int ret;
4362
4363 leaf = path->nodes[0];
4364 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
4365
4366 BUG_ON(key.type != BTRFS_EXTENT_DATA_KEY &&
4367 key.type != BTRFS_EXTENT_CSUM_KEY);
4368
4369 if (btrfs_leaf_free_space(fs_info, leaf) >= ins_len)
4370 return 0;
4371
4372 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
4373 if (key.type == BTRFS_EXTENT_DATA_KEY) {
4374 fi = btrfs_item_ptr(leaf, path->slots[0],
4375 struct btrfs_file_extent_item);
4376 extent_len = btrfs_file_extent_num_bytes(leaf, fi);
4377 }
4378 btrfs_release_path(path);
4379
4380 path->keep_locks = 1;
4381 path->search_for_split = 1;
4382 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
4383 path->search_for_split = 0;
4384 if (ret > 0)
4385 ret = -EAGAIN;
4386 if (ret < 0)
4387 goto err;
4388
4389 ret = -EAGAIN;
4390 leaf = path->nodes[0];
4391
4392 if (item_size != btrfs_item_size_nr(leaf, path->slots[0]))
4393 goto err;
4394
4395
4396 if (btrfs_leaf_free_space(fs_info, path->nodes[0]) >= ins_len)
4397 goto err;
4398
4399 if (key.type == BTRFS_EXTENT_DATA_KEY) {
4400 fi = btrfs_item_ptr(leaf, path->slots[0],
4401 struct btrfs_file_extent_item);
4402 if (extent_len != btrfs_file_extent_num_bytes(leaf, fi))
4403 goto err;
4404 }
4405
4406 btrfs_set_path_blocking(path);
4407 ret = split_leaf(trans, root, &key, path, ins_len, 1);
4408 if (ret)
4409 goto err;
4410
4411 path->keep_locks = 0;
4412 btrfs_unlock_up_safe(path, 1);
4413 return 0;
4414err:
4415 path->keep_locks = 0;
4416 return ret;
4417}
4418
4419static noinline int split_item(struct btrfs_fs_info *fs_info,
4420 struct btrfs_path *path,
4421 const struct btrfs_key *new_key,
4422 unsigned long split_offset)
4423{
4424 struct extent_buffer *leaf;
4425 struct btrfs_item *item;
4426 struct btrfs_item *new_item;
4427 int slot;
4428 char *buf;
4429 u32 nritems;
4430 u32 item_size;
4431 u32 orig_offset;
4432 struct btrfs_disk_key disk_key;
4433
4434 leaf = path->nodes[0];
4435 BUG_ON(btrfs_leaf_free_space(fs_info, leaf) < sizeof(struct btrfs_item));
4436
4437 btrfs_set_path_blocking(path);
4438
4439 item = btrfs_item_nr(path->slots[0]);
4440 orig_offset = btrfs_item_offset(leaf, item);
4441 item_size = btrfs_item_size(leaf, item);
4442
4443 buf = kmalloc(item_size, GFP_NOFS);
4444 if (!buf)
4445 return -ENOMEM;
4446
4447 read_extent_buffer(leaf, buf, btrfs_item_ptr_offset(leaf,
4448 path->slots[0]), item_size);
4449
4450 slot = path->slots[0] + 1;
4451 nritems = btrfs_header_nritems(leaf);
4452 if (slot != nritems) {
4453
4454 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + 1),
4455 btrfs_item_nr_offset(slot),
4456 (nritems - slot) * sizeof(struct btrfs_item));
4457 }
4458
4459 btrfs_cpu_key_to_disk(&disk_key, new_key);
4460 btrfs_set_item_key(leaf, &disk_key, slot);
4461
4462 new_item = btrfs_item_nr(slot);
4463
4464 btrfs_set_item_offset(leaf, new_item, orig_offset);
4465 btrfs_set_item_size(leaf, new_item, item_size - split_offset);
4466
4467 btrfs_set_item_offset(leaf, item,
4468 orig_offset + item_size - split_offset);
4469 btrfs_set_item_size(leaf, item, split_offset);
4470
4471 btrfs_set_header_nritems(leaf, nritems + 1);
4472
4473
4474 write_extent_buffer(leaf, buf,
4475 btrfs_item_ptr_offset(leaf, path->slots[0]),
4476 split_offset);
4477
4478
4479 write_extent_buffer(leaf, buf + split_offset,
4480 btrfs_item_ptr_offset(leaf, slot),
4481 item_size - split_offset);
4482 btrfs_mark_buffer_dirty(leaf);
4483
4484 BUG_ON(btrfs_leaf_free_space(fs_info, leaf) < 0);
4485 kfree(buf);
4486 return 0;
4487}
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504int btrfs_split_item(struct btrfs_trans_handle *trans,
4505 struct btrfs_root *root,
4506 struct btrfs_path *path,
4507 const struct btrfs_key *new_key,
4508 unsigned long split_offset)
4509{
4510 int ret;
4511 ret = setup_leaf_for_split(trans, root, path,
4512 sizeof(struct btrfs_item));
4513 if (ret)
4514 return ret;
4515
4516 ret = split_item(root->fs_info, path, new_key, split_offset);
4517 return ret;
4518}
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528int btrfs_duplicate_item(struct btrfs_trans_handle *trans,
4529 struct btrfs_root *root,
4530 struct btrfs_path *path,
4531 const struct btrfs_key *new_key)
4532{
4533 struct extent_buffer *leaf;
4534 int ret;
4535 u32 item_size;
4536
4537 leaf = path->nodes[0];
4538 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
4539 ret = setup_leaf_for_split(trans, root, path,
4540 item_size + sizeof(struct btrfs_item));
4541 if (ret)
4542 return ret;
4543
4544 path->slots[0]++;
4545 setup_items_for_insert(root, path, new_key, &item_size,
4546 item_size, item_size +
4547 sizeof(struct btrfs_item), 1);
4548 leaf = path->nodes[0];
4549 memcpy_extent_buffer(leaf,
4550 btrfs_item_ptr_offset(leaf, path->slots[0]),
4551 btrfs_item_ptr_offset(leaf, path->slots[0] - 1),
4552 item_size);
4553 return 0;
4554}
4555
4556
4557
4558
4559
4560
4561
4562void btrfs_truncate_item(struct btrfs_fs_info *fs_info,
4563 struct btrfs_path *path, u32 new_size, int from_end)
4564{
4565 int slot;
4566 struct extent_buffer *leaf;
4567 struct btrfs_item *item;
4568 u32 nritems;
4569 unsigned int data_end;
4570 unsigned int old_data_start;
4571 unsigned int old_size;
4572 unsigned int size_diff;
4573 int i;
4574 struct btrfs_map_token token;
4575
4576 btrfs_init_map_token(&token);
4577
4578 leaf = path->nodes[0];
4579 slot = path->slots[0];
4580
4581 old_size = btrfs_item_size_nr(leaf, slot);
4582 if (old_size == new_size)
4583 return;
4584
4585 nritems = btrfs_header_nritems(leaf);
4586 data_end = leaf_data_end(fs_info, leaf);
4587
4588 old_data_start = btrfs_item_offset_nr(leaf, slot);
4589
4590 size_diff = old_size - new_size;
4591
4592 BUG_ON(slot < 0);
4593 BUG_ON(slot >= nritems);
4594
4595
4596
4597
4598
4599 for (i = slot; i < nritems; i++) {
4600 u32 ioff;
4601 item = btrfs_item_nr(i);
4602
4603 ioff = btrfs_token_item_offset(leaf, item, &token);
4604 btrfs_set_token_item_offset(leaf, item,
4605 ioff + size_diff, &token);
4606 }
4607
4608
4609 if (from_end) {
4610 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
4611 data_end + size_diff, BTRFS_LEAF_DATA_OFFSET +
4612 data_end, old_data_start + new_size - data_end);
4613 } else {
4614 struct btrfs_disk_key disk_key;
4615 u64 offset;
4616
4617 btrfs_item_key(leaf, &disk_key, slot);
4618
4619 if (btrfs_disk_key_type(&disk_key) == BTRFS_EXTENT_DATA_KEY) {
4620 unsigned long ptr;
4621 struct btrfs_file_extent_item *fi;
4622
4623 fi = btrfs_item_ptr(leaf, slot,
4624 struct btrfs_file_extent_item);
4625 fi = (struct btrfs_file_extent_item *)(
4626 (unsigned long)fi - size_diff);
4627
4628 if (btrfs_file_extent_type(leaf, fi) ==
4629 BTRFS_FILE_EXTENT_INLINE) {
4630 ptr = btrfs_item_ptr_offset(leaf, slot);
4631 memmove_extent_buffer(leaf, ptr,
4632 (unsigned long)fi,
4633 BTRFS_FILE_EXTENT_INLINE_DATA_START);
4634 }
4635 }
4636
4637 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
4638 data_end + size_diff, BTRFS_LEAF_DATA_OFFSET +
4639 data_end, old_data_start - data_end);
4640
4641 offset = btrfs_disk_key_offset(&disk_key);
4642 btrfs_set_disk_key_offset(&disk_key, offset + size_diff);
4643 btrfs_set_item_key(leaf, &disk_key, slot);
4644 if (slot == 0)
4645 fixup_low_keys(fs_info, path, &disk_key, 1);
4646 }
4647
4648 item = btrfs_item_nr(slot);
4649 btrfs_set_item_size(leaf, item, new_size);
4650 btrfs_mark_buffer_dirty(leaf);
4651
4652 if (btrfs_leaf_free_space(fs_info, leaf) < 0) {
4653 btrfs_print_leaf(fs_info, leaf);
4654 BUG();
4655 }
4656}
4657
4658
4659
4660
4661void btrfs_extend_item(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
4662 u32 data_size)
4663{
4664 int slot;
4665 struct extent_buffer *leaf;
4666 struct btrfs_item *item;
4667 u32 nritems;
4668 unsigned int data_end;
4669 unsigned int old_data;
4670 unsigned int old_size;
4671 int i;
4672 struct btrfs_map_token token;
4673
4674 btrfs_init_map_token(&token);
4675
4676 leaf = path->nodes[0];
4677
4678 nritems = btrfs_header_nritems(leaf);
4679 data_end = leaf_data_end(fs_info, leaf);
4680
4681 if (btrfs_leaf_free_space(fs_info, leaf) < data_size) {
4682 btrfs_print_leaf(fs_info, leaf);
4683 BUG();
4684 }
4685 slot = path->slots[0];
4686 old_data = btrfs_item_end_nr(leaf, slot);
4687
4688 BUG_ON(slot < 0);
4689 if (slot >= nritems) {
4690 btrfs_print_leaf(fs_info, leaf);
4691 btrfs_crit(fs_info, "slot %d too large, nritems %d",
4692 slot, nritems);
4693 BUG_ON(1);
4694 }
4695
4696
4697
4698
4699
4700 for (i = slot; i < nritems; i++) {
4701 u32 ioff;
4702 item = btrfs_item_nr(i);
4703
4704 ioff = btrfs_token_item_offset(leaf, item, &token);
4705 btrfs_set_token_item_offset(leaf, item,
4706 ioff - data_size, &token);
4707 }
4708
4709
4710 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
4711 data_end - data_size, BTRFS_LEAF_DATA_OFFSET +
4712 data_end, old_data - data_end);
4713
4714 data_end = old_data;
4715 old_size = btrfs_item_size_nr(leaf, slot);
4716 item = btrfs_item_nr(slot);
4717 btrfs_set_item_size(leaf, item, old_size + data_size);
4718 btrfs_mark_buffer_dirty(leaf);
4719
4720 if (btrfs_leaf_free_space(fs_info, leaf) < 0) {
4721 btrfs_print_leaf(fs_info, leaf);
4722 BUG();
4723 }
4724}
4725
4726
4727
4728
4729
4730
4731void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path,
4732 const struct btrfs_key *cpu_key, u32 *data_size,
4733 u32 total_data, u32 total_size, int nr)
4734{
4735 struct btrfs_fs_info *fs_info = root->fs_info;
4736 struct btrfs_item *item;
4737 int i;
4738 u32 nritems;
4739 unsigned int data_end;
4740 struct btrfs_disk_key disk_key;
4741 struct extent_buffer *leaf;
4742 int slot;
4743 struct btrfs_map_token token;
4744
4745 if (path->slots[0] == 0) {
4746 btrfs_cpu_key_to_disk(&disk_key, cpu_key);
4747 fixup_low_keys(fs_info, path, &disk_key, 1);
4748 }
4749 btrfs_unlock_up_safe(path, 1);
4750
4751 btrfs_init_map_token(&token);
4752
4753 leaf = path->nodes[0];
4754 slot = path->slots[0];
4755
4756 nritems = btrfs_header_nritems(leaf);
4757 data_end = leaf_data_end(fs_info, leaf);
4758
4759 if (btrfs_leaf_free_space(fs_info, leaf) < total_size) {
4760 btrfs_print_leaf(fs_info, leaf);
4761 btrfs_crit(fs_info, "not enough freespace need %u have %d",
4762 total_size, btrfs_leaf_free_space(fs_info, leaf));
4763 BUG();
4764 }
4765
4766 if (slot != nritems) {
4767 unsigned int old_data = btrfs_item_end_nr(leaf, slot);
4768
4769 if (old_data < data_end) {
4770 btrfs_print_leaf(fs_info, leaf);
4771 btrfs_crit(fs_info, "slot %d old_data %d data_end %d",
4772 slot, old_data, data_end);
4773 BUG_ON(1);
4774 }
4775
4776
4777
4778
4779 for (i = slot; i < nritems; i++) {
4780 u32 ioff;
4781
4782 item = btrfs_item_nr(i);
4783 ioff = btrfs_token_item_offset(leaf, item, &token);
4784 btrfs_set_token_item_offset(leaf, item,
4785 ioff - total_data, &token);
4786 }
4787
4788 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr),
4789 btrfs_item_nr_offset(slot),
4790 (nritems - slot) * sizeof(struct btrfs_item));
4791
4792
4793 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
4794 data_end - total_data, BTRFS_LEAF_DATA_OFFSET +
4795 data_end, old_data - data_end);
4796 data_end = old_data;
4797 }
4798
4799
4800 for (i = 0; i < nr; i++) {
4801 btrfs_cpu_key_to_disk(&disk_key, cpu_key + i);
4802 btrfs_set_item_key(leaf, &disk_key, slot + i);
4803 item = btrfs_item_nr(slot + i);
4804 btrfs_set_token_item_offset(leaf, item,
4805 data_end - data_size[i], &token);
4806 data_end -= data_size[i];
4807 btrfs_set_token_item_size(leaf, item, data_size[i], &token);
4808 }
4809
4810 btrfs_set_header_nritems(leaf, nritems + nr);
4811 btrfs_mark_buffer_dirty(leaf);
4812
4813 if (btrfs_leaf_free_space(fs_info, leaf) < 0) {
4814 btrfs_print_leaf(fs_info, leaf);
4815 BUG();
4816 }
4817}
4818
4819
4820
4821
4822
4823int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
4824 struct btrfs_root *root,
4825 struct btrfs_path *path,
4826 const struct btrfs_key *cpu_key, u32 *data_size,
4827 int nr)
4828{
4829 int ret = 0;
4830 int slot;
4831 int i;
4832 u32 total_size = 0;
4833 u32 total_data = 0;
4834
4835 for (i = 0; i < nr; i++)
4836 total_data += data_size[i];
4837
4838 total_size = total_data + (nr * sizeof(struct btrfs_item));
4839 ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1);
4840 if (ret == 0)
4841 return -EEXIST;
4842 if (ret < 0)
4843 return ret;
4844
4845 slot = path->slots[0];
4846 BUG_ON(slot < 0);
4847
4848 setup_items_for_insert(root, path, cpu_key, data_size,
4849 total_data, total_size, nr);
4850 return 0;
4851}
4852
4853
4854
4855
4856
4857int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
4858 const struct btrfs_key *cpu_key, void *data,
4859 u32 data_size)
4860{
4861 int ret = 0;
4862 struct btrfs_path *path;
4863 struct extent_buffer *leaf;
4864 unsigned long ptr;
4865
4866 path = btrfs_alloc_path();
4867 if (!path)
4868 return -ENOMEM;
4869 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
4870 if (!ret) {
4871 leaf = path->nodes[0];
4872 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
4873 write_extent_buffer(leaf, data, ptr, data_size);
4874 btrfs_mark_buffer_dirty(leaf);
4875 }
4876 btrfs_free_path(path);
4877 return ret;
4878}
4879
4880
4881
4882
4883
4884
4885
4886static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
4887 int level, int slot)
4888{
4889 struct btrfs_fs_info *fs_info = root->fs_info;
4890 struct extent_buffer *parent = path->nodes[level];
4891 u32 nritems;
4892 int ret;
4893
4894 nritems = btrfs_header_nritems(parent);
4895 if (slot != nritems - 1) {
4896 if (level)
4897 tree_mod_log_eb_move(fs_info, parent, slot,
4898 slot + 1, nritems - slot - 1);
4899 memmove_extent_buffer(parent,
4900 btrfs_node_key_ptr_offset(slot),
4901 btrfs_node_key_ptr_offset(slot + 1),
4902 sizeof(struct btrfs_key_ptr) *
4903 (nritems - slot - 1));
4904 } else if (level) {
4905 ret = tree_mod_log_insert_key(fs_info, parent, slot,
4906 MOD_LOG_KEY_REMOVE, GFP_NOFS);
4907 BUG_ON(ret < 0);
4908 }
4909
4910 nritems--;
4911 btrfs_set_header_nritems(parent, nritems);
4912 if (nritems == 0 && parent == root->node) {
4913 BUG_ON(btrfs_header_level(root->node) != 1);
4914
4915 btrfs_set_header_level(root->node, 0);
4916 } else if (slot == 0) {
4917 struct btrfs_disk_key disk_key;
4918
4919 btrfs_node_key(parent, &disk_key, 0);
4920 fixup_low_keys(fs_info, path, &disk_key, level + 1);
4921 }
4922 btrfs_mark_buffer_dirty(parent);
4923}
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935static noinline void btrfs_del_leaf(struct btrfs_trans_handle *trans,
4936 struct btrfs_root *root,
4937 struct btrfs_path *path,
4938 struct extent_buffer *leaf)
4939{
4940 WARN_ON(btrfs_header_generation(leaf) != trans->transid);
4941 del_ptr(root, path, 1, path->slots[1]);
4942
4943
4944
4945
4946
4947 btrfs_unlock_up_safe(path, 0);
4948
4949 root_sub_used(root, leaf->len);
4950
4951 extent_buffer_get(leaf);
4952 btrfs_free_tree_block(trans, root, leaf, 0, 1);
4953 free_extent_buffer_stale(leaf);
4954}
4955
4956
4957
4958
4959int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
4960 struct btrfs_path *path, int slot, int nr)
4961{
4962 struct btrfs_fs_info *fs_info = root->fs_info;
4963 struct extent_buffer *leaf;
4964 struct btrfs_item *item;
4965 u32 last_off;
4966 u32 dsize = 0;
4967 int ret = 0;
4968 int wret;
4969 int i;
4970 u32 nritems;
4971 struct btrfs_map_token token;
4972
4973 btrfs_init_map_token(&token);
4974
4975 leaf = path->nodes[0];
4976 last_off = btrfs_item_offset_nr(leaf, slot + nr - 1);
4977
4978 for (i = 0; i < nr; i++)
4979 dsize += btrfs_item_size_nr(leaf, slot + i);
4980
4981 nritems = btrfs_header_nritems(leaf);
4982
4983 if (slot + nr != nritems) {
4984 int data_end = leaf_data_end(fs_info, leaf);
4985
4986 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
4987 data_end + dsize,
4988 BTRFS_LEAF_DATA_OFFSET + data_end,
4989 last_off - data_end);
4990
4991 for (i = slot + nr; i < nritems; i++) {
4992 u32 ioff;
4993
4994 item = btrfs_item_nr(i);
4995 ioff = btrfs_token_item_offset(leaf, item, &token);
4996 btrfs_set_token_item_offset(leaf, item,
4997 ioff + dsize, &token);
4998 }
4999
5000 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
5001 btrfs_item_nr_offset(slot + nr),
5002 sizeof(struct btrfs_item) *
5003 (nritems - slot - nr));
5004 }
5005 btrfs_set_header_nritems(leaf, nritems - nr);
5006 nritems -= nr;
5007
5008
5009 if (nritems == 0) {
5010 if (leaf == root->node) {
5011 btrfs_set_header_level(leaf, 0);
5012 } else {
5013 btrfs_set_path_blocking(path);
5014 clean_tree_block(fs_info, leaf);
5015 btrfs_del_leaf(trans, root, path, leaf);
5016 }
5017 } else {
5018 int used = leaf_space_used(leaf, 0, nritems);
5019 if (slot == 0) {
5020 struct btrfs_disk_key disk_key;
5021
5022 btrfs_item_key(leaf, &disk_key, 0);
5023 fixup_low_keys(fs_info, path, &disk_key, 1);
5024 }
5025
5026
5027 if (used < BTRFS_LEAF_DATA_SIZE(fs_info) / 3) {
5028
5029
5030
5031
5032 slot = path->slots[1];
5033 extent_buffer_get(leaf);
5034
5035 btrfs_set_path_blocking(path);
5036 wret = push_leaf_left(trans, root, path, 1, 1,
5037 1, (u32)-1);
5038 if (wret < 0 && wret != -ENOSPC)
5039 ret = wret;
5040
5041 if (path->nodes[0] == leaf &&
5042 btrfs_header_nritems(leaf)) {
5043 wret = push_leaf_right(trans, root, path, 1,
5044 1, 1, 0);
5045 if (wret < 0 && wret != -ENOSPC)
5046 ret = wret;
5047 }
5048
5049 if (btrfs_header_nritems(leaf) == 0) {
5050 path->slots[1] = slot;
5051 btrfs_del_leaf(trans, root, path, leaf);
5052 free_extent_buffer(leaf);
5053 ret = 0;
5054 } else {
5055
5056
5057
5058
5059
5060 if (path->nodes[0] == leaf)
5061 btrfs_mark_buffer_dirty(leaf);
5062 free_extent_buffer(leaf);
5063 }
5064 } else {
5065 btrfs_mark_buffer_dirty(leaf);
5066 }
5067 }
5068 return ret;
5069}
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
5080{
5081 struct btrfs_key key;
5082 struct btrfs_disk_key found_key;
5083 int ret;
5084
5085 btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
5086
5087 if (key.offset > 0) {
5088 key.offset--;
5089 } else if (key.type > 0) {
5090 key.type--;
5091 key.offset = (u64)-1;
5092 } else if (key.objectid > 0) {
5093 key.objectid--;
5094 key.type = (u8)-1;
5095 key.offset = (u64)-1;
5096 } else {
5097 return 1;
5098 }
5099
5100 btrfs_release_path(path);
5101 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
5102 if (ret < 0)
5103 return ret;
5104 btrfs_item_key(path->nodes[0], &found_key, 0);
5105 ret = comp_keys(&found_key, &key);
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116 if (ret <= 0)
5117 return 0;
5118 return 1;
5119}
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
5144 struct btrfs_path *path,
5145 u64 min_trans)
5146{
5147 struct btrfs_fs_info *fs_info = root->fs_info;
5148 struct extent_buffer *cur;
5149 struct btrfs_key found_key;
5150 int slot;
5151 int sret;
5152 u32 nritems;
5153 int level;
5154 int ret = 1;
5155 int keep_locks = path->keep_locks;
5156
5157 path->keep_locks = 1;
5158again:
5159 cur = btrfs_read_lock_root_node(root);
5160 level = btrfs_header_level(cur);
5161 WARN_ON(path->nodes[level]);
5162 path->nodes[level] = cur;
5163 path->locks[level] = BTRFS_READ_LOCK;
5164
5165 if (btrfs_header_generation(cur) < min_trans) {
5166 ret = 1;
5167 goto out;
5168 }
5169 while (1) {
5170 nritems = btrfs_header_nritems(cur);
5171 level = btrfs_header_level(cur);
5172 sret = bin_search(cur, min_key, level, &slot);
5173
5174
5175 if (level == path->lowest_level) {
5176 if (slot >= nritems)
5177 goto find_next_key;
5178 ret = 0;
5179 path->slots[level] = slot;
5180 btrfs_item_key_to_cpu(cur, &found_key, slot);
5181 goto out;
5182 }
5183 if (sret && slot > 0)
5184 slot--;
5185
5186
5187
5188
5189 while (slot < nritems) {
5190 u64 gen;
5191
5192 gen = btrfs_node_ptr_generation(cur, slot);
5193 if (gen < min_trans) {
5194 slot++;
5195 continue;
5196 }
5197 break;
5198 }
5199find_next_key:
5200
5201
5202
5203
5204 if (slot >= nritems) {
5205 path->slots[level] = slot;
5206 btrfs_set_path_blocking(path);
5207 sret = btrfs_find_next_key(root, path, min_key, level,
5208 min_trans);
5209 if (sret == 0) {
5210 btrfs_release_path(path);
5211 goto again;
5212 } else {
5213 goto out;
5214 }
5215 }
5216
5217 btrfs_node_key_to_cpu(cur, &found_key, slot);
5218 path->slots[level] = slot;
5219 if (level == path->lowest_level) {
5220 ret = 0;
5221 goto out;
5222 }
5223 btrfs_set_path_blocking(path);
5224 cur = read_node_slot(fs_info, cur, slot);
5225 if (IS_ERR(cur)) {
5226 ret = PTR_ERR(cur);
5227 goto out;
5228 }
5229
5230 btrfs_tree_read_lock(cur);
5231
5232 path->locks[level - 1] = BTRFS_READ_LOCK;
5233 path->nodes[level - 1] = cur;
5234 unlock_up(path, level, 1, 0, NULL);
5235 btrfs_clear_path_blocking(path, NULL, 0);
5236 }
5237out:
5238 path->keep_locks = keep_locks;
5239 if (ret == 0) {
5240 btrfs_unlock_up_safe(path, path->lowest_level + 1);
5241 btrfs_set_path_blocking(path);
5242 memcpy(min_key, &found_key, sizeof(found_key));
5243 }
5244 return ret;
5245}
5246
5247static int tree_move_down(struct btrfs_fs_info *fs_info,
5248 struct btrfs_path *path,
5249 int *level)
5250{
5251 struct extent_buffer *eb;
5252
5253 BUG_ON(*level == 0);
5254 eb = read_node_slot(fs_info, path->nodes[*level], path->slots[*level]);
5255 if (IS_ERR(eb))
5256 return PTR_ERR(eb);
5257
5258 path->nodes[*level - 1] = eb;
5259 path->slots[*level - 1] = 0;
5260 (*level)--;
5261 return 0;
5262}
5263
5264static int tree_move_next_or_upnext(struct btrfs_path *path,
5265 int *level, int root_level)
5266{
5267 int ret = 0;
5268 int nritems;
5269 nritems = btrfs_header_nritems(path->nodes[*level]);
5270
5271 path->slots[*level]++;
5272
5273 while (path->slots[*level] >= nritems) {
5274 if (*level == root_level)
5275 return -1;
5276
5277
5278 path->slots[*level] = 0;
5279 free_extent_buffer(path->nodes[*level]);
5280 path->nodes[*level] = NULL;
5281 (*level)++;
5282 path->slots[*level]++;
5283
5284 nritems = btrfs_header_nritems(path->nodes[*level]);
5285 ret = 1;
5286 }
5287 return ret;
5288}
5289
5290
5291
5292
5293
5294static int tree_advance(struct btrfs_fs_info *fs_info,
5295 struct btrfs_path *path,
5296 int *level, int root_level,
5297 int allow_down,
5298 struct btrfs_key *key)
5299{
5300 int ret;
5301
5302 if (*level == 0 || !allow_down) {
5303 ret = tree_move_next_or_upnext(path, level, root_level);
5304 } else {
5305 ret = tree_move_down(fs_info, path, level);
5306 }
5307 if (ret >= 0) {
5308 if (*level == 0)
5309 btrfs_item_key_to_cpu(path->nodes[*level], key,
5310 path->slots[*level]);
5311 else
5312 btrfs_node_key_to_cpu(path->nodes[*level], key,
5313 path->slots[*level]);
5314 }
5315 return ret;
5316}
5317
5318static int tree_compare_item(struct btrfs_path *left_path,
5319 struct btrfs_path *right_path,
5320 char *tmp_buf)
5321{
5322 int cmp;
5323 int len1, len2;
5324 unsigned long off1, off2;
5325
5326 len1 = btrfs_item_size_nr(left_path->nodes[0], left_path->slots[0]);
5327 len2 = btrfs_item_size_nr(right_path->nodes[0], right_path->slots[0]);
5328 if (len1 != len2)
5329 return 1;
5330
5331 off1 = btrfs_item_ptr_offset(left_path->nodes[0], left_path->slots[0]);
5332 off2 = btrfs_item_ptr_offset(right_path->nodes[0],
5333 right_path->slots[0]);
5334
5335 read_extent_buffer(left_path->nodes[0], tmp_buf, off1, len1);
5336
5337 cmp = memcmp_extent_buffer(right_path->nodes[0], tmp_buf, off2, len1);
5338 if (cmp)
5339 return 1;
5340 return 0;
5341}
5342
5343#define ADVANCE 1
5344#define ADVANCE_ONLY_NEXT -1
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359int btrfs_compare_trees(struct btrfs_root *left_root,
5360 struct btrfs_root *right_root,
5361 btrfs_changed_cb_t changed_cb, void *ctx)
5362{
5363 struct btrfs_fs_info *fs_info = left_root->fs_info;
5364 int ret;
5365 int cmp;
5366 struct btrfs_path *left_path = NULL;
5367 struct btrfs_path *right_path = NULL;
5368 struct btrfs_key left_key;
5369 struct btrfs_key right_key;
5370 char *tmp_buf = NULL;
5371 int left_root_level;
5372 int right_root_level;
5373 int left_level;
5374 int right_level;
5375 int left_end_reached;
5376 int right_end_reached;
5377 int advance_left;
5378 int advance_right;
5379 u64 left_blockptr;
5380 u64 right_blockptr;
5381 u64 left_gen;
5382 u64 right_gen;
5383
5384 left_path = btrfs_alloc_path();
5385 if (!left_path) {
5386 ret = -ENOMEM;
5387 goto out;
5388 }
5389 right_path = btrfs_alloc_path();
5390 if (!right_path) {
5391 ret = -ENOMEM;
5392 goto out;
5393 }
5394
5395 tmp_buf = kvmalloc(fs_info->nodesize, GFP_KERNEL);
5396 if (!tmp_buf) {
5397 ret = -ENOMEM;
5398 goto out;
5399 }
5400
5401 left_path->search_commit_root = 1;
5402 left_path->skip_locking = 1;
5403 right_path->search_commit_root = 1;
5404 right_path->skip_locking = 1;
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442 down_read(&fs_info->commit_root_sem);
5443 left_level = btrfs_header_level(left_root->commit_root);
5444 left_root_level = left_level;
5445 left_path->nodes[left_level] = left_root->commit_root;
5446 extent_buffer_get(left_path->nodes[left_level]);
5447
5448 right_level = btrfs_header_level(right_root->commit_root);
5449 right_root_level = right_level;
5450 right_path->nodes[right_level] = right_root->commit_root;
5451 extent_buffer_get(right_path->nodes[right_level]);
5452 up_read(&fs_info->commit_root_sem);
5453
5454 if (left_level == 0)
5455 btrfs_item_key_to_cpu(left_path->nodes[left_level],
5456 &left_key, left_path->slots[left_level]);
5457 else
5458 btrfs_node_key_to_cpu(left_path->nodes[left_level],
5459 &left_key, left_path->slots[left_level]);
5460 if (right_level == 0)
5461 btrfs_item_key_to_cpu(right_path->nodes[right_level],
5462 &right_key, right_path->slots[right_level]);
5463 else
5464 btrfs_node_key_to_cpu(right_path->nodes[right_level],
5465 &right_key, right_path->slots[right_level]);
5466
5467 left_end_reached = right_end_reached = 0;
5468 advance_left = advance_right = 0;
5469
5470 while (1) {
5471 if (advance_left && !left_end_reached) {
5472 ret = tree_advance(fs_info, left_path, &left_level,
5473 left_root_level,
5474 advance_left != ADVANCE_ONLY_NEXT,
5475 &left_key);
5476 if (ret == -1)
5477 left_end_reached = ADVANCE;
5478 else if (ret < 0)
5479 goto out;
5480 advance_left = 0;
5481 }
5482 if (advance_right && !right_end_reached) {
5483 ret = tree_advance(fs_info, right_path, &right_level,
5484 right_root_level,
5485 advance_right != ADVANCE_ONLY_NEXT,
5486 &right_key);
5487 if (ret == -1)
5488 right_end_reached = ADVANCE;
5489 else if (ret < 0)
5490 goto out;
5491 advance_right = 0;
5492 }
5493
5494 if (left_end_reached && right_end_reached) {
5495 ret = 0;
5496 goto out;
5497 } else if (left_end_reached) {
5498 if (right_level == 0) {
5499 ret = changed_cb(left_root, right_root,
5500 left_path, right_path,
5501 &right_key,
5502 BTRFS_COMPARE_TREE_DELETED,
5503 ctx);
5504 if (ret < 0)
5505 goto out;
5506 }
5507 advance_right = ADVANCE;
5508 continue;
5509 } else if (right_end_reached) {
5510 if (left_level == 0) {
5511 ret = changed_cb(left_root, right_root,
5512 left_path, right_path,
5513 &left_key,
5514 BTRFS_COMPARE_TREE_NEW,
5515 ctx);
5516 if (ret < 0)
5517 goto out;
5518 }
5519 advance_left = ADVANCE;
5520 continue;
5521 }
5522
5523 if (left_level == 0 && right_level == 0) {
5524 cmp = btrfs_comp_cpu_keys(&left_key, &right_key);
5525 if (cmp < 0) {
5526 ret = changed_cb(left_root, right_root,
5527 left_path, right_path,
5528 &left_key,
5529 BTRFS_COMPARE_TREE_NEW,
5530 ctx);
5531 if (ret < 0)
5532 goto out;
5533 advance_left = ADVANCE;
5534 } else if (cmp > 0) {
5535 ret = changed_cb(left_root, right_root,
5536 left_path, right_path,
5537 &right_key,
5538 BTRFS_COMPARE_TREE_DELETED,
5539 ctx);
5540 if (ret < 0)
5541 goto out;
5542 advance_right = ADVANCE;
5543 } else {
5544 enum btrfs_compare_tree_result result;
5545
5546 WARN_ON(!extent_buffer_uptodate(left_path->nodes[0]));
5547 ret = tree_compare_item(left_path, right_path,
5548 tmp_buf);
5549 if (ret)
5550 result = BTRFS_COMPARE_TREE_CHANGED;
5551 else
5552 result = BTRFS_COMPARE_TREE_SAME;
5553 ret = changed_cb(left_root, right_root,
5554 left_path, right_path,
5555 &left_key, result, ctx);
5556 if (ret < 0)
5557 goto out;
5558 advance_left = ADVANCE;
5559 advance_right = ADVANCE;
5560 }
5561 } else if (left_level == right_level) {
5562 cmp = btrfs_comp_cpu_keys(&left_key, &right_key);
5563 if (cmp < 0) {
5564 advance_left = ADVANCE;
5565 } else if (cmp > 0) {
5566 advance_right = ADVANCE;
5567 } else {
5568 left_blockptr = btrfs_node_blockptr(
5569 left_path->nodes[left_level],
5570 left_path->slots[left_level]);
5571 right_blockptr = btrfs_node_blockptr(
5572 right_path->nodes[right_level],
5573 right_path->slots[right_level]);
5574 left_gen = btrfs_node_ptr_generation(
5575 left_path->nodes[left_level],
5576 left_path->slots[left_level]);
5577 right_gen = btrfs_node_ptr_generation(
5578 right_path->nodes[right_level],
5579 right_path->slots[right_level]);
5580 if (left_blockptr == right_blockptr &&
5581 left_gen == right_gen) {
5582
5583
5584
5585
5586 advance_left = ADVANCE_ONLY_NEXT;
5587 advance_right = ADVANCE_ONLY_NEXT;
5588 } else {
5589 advance_left = ADVANCE;
5590 advance_right = ADVANCE;
5591 }
5592 }
5593 } else if (left_level < right_level) {
5594 advance_right = ADVANCE;
5595 } else {
5596 advance_left = ADVANCE;
5597 }
5598 }
5599
5600out:
5601 btrfs_free_path(left_path);
5602 btrfs_free_path(right_path);
5603 kvfree(tmp_buf);
5604 return ret;
5605}
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
5619 struct btrfs_key *key, int level, u64 min_trans)
5620{
5621 int slot;
5622 struct extent_buffer *c;
5623
5624 WARN_ON(!path->keep_locks);
5625 while (level < BTRFS_MAX_LEVEL) {
5626 if (!path->nodes[level])
5627 return 1;
5628
5629 slot = path->slots[level] + 1;
5630 c = path->nodes[level];
5631next:
5632 if (slot >= btrfs_header_nritems(c)) {
5633 int ret;
5634 int orig_lowest;
5635 struct btrfs_key cur_key;
5636 if (level + 1 >= BTRFS_MAX_LEVEL ||
5637 !path->nodes[level + 1])
5638 return 1;
5639
5640 if (path->locks[level + 1]) {
5641 level++;
5642 continue;
5643 }
5644
5645 slot = btrfs_header_nritems(c) - 1;
5646 if (level == 0)
5647 btrfs_item_key_to_cpu(c, &cur_key, slot);
5648 else
5649 btrfs_node_key_to_cpu(c, &cur_key, slot);
5650
5651 orig_lowest = path->lowest_level;
5652 btrfs_release_path(path);
5653 path->lowest_level = level;
5654 ret = btrfs_search_slot(NULL, root, &cur_key, path,
5655 0, 0);
5656 path->lowest_level = orig_lowest;
5657 if (ret < 0)
5658 return ret;
5659
5660 c = path->nodes[level];
5661 slot = path->slots[level];
5662 if (ret == 0)
5663 slot++;
5664 goto next;
5665 }
5666
5667 if (level == 0)
5668 btrfs_item_key_to_cpu(c, key, slot);
5669 else {
5670 u64 gen = btrfs_node_ptr_generation(c, slot);
5671
5672 if (gen < min_trans) {
5673 slot++;
5674 goto next;
5675 }
5676 btrfs_node_key_to_cpu(c, key, slot);
5677 }
5678 return 0;
5679 }
5680 return 1;
5681}
5682
5683
5684
5685
5686
5687
5688int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
5689{
5690 return btrfs_next_old_leaf(root, path, 0);
5691}
5692
5693int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,
5694 u64 time_seq)
5695{
5696 int slot;
5697 int level;
5698 struct extent_buffer *c;
5699 struct extent_buffer *next;
5700 struct btrfs_key key;
5701 u32 nritems;
5702 int ret;
5703 int old_spinning = path->leave_spinning;
5704 int next_rw_lock = 0;
5705
5706 nritems = btrfs_header_nritems(path->nodes[0]);
5707 if (nritems == 0)
5708 return 1;
5709
5710 btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1);
5711again:
5712 level = 1;
5713 next = NULL;
5714 next_rw_lock = 0;
5715 btrfs_release_path(path);
5716
5717 path->keep_locks = 1;
5718 path->leave_spinning = 1;
5719
5720 if (time_seq)
5721 ret = btrfs_search_old_slot(root, &key, path, time_seq);
5722 else
5723 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
5724 path->keep_locks = 0;
5725
5726 if (ret < 0)
5727 return ret;
5728
5729 nritems = btrfs_header_nritems(path->nodes[0]);
5730
5731
5732
5733
5734
5735
5736 if (nritems > 0 && path->slots[0] < nritems - 1) {
5737 if (ret == 0)
5738 path->slots[0]++;
5739 ret = 0;
5740 goto done;
5741 }
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756 if (nritems > 0 && ret > 0 && path->slots[0] == nritems - 1) {
5757 ret = 0;
5758 goto done;
5759 }
5760
5761 while (level < BTRFS_MAX_LEVEL) {
5762 if (!path->nodes[level]) {
5763 ret = 1;
5764 goto done;
5765 }
5766
5767 slot = path->slots[level] + 1;
5768 c = path->nodes[level];
5769 if (slot >= btrfs_header_nritems(c)) {
5770 level++;
5771 if (level == BTRFS_MAX_LEVEL) {
5772 ret = 1;
5773 goto done;
5774 }
5775 continue;
5776 }
5777
5778 if (next) {
5779 btrfs_tree_unlock_rw(next, next_rw_lock);
5780 free_extent_buffer(next);
5781 }
5782
5783 next = c;
5784 next_rw_lock = path->locks[level];
5785 ret = read_block_for_search(root, path, &next, level,
5786 slot, &key);
5787 if (ret == -EAGAIN)
5788 goto again;
5789
5790 if (ret < 0) {
5791 btrfs_release_path(path);
5792 goto done;
5793 }
5794
5795 if (!path->skip_locking) {
5796 ret = btrfs_try_tree_read_lock(next);
5797 if (!ret && time_seq) {
5798
5799
5800
5801
5802
5803
5804
5805 free_extent_buffer(next);
5806 btrfs_release_path(path);
5807 cond_resched();
5808 goto again;
5809 }
5810 if (!ret) {
5811 btrfs_set_path_blocking(path);
5812 btrfs_tree_read_lock(next);
5813 btrfs_clear_path_blocking(path, next,
5814 BTRFS_READ_LOCK);
5815 }
5816 next_rw_lock = BTRFS_READ_LOCK;
5817 }
5818 break;
5819 }
5820 path->slots[level] = slot;
5821 while (1) {
5822 level--;
5823 c = path->nodes[level];
5824 if (path->locks[level])
5825 btrfs_tree_unlock_rw(c, path->locks[level]);
5826
5827 free_extent_buffer(c);
5828 path->nodes[level] = next;
5829 path->slots[level] = 0;
5830 if (!path->skip_locking)
5831 path->locks[level] = next_rw_lock;
5832 if (!level)
5833 break;
5834
5835 ret = read_block_for_search(root, path, &next, level,
5836 0, &key);
5837 if (ret == -EAGAIN)
5838 goto again;
5839
5840 if (ret < 0) {
5841 btrfs_release_path(path);
5842 goto done;
5843 }
5844
5845 if (!path->skip_locking) {
5846 ret = btrfs_try_tree_read_lock(next);
5847 if (!ret) {
5848 btrfs_set_path_blocking(path);
5849 btrfs_tree_read_lock(next);
5850 btrfs_clear_path_blocking(path, next,
5851 BTRFS_READ_LOCK);
5852 }
5853 next_rw_lock = BTRFS_READ_LOCK;
5854 }
5855 }
5856 ret = 0;
5857done:
5858 unlock_up(path, 0, 1, 0, NULL);
5859 path->leave_spinning = old_spinning;
5860 if (!old_spinning)
5861 btrfs_set_path_blocking(path);
5862
5863 return ret;
5864}
5865
5866
5867
5868
5869
5870
5871
5872int btrfs_previous_item(struct btrfs_root *root,
5873 struct btrfs_path *path, u64 min_objectid,
5874 int type)
5875{
5876 struct btrfs_key found_key;
5877 struct extent_buffer *leaf;
5878 u32 nritems;
5879 int ret;
5880
5881 while (1) {
5882 if (path->slots[0] == 0) {
5883 btrfs_set_path_blocking(path);
5884 ret = btrfs_prev_leaf(root, path);
5885 if (ret != 0)
5886 return ret;
5887 } else {
5888 path->slots[0]--;
5889 }
5890 leaf = path->nodes[0];
5891 nritems = btrfs_header_nritems(leaf);
5892 if (nritems == 0)
5893 return 1;
5894 if (path->slots[0] == nritems)
5895 path->slots[0]--;
5896
5897 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
5898 if (found_key.objectid < min_objectid)
5899 break;
5900 if (found_key.type == type)
5901 return 0;
5902 if (found_key.objectid == min_objectid &&
5903 found_key.type < type)
5904 break;
5905 }
5906 return 1;
5907}
5908
5909
5910
5911
5912
5913
5914
5915int btrfs_previous_extent_item(struct btrfs_root *root,
5916 struct btrfs_path *path, u64 min_objectid)
5917{
5918 struct btrfs_key found_key;
5919 struct extent_buffer *leaf;
5920 u32 nritems;
5921 int ret;
5922
5923 while (1) {
5924 if (path->slots[0] == 0) {
5925 btrfs_set_path_blocking(path);
5926 ret = btrfs_prev_leaf(root, path);
5927 if (ret != 0)
5928 return ret;
5929 } else {
5930 path->slots[0]--;
5931 }
5932 leaf = path->nodes[0];
5933 nritems = btrfs_header_nritems(leaf);
5934 if (nritems == 0)
5935 return 1;
5936 if (path->slots[0] == nritems)
5937 path->slots[0]--;
5938
5939 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
5940 if (found_key.objectid < min_objectid)
5941 break;
5942 if (found_key.type == BTRFS_EXTENT_ITEM_KEY ||
5943 found_key.type == BTRFS_METADATA_ITEM_KEY)
5944 return 0;
5945 if (found_key.objectid == min_objectid &&
5946 found_key.type < BTRFS_EXTENT_ITEM_KEY)
5947 break;
5948 }
5949 return 1;
5950}
5951