Lines Matching refs:tb

19 static inline void buffer_info_init_left(struct tree_balance *tb,  in buffer_info_init_left()  argument
22 bi->tb = tb; in buffer_info_init_left()
23 bi->bi_bh = tb->L[0]; in buffer_info_init_left()
24 bi->bi_parent = tb->FL[0]; in buffer_info_init_left()
25 bi->bi_position = get_left_neighbor_position(tb, 0); in buffer_info_init_left()
28 static inline void buffer_info_init_right(struct tree_balance *tb, in buffer_info_init_right() argument
31 bi->tb = tb; in buffer_info_init_right()
32 bi->bi_bh = tb->R[0]; in buffer_info_init_right()
33 bi->bi_parent = tb->FR[0]; in buffer_info_init_right()
34 bi->bi_position = get_right_neighbor_position(tb, 0); in buffer_info_init_right()
37 static inline void buffer_info_init_tbS0(struct tree_balance *tb, in buffer_info_init_tbS0() argument
40 bi->tb = tb; in buffer_info_init_tbS0()
41 bi->bi_bh = PATH_PLAST_BUFFER(tb->tb_path); in buffer_info_init_tbS0()
42 bi->bi_parent = PATH_H_PPARENT(tb->tb_path, 0); in buffer_info_init_tbS0()
43 bi->bi_position = PATH_H_POSITION(tb->tb_path, 1); in buffer_info_init_tbS0()
46 static inline void buffer_info_init_bh(struct tree_balance *tb, in buffer_info_init_bh() argument
50 bi->tb = tb; in buffer_info_init_bh()
56 inline void do_balance_mark_leaf_dirty(struct tree_balance *tb, in do_balance_mark_leaf_dirty() argument
59 journal_mark_dirty(tb->transaction_handle, bh); in do_balance_mark_leaf_dirty()
77 static void balance_leaf_when_delete_del(struct tree_balance *tb) in balance_leaf_when_delete_del() argument
79 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_when_delete_del()
80 int item_pos = PATH_LAST_POSITION(tb->tb_path); in balance_leaf_when_delete_del()
86 RFALSE(ih_item_len(ih) + IH_SIZE != -tb->insert_size[0], in balance_leaf_when_delete_del()
88 -tb->insert_size[0], ih); in balance_leaf_when_delete_del()
90 buffer_info_init_tbS0(tb, &bi); in balance_leaf_when_delete_del()
93 if (!item_pos && tb->CFL[0]) { in balance_leaf_when_delete_del()
95 replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); in balance_leaf_when_delete_del()
97 if (!PATH_H_POSITION(tb->tb_path, 1)) in balance_leaf_when_delete_del()
98 replace_key(tb, tb->CFL[0], tb->lkey[0], in balance_leaf_when_delete_del()
99 PATH_H_PPARENT(tb->tb_path, 0), 0); in balance_leaf_when_delete_del()
103 RFALSE(!item_pos && !tb->CFL[0], in balance_leaf_when_delete_del()
104 "PAP-12020: tb->CFL[0]==%p, tb->L[0]==%p", tb->CFL[0], in balance_leaf_when_delete_del()
105 tb->L[0]); in balance_leaf_when_delete_del()
109 static void balance_leaf_when_delete_cut(struct tree_balance *tb) in balance_leaf_when_delete_cut() argument
111 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_when_delete_cut()
112 int item_pos = PATH_LAST_POSITION(tb->tb_path); in balance_leaf_when_delete_cut()
114 int pos_in_item = tb->tb_path->pos_in_item; in balance_leaf_when_delete_cut()
116 buffer_info_init_tbS0(tb, &bi); in balance_leaf_when_delete_cut()
126 tb->insert_size[0] = -1; in balance_leaf_when_delete_cut()
128 -tb->insert_size[0]); in balance_leaf_when_delete_cut()
130 RFALSE(!item_pos && !pos_in_item && !tb->CFL[0], in balance_leaf_when_delete_cut()
132 tb->CFL[0]); in balance_leaf_when_delete_cut()
134 if (!item_pos && !pos_in_item && tb->CFL[0]) in balance_leaf_when_delete_cut()
135 replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); in balance_leaf_when_delete_cut()
138 -tb->insert_size[0]); in balance_leaf_when_delete_cut()
146 static int balance_leaf_when_delete_left(struct tree_balance *tb) in balance_leaf_when_delete_left() argument
148 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_when_delete_left()
152 if (tb->lnum[0] == -1) { in balance_leaf_when_delete_left()
154 if (tb->rnum[0] == -1) { in balance_leaf_when_delete_left()
155 if (tb->FR[0] == PATH_H_PPARENT(tb->tb_path, 0)) { in balance_leaf_when_delete_left()
160 if (PATH_H_POSITION(tb->tb_path, 1) == 0 && in balance_leaf_when_delete_left()
161 1 < B_NR_ITEMS(tb->FR[0])) in balance_leaf_when_delete_left()
162 replace_key(tb, tb->CFL[0], in balance_leaf_when_delete_left()
163 tb->lkey[0], tb->FR[0], 1); in balance_leaf_when_delete_left()
165 leaf_move_items(LEAF_FROM_S_TO_L, tb, n, -1, in balance_leaf_when_delete_left()
167 leaf_move_items(LEAF_FROM_R_TO_L, tb, in balance_leaf_when_delete_left()
168 B_NR_ITEMS(tb->R[0]), -1, in balance_leaf_when_delete_left()
171 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf_when_delete_left()
172 reiserfs_invalidate_buffer(tb, tb->R[0]); in balance_leaf_when_delete_left()
178 leaf_move_items(LEAF_FROM_S_TO_R, tb, n, -1, NULL); in balance_leaf_when_delete_left()
179 leaf_move_items(LEAF_FROM_L_TO_R, tb, in balance_leaf_when_delete_left()
180 B_NR_ITEMS(tb->L[0]), -1, NULL); in balance_leaf_when_delete_left()
183 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_when_delete_left()
185 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf_when_delete_left()
186 reiserfs_invalidate_buffer(tb, tb->L[0]); in balance_leaf_when_delete_left()
191 RFALSE(tb->rnum[0] != 0, in balance_leaf_when_delete_left()
192 "PAP-12045: rnum must be 0 (%d)", tb->rnum[0]); in balance_leaf_when_delete_left()
194 leaf_shift_left(tb, n, -1); in balance_leaf_when_delete_left()
196 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf_when_delete_left()
206 RFALSE((tb->lnum[0] + tb->rnum[0] < n) || in balance_leaf_when_delete_left()
207 (tb->lnum[0] + tb->rnum[0] > n + 1), in balance_leaf_when_delete_left()
210 tb->rnum[0], tb->lnum[0], n); in balance_leaf_when_delete_left()
211 RFALSE((tb->lnum[0] + tb->rnum[0] == n) && in balance_leaf_when_delete_left()
212 (tb->lbytes != -1 || tb->rbytes != -1), in balance_leaf_when_delete_left()
215 tb->rbytes, tb->lbytes); in balance_leaf_when_delete_left()
216 RFALSE((tb->lnum[0] + tb->rnum[0] == n + 1) && in balance_leaf_when_delete_left()
217 (tb->lbytes < 1 || tb->rbytes != -1), in balance_leaf_when_delete_left()
220 tb->rbytes, tb->lbytes); in balance_leaf_when_delete_left()
222 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_when_delete_left()
223 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_when_delete_left()
225 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf_when_delete_left()
239 static int balance_leaf_when_delete(struct tree_balance *tb, int flag) in balance_leaf_when_delete() argument
241 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_when_delete()
242 int item_pos = PATH_LAST_POSITION(tb->tb_path); in balance_leaf_when_delete()
247 RFALSE(tb->FR[0] && B_LEVEL(tb->FR[0]) != DISK_LEAF_NODE_LEVEL + 1, in balance_leaf_when_delete()
248 "vs- 12000: level: wrong FR %z", tb->FR[0]); in balance_leaf_when_delete()
249 RFALSE(tb->blknum[0] > 1, in balance_leaf_when_delete()
250 "PAP-12005: tb->blknum == %d, can not be > 1", tb->blknum[0]); in balance_leaf_when_delete()
251 RFALSE(!tb->blknum[0] && !PATH_H_PPARENT(tb->tb_path, 0), in balance_leaf_when_delete()
255 buffer_info_init_tbS0(tb, &bi); in balance_leaf_when_delete()
261 balance_leaf_when_delete_del(tb); in balance_leaf_when_delete()
263 balance_leaf_when_delete_cut(tb); in balance_leaf_when_delete()
274 if (tb->lnum[0]) in balance_leaf_when_delete()
275 return balance_leaf_when_delete_left(tb); in balance_leaf_when_delete()
277 if (tb->rnum[0] == -1) { in balance_leaf_when_delete()
279 leaf_shift_right(tb, n, -1); in balance_leaf_when_delete()
280 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf_when_delete()
284 RFALSE(tb->rnum[0], in balance_leaf_when_delete()
285 "PAP-12065: bad rnum parameter must be 0 (%d)", tb->rnum[0]); in balance_leaf_when_delete()
289 static unsigned int balance_leaf_insert_left(struct tree_balance *tb, in balance_leaf_insert_left() argument
295 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_insert_left()
298 if (tb->item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) { in balance_leaf_insert_left()
303 ret = leaf_shift_left(tb, tb->lnum[0] - 1, -1); in balance_leaf_insert_left()
306 new_item_len = ih_item_len(ih) - tb->lbytes; in balance_leaf_insert_left()
316 buffer_info_init_left(tb, &bi); in balance_leaf_insert_left()
317 leaf_insert_into_buf(&bi, n + tb->item_pos - ret, ih, body, in balance_leaf_insert_left()
318 min_t(int, tb->zeroes_num, ih_item_len(ih))); in balance_leaf_insert_left()
328 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_insert_left()
330 add_le_ih_k_offset(ih, tb->lbytes << shift); in balance_leaf_insert_left()
333 if (tb->lbytes > tb->zeroes_num) { in balance_leaf_insert_left()
334 body_shift_bytes = tb->lbytes - tb->zeroes_num; in balance_leaf_insert_left()
335 tb->zeroes_num = 0; in balance_leaf_insert_left()
337 tb->zeroes_num -= tb->lbytes; in balance_leaf_insert_left()
345 ret = leaf_shift_left(tb, tb->lnum[0] - 1, tb->lbytes); in balance_leaf_insert_left()
348 buffer_info_init_left(tb, &bi); in balance_leaf_insert_left()
349 leaf_insert_into_buf(&bi, n + tb->item_pos - ret, ih, body, in balance_leaf_insert_left()
350 tb->zeroes_num); in balance_leaf_insert_left()
351 tb->insert_size[0] = 0; in balance_leaf_insert_left()
352 tb->zeroes_num = 0; in balance_leaf_insert_left()
357 static void balance_leaf_paste_left_shift_dirent(struct tree_balance *tb, in balance_leaf_paste_left_shift_dirent() argument
361 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_paste_left_shift_dirent()
364 RFALSE(tb->zeroes_num, in balance_leaf_paste_left_shift_dirent()
368 if (tb->lbytes > tb->pos_in_item) { in balance_leaf_paste_left_shift_dirent()
371 int ret, l_pos_in_item = tb->pos_in_item; in balance_leaf_paste_left_shift_dirent()
377 ret = leaf_shift_left(tb, tb->lnum[0], tb->lbytes - 1); in balance_leaf_paste_left_shift_dirent()
378 if (ret && !tb->item_pos) { in balance_leaf_paste_left_shift_dirent()
379 pasted = item_head(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1); in balance_leaf_paste_left_shift_dirent()
381 (tb->lbytes - 1); in balance_leaf_paste_left_shift_dirent()
385 buffer_info_init_left(tb, &bi); in balance_leaf_paste_left_shift_dirent()
386 leaf_paste_in_buffer(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_shift_dirent()
387 l_pos_in_item, tb->insert_size[0], in balance_leaf_paste_left_shift_dirent()
388 body, tb->zeroes_num); in balance_leaf_paste_left_shift_dirent()
401 leaf_paste_entries(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_shift_dirent()
404 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_left_shift_dirent()
405 tb->insert_size[0] = 0; in balance_leaf_paste_left_shift_dirent()
412 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_paste_left_shift_dirent()
416 tb->pos_in_item -= tb->lbytes; in balance_leaf_paste_left_shift_dirent()
419 static unsigned int balance_leaf_paste_left_shift(struct tree_balance *tb, in balance_leaf_paste_left_shift() argument
423 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_left_shift()
424 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_paste_left_shift()
428 if (is_direntry_le_ih(item_head(tbS0, tb->item_pos))) { in balance_leaf_paste_left_shift()
429 balance_leaf_paste_left_shift_dirent(tb, ih, body); in balance_leaf_paste_left_shift()
433 RFALSE(tb->lbytes <= 0, in balance_leaf_paste_left_shift()
435 "lbytes=%d", tb->lbytes); in balance_leaf_paste_left_shift()
436 RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)), in balance_leaf_paste_left_shift()
439 ih_item_len(item_head(tbS0, tb->item_pos)), tb->pos_in_item); in balance_leaf_paste_left_shift()
442 if (tb->lbytes >= tb->pos_in_item) { in balance_leaf_paste_left_shift()
448 tbS0_pos_ih = item_head(tbS0, tb->item_pos); in balance_leaf_paste_left_shift()
455 l_n = tb->lbytes - tb->pos_in_item; in balance_leaf_paste_left_shift()
458 tb->insert_size[0] -= l_n; in balance_leaf_paste_left_shift()
460 RFALSE(tb->insert_size[0] <= 0, in balance_leaf_paste_left_shift()
462 "L[0]. insert_size=%d", tb->insert_size[0]); in balance_leaf_paste_left_shift()
464 ret = leaf_shift_left(tb, tb->lnum[0], in balance_leaf_paste_left_shift()
467 tbL0_ih = item_head(tb->L[0], n + tb->item_pos - ret); in balance_leaf_paste_left_shift()
470 buffer_info_init_left(tb, &bi); in balance_leaf_paste_left_shift()
471 leaf_paste_in_buffer(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_shift()
473 min_t(int, l_n, tb->zeroes_num)); in balance_leaf_paste_left_shift()
484 leaf_key(tb->L[0], n + tb->item_pos - ret)), in balance_leaf_paste_left_shift()
488 int shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_paste_left_shift()
496 left_delim_key = internal_key(tb->CFL[0], tb->lkey[0]); in balance_leaf_paste_left_shift()
503 if (l_n > tb->zeroes_num) { in balance_leaf_paste_left_shift()
504 body_shift_bytes = l_n - tb->zeroes_num; in balance_leaf_paste_left_shift()
505 tb->zeroes_num = 0; in balance_leaf_paste_left_shift()
507 tb->zeroes_num -= l_n; in balance_leaf_paste_left_shift()
508 tb->pos_in_item = 0; in balance_leaf_paste_left_shift()
511 leaf_key(tb->L[0], in balance_leaf_paste_left_shift()
512 B_NR_ITEMS(tb->L[0]) - 1)) || in balance_leaf_paste_left_shift()
521 tb->pos_in_item -= tb->lbytes; in balance_leaf_paste_left_shift()
523 RFALSE(tb->pos_in_item <= 0, in balance_leaf_paste_left_shift()
525 tb->pos_in_item); in balance_leaf_paste_left_shift()
531 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_paste_left_shift()
538 static void balance_leaf_paste_left_whole(struct tree_balance *tb, in balance_leaf_paste_left_whole() argument
542 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_left_whole()
543 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_paste_left_whole()
549 if (!tb->item_pos && in balance_leaf_paste_left_whole()
555 pasted = item_head(tb->L[0], n - 1); in balance_leaf_paste_left_whole()
557 tb->pos_in_item += ih_entry_count(pasted); in balance_leaf_paste_left_whole()
559 tb->pos_in_item += ih_item_len(pasted); in balance_leaf_paste_left_whole()
566 ret = leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_paste_left_whole()
569 buffer_info_init_left(tb, &bi); in balance_leaf_paste_left_whole()
570 leaf_paste_in_buffer(&bi, n + tb->item_pos - ret, tb->pos_in_item, in balance_leaf_paste_left_whole()
571 tb->insert_size[0], body, tb->zeroes_num); in balance_leaf_paste_left_whole()
574 pasted = item_head(tb->L[0], n + tb->item_pos - ret); in balance_leaf_paste_left_whole()
576 leaf_paste_entries(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_whole()
577 tb->pos_in_item, 1, in balance_leaf_paste_left_whole()
579 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_left_whole()
588 tb->insert_size[0] = 0; in balance_leaf_paste_left_whole()
589 tb->zeroes_num = 0; in balance_leaf_paste_left_whole()
592 static unsigned int balance_leaf_paste_left(struct tree_balance *tb, in balance_leaf_paste_left() argument
597 if (tb->item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) in balance_leaf_paste_left()
598 return balance_leaf_paste_left_shift(tb, ih, body); in balance_leaf_paste_left()
600 balance_leaf_paste_left_whole(tb, ih, body); in balance_leaf_paste_left()
605 static unsigned int balance_leaf_left(struct tree_balance *tb, in balance_leaf_left() argument
609 if (tb->lnum[0] <= 0) in balance_leaf_left()
613 if (tb->item_pos < tb->lnum[0]) { in balance_leaf_left()
617 return balance_leaf_insert_left(tb, ih, body); in balance_leaf_left()
619 return balance_leaf_paste_left(tb, ih, body); in balance_leaf_left()
622 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_left()
627 static void balance_leaf_insert_right(struct tree_balance *tb, in balance_leaf_insert_right() argument
632 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_insert_right()
638 if (n - tb->rnum[0] >= tb->item_pos) { in balance_leaf_insert_right()
639 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_insert_right()
646 if (tb->item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) { in balance_leaf_insert_right()
652 leaf_shift_right(tb, tb->rnum[0] - 1, -1); in balance_leaf_insert_right()
666 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_insert_right()
667 offset = le_ih_k_offset(ih) + ((old_len - tb->rbytes) << shift); in balance_leaf_insert_right()
669 put_ih_item_len(ih, tb->rbytes); in balance_leaf_insert_right()
672 buffer_info_init_right(tb, &bi); in balance_leaf_insert_right()
673 if ((old_len - tb->rbytes) > tb->zeroes_num) { in balance_leaf_insert_right()
675 r_body = body + (old_len - tb->rbytes) - tb->zeroes_num; in balance_leaf_insert_right()
678 r_zeroes_number = tb->zeroes_num - in balance_leaf_insert_right()
679 (old_len - tb->rbytes); in balance_leaf_insert_right()
680 tb->zeroes_num -= r_zeroes_number; in balance_leaf_insert_right()
686 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_insert_right()
693 put_ih_item_len(ih, old_len - tb->rbytes); in balance_leaf_insert_right()
695 tb->insert_size[0] -= tb->rbytes; in balance_leaf_insert_right()
701 ret = leaf_shift_right(tb, tb->rnum[0] - 1, tb->rbytes); in balance_leaf_insert_right()
704 buffer_info_init_right(tb, &bi); in balance_leaf_insert_right()
705 leaf_insert_into_buf(&bi, tb->item_pos - n + tb->rnum[0] - 1, in balance_leaf_insert_right()
706 ih, body, tb->zeroes_num); in balance_leaf_insert_right()
708 if (tb->item_pos - n + tb->rnum[0] - 1 == 0) in balance_leaf_insert_right()
709 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_insert_right()
711 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_insert_right()
716 static void balance_leaf_paste_right_shift_dirent(struct tree_balance *tb, in balance_leaf_paste_right_shift_dirent() argument
720 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right_shift_dirent()
724 RFALSE(tb->zeroes_num, in balance_leaf_paste_right_shift_dirent()
726 entry_count = ih_entry_count(item_head(tbS0, tb->item_pos)); in balance_leaf_paste_right_shift_dirent()
729 if (entry_count - tb->rbytes < tb->pos_in_item) { in balance_leaf_paste_right_shift_dirent()
732 RFALSE(tb->rbytes - 1 >= entry_count || !tb->insert_size[0], in balance_leaf_paste_right_shift_dirent()
734 "rbytes=%d, entry_count=%d", tb->rbytes, entry_count); in balance_leaf_paste_right_shift_dirent()
741 leaf_shift_right(tb, tb->rnum[0], tb->rbytes - 1); in balance_leaf_paste_right_shift_dirent()
744 paste_entry_position = tb->pos_in_item - entry_count + in balance_leaf_paste_right_shift_dirent()
745 tb->rbytes - 1; in balance_leaf_paste_right_shift_dirent()
746 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_shift_dirent()
748 tb->insert_size[0], body, tb->zeroes_num); in balance_leaf_paste_right_shift_dirent()
753 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_right_shift_dirent()
757 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_paste_right_shift_dirent()
759 tb->insert_size[0] = 0; in balance_leaf_paste_right_shift_dirent()
760 tb->pos_in_item++; in balance_leaf_paste_right_shift_dirent()
763 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_paste_right_shift_dirent()
767 static void balance_leaf_paste_right_shift(struct tree_balance *tb, in balance_leaf_paste_right_shift() argument
771 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right_shift()
778 if (is_direntry_le_ih(item_head(tbS0, tb->item_pos))) { in balance_leaf_paste_right_shift()
779 balance_leaf_paste_right_shift_dirent(tb, ih, body); in balance_leaf_paste_right_shift()
789 n_shift = tb->rbytes - tb->insert_size[0]; in balance_leaf_paste_right_shift()
793 RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)), in balance_leaf_paste_right_shift()
795 "pos_in_item=%d", tb->pos_in_item, in balance_leaf_paste_right_shift()
796 ih_item_len(item_head(tbS0, tb->item_pos))); in balance_leaf_paste_right_shift()
798 leaf_shift_right(tb, tb->rnum[0], n_shift); in balance_leaf_paste_right_shift()
804 n_rem = tb->insert_size[0] - tb->rbytes; in balance_leaf_paste_right_shift()
810 version = ih_version(item_head(tb->R[0], 0)); in balance_leaf_paste_right_shift()
812 if (is_indirect_le_key(version, leaf_key(tb->R[0], 0))) { in balance_leaf_paste_right_shift()
813 int shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_paste_right_shift()
817 add_le_key_k_offset(version, leaf_key(tb->R[0], 0), temp_rem); in balance_leaf_paste_right_shift()
818 add_le_key_k_offset(version, internal_key(tb->CFR[0], tb->rkey[0]), in balance_leaf_paste_right_shift()
821 do_balance_mark_internal_dirty(tb, tb->CFR[0], 0); in balance_leaf_paste_right_shift()
824 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_shift()
825 if (n_rem > tb->zeroes_num) { in balance_leaf_paste_right_shift()
827 r_body = body + n_rem - tb->zeroes_num; in balance_leaf_paste_right_shift()
830 r_zeroes_number = tb->zeroes_num - n_rem; in balance_leaf_paste_right_shift()
831 tb->zeroes_num -= r_zeroes_number; in balance_leaf_paste_right_shift()
834 leaf_paste_in_buffer(&bi, 0, n_shift, tb->insert_size[0] - n_rem, in balance_leaf_paste_right_shift()
837 if (is_indirect_le_ih(item_head(tb->R[0], 0))) in balance_leaf_paste_right_shift()
838 set_ih_free_space(item_head(tb->R[0], 0), 0); in balance_leaf_paste_right_shift()
840 tb->insert_size[0] = n_rem; in balance_leaf_paste_right_shift()
842 tb->pos_in_item++; in balance_leaf_paste_right_shift()
845 static void balance_leaf_paste_right_whole(struct tree_balance *tb, in balance_leaf_paste_right_whole() argument
849 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right_whole()
854 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_whole()
855 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_paste_right_whole()
858 if (tb->pos_in_item >= 0) { in balance_leaf_paste_right_whole()
859 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_whole()
860 leaf_paste_in_buffer(&bi, tb->item_pos - n + tb->rnum[0], in balance_leaf_paste_right_whole()
861 tb->pos_in_item, tb->insert_size[0], body, in balance_leaf_paste_right_whole()
862 tb->zeroes_num); in balance_leaf_paste_right_whole()
866 pasted = item_head(tb->R[0], tb->item_pos - n + tb->rnum[0]); in balance_leaf_paste_right_whole()
867 if (is_direntry_le_ih(pasted) && tb->pos_in_item >= 0) { in balance_leaf_paste_right_whole()
868 leaf_paste_entries(&bi, tb->item_pos - n + tb->rnum[0], in balance_leaf_paste_right_whole()
869 tb->pos_in_item, 1, in balance_leaf_paste_right_whole()
871 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_right_whole()
873 if (!tb->pos_in_item) { in balance_leaf_paste_right_whole()
875 RFALSE(tb->item_pos - n + tb->rnum[0], in balance_leaf_paste_right_whole()
880 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_paste_right_whole()
886 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_paste_right_whole()
889 static void balance_leaf_paste_right(struct tree_balance *tb, in balance_leaf_paste_right() argument
893 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right()
897 if (n - tb->rnum[0] > tb->item_pos) { in balance_leaf_paste_right()
898 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_paste_right()
904 if (tb->item_pos == n - tb->rnum[0] && tb->rbytes != -1) in balance_leaf_paste_right()
906 balance_leaf_paste_right_shift(tb, ih, body); in balance_leaf_paste_right()
909 balance_leaf_paste_right_whole(tb, ih, body); in balance_leaf_paste_right()
913 static void balance_leaf_right(struct tree_balance *tb, in balance_leaf_right() argument
917 if (tb->rnum[0] <= 0) in balance_leaf_right()
923 balance_leaf_insert_right(tb, ih, body); in balance_leaf_right()
925 balance_leaf_paste_right(tb, ih, body); in balance_leaf_right()
928 static void balance_leaf_new_nodes_insert(struct tree_balance *tb, in balance_leaf_new_nodes_insert() argument
935 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_insert()
941 if (n - tb->snum[i] >= tb->item_pos) { in balance_leaf_new_nodes_insert()
942 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, in balance_leaf_new_nodes_insert()
943 tb->snum[i], tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_insert()
950 if (tb->item_pos == n - tb->snum[i] + 1 && tb->sbytes[i] != -1) { in balance_leaf_new_nodes_insert()
956 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i] - 1, -1, in balance_leaf_new_nodes_insert()
957 tb->S_new[i]); in balance_leaf_new_nodes_insert()
970 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_new_nodes_insert()
973 ((old_len - tb->sbytes[i]) << shift)); in balance_leaf_new_nodes_insert()
975 put_ih_item_len(ih, tb->sbytes[i]); in balance_leaf_new_nodes_insert()
978 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_insert()
980 if ((old_len - tb->sbytes[i]) > tb->zeroes_num) { in balance_leaf_new_nodes_insert()
982 r_body = body + (old_len - tb->sbytes[i]) - in balance_leaf_new_nodes_insert()
983 tb->zeroes_num; in balance_leaf_new_nodes_insert()
986 r_zeroes_number = tb->zeroes_num - (old_len - in balance_leaf_new_nodes_insert()
987 tb->sbytes[i]); in balance_leaf_new_nodes_insert()
988 tb->zeroes_num -= r_zeroes_number; in balance_leaf_new_nodes_insert()
998 put_ih_item_len(ih, old_len - tb->sbytes[i]); in balance_leaf_new_nodes_insert()
999 tb->insert_size[0] -= tb->sbytes[i]; in balance_leaf_new_nodes_insert()
1007 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, in balance_leaf_new_nodes_insert()
1008 tb->snum[i] - 1, tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_insert()
1011 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_insert()
1012 leaf_insert_into_buf(&bi, tb->item_pos - n + tb->snum[i] - 1, in balance_leaf_new_nodes_insert()
1013 ih, body, tb->zeroes_num); in balance_leaf_new_nodes_insert()
1015 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_new_nodes_insert()
1020 static void balance_leaf_new_nodes_paste_dirent(struct tree_balance *tb, in balance_leaf_new_nodes_paste_dirent() argument
1027 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste_dirent()
1028 struct item_head *aux_ih = item_head(tbS0, tb->item_pos); in balance_leaf_new_nodes_paste_dirent()
1032 if (entry_count - tb->sbytes[i] < tb->pos_in_item && in balance_leaf_new_nodes_paste_dirent()
1033 tb->pos_in_item <= entry_count) { in balance_leaf_new_nodes_paste_dirent()
1036 RFALSE(!tb->insert_size[0], in balance_leaf_new_nodes_paste_dirent()
1038 RFALSE(tb->sbytes[i] - 1 >= entry_count, in balance_leaf_new_nodes_paste_dirent()
1040 tb->sbytes[i] - 1, entry_count); in balance_leaf_new_nodes_paste_dirent()
1047 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], in balance_leaf_new_nodes_paste_dirent()
1048 tb->sbytes[i] - 1, tb->S_new[i]); in balance_leaf_new_nodes_paste_dirent()
1054 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_paste_dirent()
1055 leaf_paste_in_buffer(&bi, 0, tb->pos_in_item - entry_count + in balance_leaf_new_nodes_paste_dirent()
1056 tb->sbytes[i] - 1, tb->insert_size[0], in balance_leaf_new_nodes_paste_dirent()
1057 body, tb->zeroes_num); in balance_leaf_new_nodes_paste_dirent()
1060 leaf_paste_entries(&bi, 0, tb->pos_in_item - entry_count + in balance_leaf_new_nodes_paste_dirent()
1061 tb->sbytes[i] - 1, 1, in balance_leaf_new_nodes_paste_dirent()
1063 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_new_nodes_paste_dirent()
1065 tb->insert_size[0] = 0; in balance_leaf_new_nodes_paste_dirent()
1066 tb->pos_in_item++; in balance_leaf_new_nodes_paste_dirent()
1069 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], in balance_leaf_new_nodes_paste_dirent()
1070 tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_paste_dirent()
1075 static void balance_leaf_new_nodes_paste_shift(struct tree_balance *tb, in balance_leaf_new_nodes_paste_shift() argument
1082 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste_shift()
1083 struct item_head *aux_ih = item_head(tbS0, tb->item_pos); in balance_leaf_new_nodes_paste_shift()
1092 balance_leaf_new_nodes_paste_dirent(tb, ih, body, insert_key, in balance_leaf_new_nodes_paste_shift()
1100 RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)) || in balance_leaf_new_nodes_paste_shift()
1101 tb->insert_size[0] <= 0, in balance_leaf_new_nodes_paste_shift()
1107 n_shift = tb->sbytes[i] - tb->insert_size[0]; in balance_leaf_new_nodes_paste_shift()
1110 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], n_shift, in balance_leaf_new_nodes_paste_shift()
1111 tb->S_new[i]); in balance_leaf_new_nodes_paste_shift()
1117 n_rem = tb->insert_size[0] - tb->sbytes[i]; in balance_leaf_new_nodes_paste_shift()
1122 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_paste_shift()
1123 if (n_rem > tb->zeroes_num) { in balance_leaf_new_nodes_paste_shift()
1125 r_body = body + n_rem - tb->zeroes_num; in balance_leaf_new_nodes_paste_shift()
1128 r_zeroes_number = tb->zeroes_num - n_rem; in balance_leaf_new_nodes_paste_shift()
1129 tb->zeroes_num -= r_zeroes_number; in balance_leaf_new_nodes_paste_shift()
1132 leaf_paste_in_buffer(&bi, 0, n_shift, tb->insert_size[0] - n_rem, in balance_leaf_new_nodes_paste_shift()
1135 tmp = item_head(tb->S_new[i], 0); in balance_leaf_new_nodes_paste_shift()
1139 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_new_nodes_paste_shift()
1143 tb->insert_size[0] = n_rem; in balance_leaf_new_nodes_paste_shift()
1145 tb->pos_in_item++; in balance_leaf_new_nodes_paste_shift()
1148 static void balance_leaf_new_nodes_paste_whole(struct tree_balance *tb, in balance_leaf_new_nodes_paste_whole() argument
1156 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste_whole()
1163 struct item_head *ih_check = item_head(tbS0, tb->item_pos); in balance_leaf_new_nodes_paste_whole()
1166 (tb->pos_in_item != ih_item_len(ih_check) || in balance_leaf_new_nodes_paste_whole()
1167 tb->insert_size[0] <= 0)) in balance_leaf_new_nodes_paste_whole()
1168 reiserfs_panic(tb->tb_sb, in balance_leaf_new_nodes_paste_whole()
1173 leaf_mi = leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], in balance_leaf_new_nodes_paste_whole()
1174 tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_paste_whole()
1181 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_paste_whole()
1182 leaf_paste_in_buffer(&bi, tb->item_pos - n + tb->snum[i], in balance_leaf_new_nodes_paste_whole()
1183 tb->pos_in_item, tb->insert_size[0], in balance_leaf_new_nodes_paste_whole()
1184 body, tb->zeroes_num); in balance_leaf_new_nodes_paste_whole()
1186 pasted = item_head(tb->S_new[i], tb->item_pos - n + in balance_leaf_new_nodes_paste_whole()
1187 tb->snum[i]); in balance_leaf_new_nodes_paste_whole()
1189 leaf_paste_entries(&bi, tb->item_pos - n + tb->snum[i], in balance_leaf_new_nodes_paste_whole()
1190 tb->pos_in_item, 1, in balance_leaf_new_nodes_paste_whole()
1192 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_new_nodes_paste_whole()
1198 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_new_nodes_paste_whole()
1201 static void balance_leaf_new_nodes_paste(struct tree_balance *tb, in balance_leaf_new_nodes_paste() argument
1208 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste()
1212 if (n - tb->snum[i] > tb->item_pos) { in balance_leaf_new_nodes_paste()
1213 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, in balance_leaf_new_nodes_paste()
1214 tb->snum[i], tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_paste()
1220 if (tb->item_pos == n - tb->snum[i] && tb->sbytes[i] != -1) in balance_leaf_new_nodes_paste()
1222 balance_leaf_new_nodes_paste_shift(tb, ih, body, insert_key, in balance_leaf_new_nodes_paste()
1226 balance_leaf_new_nodes_paste_whole(tb, ih, body, insert_key, in balance_leaf_new_nodes_paste()
1231 static void balance_leaf_new_nodes(struct tree_balance *tb, in balance_leaf_new_nodes() argument
1239 for (i = tb->blknum[0] - 2; i >= 0; i--) { in balance_leaf_new_nodes()
1242 RFALSE(!tb->snum[i], in balance_leaf_new_nodes()
1244 tb->snum[i]); in balance_leaf_new_nodes()
1248 tb->S_new[i] = get_FEB(tb); in balance_leaf_new_nodes()
1251 set_blkh_level(B_BLK_HEAD(tb->S_new[i]), DISK_LEAF_NODE_LEVEL); in balance_leaf_new_nodes()
1254 balance_leaf_new_nodes_insert(tb, ih, body, insert_key, in balance_leaf_new_nodes()
1257 balance_leaf_new_nodes_paste(tb, ih, body, insert_key, in balance_leaf_new_nodes()
1260 memcpy(insert_key + i, leaf_key(tb->S_new[i], 0), KEY_SIZE); in balance_leaf_new_nodes()
1261 insert_ptr[i] = tb->S_new[i]; in balance_leaf_new_nodes()
1263 RFALSE(!buffer_journaled(tb->S_new[i]) in balance_leaf_new_nodes()
1264 || buffer_journal_dirty(tb->S_new[i]) in balance_leaf_new_nodes()
1265 || buffer_dirty(tb->S_new[i]), in balance_leaf_new_nodes()
1267 i, tb->S_new[i]); in balance_leaf_new_nodes()
1271 static void balance_leaf_finish_node_insert(struct tree_balance *tb, in balance_leaf_finish_node_insert() argument
1275 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_finish_node_insert()
1277 buffer_info_init_tbS0(tb, &bi); in balance_leaf_finish_node_insert()
1278 leaf_insert_into_buf(&bi, tb->item_pos, ih, body, tb->zeroes_num); in balance_leaf_finish_node_insert()
1281 if (tb->item_pos == 0) { in balance_leaf_finish_node_insert()
1282 if (tb->CFL[0]) /* can be 0 in reiserfsck */ in balance_leaf_finish_node_insert()
1283 replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); in balance_leaf_finish_node_insert()
1288 static void balance_leaf_finish_node_paste_dirent(struct tree_balance *tb, in balance_leaf_finish_node_paste_dirent() argument
1292 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_finish_node_paste_dirent()
1293 struct item_head *pasted = item_head(tbS0, tb->item_pos); in balance_leaf_finish_node_paste_dirent()
1296 if (tb->pos_in_item >= 0 && tb->pos_in_item <= ih_entry_count(pasted)) { in balance_leaf_finish_node_paste_dirent()
1297 RFALSE(!tb->insert_size[0], in balance_leaf_finish_node_paste_dirent()
1301 buffer_info_init_tbS0(tb, &bi); in balance_leaf_finish_node_paste_dirent()
1302 leaf_paste_in_buffer(&bi, tb->item_pos, tb->pos_in_item, in balance_leaf_finish_node_paste_dirent()
1303 tb->insert_size[0], body, tb->zeroes_num); in balance_leaf_finish_node_paste_dirent()
1306 leaf_paste_entries(&bi, tb->item_pos, tb->pos_in_item, 1, in balance_leaf_finish_node_paste_dirent()
1308 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_finish_node_paste_dirent()
1310 if (!tb->item_pos && !tb->pos_in_item) { in balance_leaf_finish_node_paste_dirent()
1311 RFALSE(!tb->CFL[0] || !tb->L[0], in balance_leaf_finish_node_paste_dirent()
1313 if (tb->CFL[0]) in balance_leaf_finish_node_paste_dirent()
1314 replace_key(tb, tb->CFL[0], tb->lkey[0], in balance_leaf_finish_node_paste_dirent()
1318 tb->insert_size[0] = 0; in balance_leaf_finish_node_paste_dirent()
1322 static void balance_leaf_finish_node_paste(struct tree_balance *tb, in balance_leaf_finish_node_paste() argument
1326 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_finish_node_paste()
1328 struct item_head *pasted = item_head(tbS0, tb->item_pos); in balance_leaf_finish_node_paste()
1332 balance_leaf_finish_node_paste_dirent(tb, ih, body); in balance_leaf_finish_node_paste()
1338 if (tb->pos_in_item == ih_item_len(pasted)) { in balance_leaf_finish_node_paste()
1339 RFALSE(tb->insert_size[0] <= 0, in balance_leaf_finish_node_paste()
1341 tb->insert_size[0]); in balance_leaf_finish_node_paste()
1342 buffer_info_init_tbS0(tb, &bi); in balance_leaf_finish_node_paste()
1343 leaf_paste_in_buffer(&bi, tb->item_pos, in balance_leaf_finish_node_paste()
1344 tb->pos_in_item, tb->insert_size[0], body, in balance_leaf_finish_node_paste()
1345 tb->zeroes_num); in balance_leaf_finish_node_paste()
1350 tb->insert_size[0] = 0; in balance_leaf_finish_node_paste()
1353 else if (tb->insert_size[0]) { in balance_leaf_finish_node_paste()
1355 reiserfs_panic(tb->tb_sb, "PAP-12285", in balance_leaf_finish_node_paste()
1356 "insert_size must be 0 (%d)", tb->insert_size[0]); in balance_leaf_finish_node_paste()
1366 static void balance_leaf_finish_node(struct tree_balance *tb, in balance_leaf_finish_node() argument
1371 if (0 <= tb->item_pos && tb->item_pos < tb->s0num) { in balance_leaf_finish_node()
1373 balance_leaf_finish_node_insert(tb, ih, body); in balance_leaf_finish_node()
1375 balance_leaf_finish_node_paste(tb, ih, body); in balance_leaf_finish_node()
1393 static int balance_leaf(struct tree_balance *tb, struct item_head *ih, in balance_leaf() argument
1398 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf()
1400 PROC_INFO_INC(tb->tb_sb, balance_at[0]); in balance_leaf()
1403 if (tb->insert_size[0] < 0) in balance_leaf()
1404 return balance_leaf_when_delete(tb, flag); in balance_leaf()
1406 tb->item_pos = PATH_LAST_POSITION(tb->tb_path), in balance_leaf()
1407 tb->pos_in_item = tb->tb_path->pos_in_item, in balance_leaf()
1408 tb->zeroes_num = 0; in balance_leaf()
1410 tb->zeroes_num = ih_item_len(ih); in balance_leaf()
1417 && is_indirect_le_ih(item_head(tbS0, tb->item_pos))) in balance_leaf()
1418 tb->pos_in_item *= UNFM_P_SIZE; in balance_leaf()
1420 body += balance_leaf_left(tb, ih, body, flag); in balance_leaf()
1424 tb->item_pos -= (tb->lnum[0] - ((tb->lbytes != -1) ? 1 : 0)); in balance_leaf()
1426 balance_leaf_right(tb, ih, body, flag); in balance_leaf()
1429 RFALSE(tb->blknum[0] > 3, in balance_leaf()
1430 "PAP-12180: blknum can not be %d. It must be <= 3", tb->blknum[0]); in balance_leaf()
1431 RFALSE(tb->blknum[0] < 0, in balance_leaf()
1432 "PAP-12185: blknum can not be %d. It must be >= 0", tb->blknum[0]); in balance_leaf()
1439 if (tb->blknum[0] == 0) { /* node S[0] is empty now */ in balance_leaf()
1441 RFALSE(!tb->lnum[0] || !tb->rnum[0], in balance_leaf()
1448 if (tb->CFL[0]) { in balance_leaf()
1449 if (!tb->CFR[0]) in balance_leaf()
1450 reiserfs_panic(tb->tb_sb, "vs-12195", in balance_leaf()
1452 copy_key(internal_key(tb->CFL[0], tb->lkey[0]), in balance_leaf()
1453 internal_key(tb->CFR[0], tb->rkey[0])); in balance_leaf()
1454 do_balance_mark_internal_dirty(tb, tb->CFL[0], 0); in balance_leaf()
1457 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf()
1461 balance_leaf_new_nodes(tb, ih, body, insert_key, insert_ptr, flag); in balance_leaf()
1463 balance_leaf_finish_node(tb, ih, body, flag); in balance_leaf()
1466 if (flag == M_PASTE && tb->insert_size[0]) { in balance_leaf()
1468 reiserfs_panic(tb->tb_sb, in balance_leaf()
1470 tb->insert_size[0]); in balance_leaf()
1494 struct buffer_head *get_FEB(struct tree_balance *tb) in get_FEB() argument
1500 if (tb->FEB[i] != NULL) in get_FEB()
1504 reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty"); in get_FEB()
1506 buffer_info_init_bh(tb, &bi, tb->FEB[i]); in get_FEB()
1508 set_buffer_uptodate(tb->FEB[i]); in get_FEB()
1509 tb->used[i] = tb->FEB[i]; in get_FEB()
1510 tb->FEB[i] = NULL; in get_FEB()
1512 return tb->used[i]; in get_FEB()
1516 static void store_thrown(struct tree_balance *tb, struct buffer_head *bh) in store_thrown() argument
1521 reiserfs_warning(tb->tb_sb, "reiserfs-12320", in store_thrown()
1523 for (i = 0; i < ARRAY_SIZE(tb->thrown); i++) in store_thrown()
1524 if (!tb->thrown[i]) { in store_thrown()
1525 tb->thrown[i] = bh; in store_thrown()
1529 reiserfs_warning(tb->tb_sb, "reiserfs-12321", in store_thrown()
1533 static void free_thrown(struct tree_balance *tb) in free_thrown() argument
1537 for (i = 0; i < ARRAY_SIZE(tb->thrown); i++) { in free_thrown()
1538 if (tb->thrown[i]) { in free_thrown()
1539 blocknr = tb->thrown[i]->b_blocknr; in free_thrown()
1540 if (buffer_dirty(tb->thrown[i])) in free_thrown()
1541 reiserfs_warning(tb->tb_sb, "reiserfs-12322", in free_thrown()
1544 brelse(tb->thrown[i]); /* incremented in store_thrown */ in free_thrown()
1545 reiserfs_free_block(tb->transaction_handle, NULL, in free_thrown()
1551 void reiserfs_invalidate_buffer(struct tree_balance *tb, struct buffer_head *bh) in reiserfs_invalidate_buffer() argument
1559 store_thrown(tb, bh); in reiserfs_invalidate_buffer()
1563 void replace_key(struct tree_balance *tb, struct buffer_head *dest, int n_dest, in replace_key() argument
1587 do_balance_mark_internal_dirty(tb, dest, 0); in replace_key()
1590 int get_left_neighbor_position(struct tree_balance *tb, int h) in get_left_neighbor_position() argument
1592 int Sh_position = PATH_H_POSITION(tb->tb_path, h + 1); in get_left_neighbor_position()
1594 RFALSE(PATH_H_PPARENT(tb->tb_path, h) == NULL || tb->FL[h] == NULL, in get_left_neighbor_position()
1596 h, tb->FL[h], h, PATH_H_PPARENT(tb->tb_path, h)); in get_left_neighbor_position()
1599 return B_NR_ITEMS(tb->FL[h]); in get_left_neighbor_position()
1604 int get_right_neighbor_position(struct tree_balance *tb, int h) in get_right_neighbor_position() argument
1606 int Sh_position = PATH_H_POSITION(tb->tb_path, h + 1); in get_right_neighbor_position()
1608 RFALSE(PATH_H_PPARENT(tb->tb_path, h) == NULL || tb->FR[h] == NULL, in get_right_neighbor_position()
1610 h, PATH_H_PPARENT(tb->tb_path, h), h, tb->FR[h]); in get_right_neighbor_position()
1612 if (Sh_position == B_NR_ITEMS(PATH_H_PPARENT(tb->tb_path, h))) in get_right_neighbor_position()
1647 static int locked_or_not_in_tree(struct tree_balance *tb, in locked_or_not_in_tree() argument
1652 reiserfs_warning(tb->tb_sb, "vs-12339", "%s (%b)", which, bh); in locked_or_not_in_tree()
1658 static int check_before_balancing(struct tree_balance *tb) in check_before_balancing() argument
1662 if (REISERFS_SB(tb->tb_sb)->cur_tb) { in check_before_balancing()
1663 reiserfs_panic(tb->tb_sb, "vs-12335", "suspect that schedule " in check_before_balancing()
1674 if (tb->lnum[0]) { in check_before_balancing()
1675 retval |= locked_or_not_in_tree(tb, tb->L[0], "L[0]"); in check_before_balancing()
1676 retval |= locked_or_not_in_tree(tb, tb->FL[0], "FL[0]"); in check_before_balancing()
1677 retval |= locked_or_not_in_tree(tb, tb->CFL[0], "CFL[0]"); in check_before_balancing()
1678 check_leaf(tb->L[0]); in check_before_balancing()
1680 if (tb->rnum[0]) { in check_before_balancing()
1681 retval |= locked_or_not_in_tree(tb, tb->R[0], "R[0]"); in check_before_balancing()
1682 retval |= locked_or_not_in_tree(tb, tb->FR[0], "FR[0]"); in check_before_balancing()
1683 retval |= locked_or_not_in_tree(tb, tb->CFR[0], "CFR[0]"); in check_before_balancing()
1684 check_leaf(tb->R[0]); in check_before_balancing()
1686 retval |= locked_or_not_in_tree(tb, PATH_PLAST_BUFFER(tb->tb_path), in check_before_balancing()
1688 check_leaf(PATH_PLAST_BUFFER(tb->tb_path)); in check_before_balancing()
1693 static void check_after_balance_leaf(struct tree_balance *tb) in check_after_balance_leaf() argument
1695 if (tb->lnum[0]) { in check_after_balance_leaf()
1696 if (B_FREE_SPACE(tb->L[0]) != in check_after_balance_leaf()
1697 MAX_CHILD_SIZE(tb->L[0]) - in check_after_balance_leaf()
1699 (tb->FL[0], get_left_neighbor_position(tb, 0)))) { in check_after_balance_leaf()
1701 reiserfs_panic(tb->tb_sb, "PAP-12355", in check_after_balance_leaf()
1705 if (tb->rnum[0]) { in check_after_balance_leaf()
1706 if (B_FREE_SPACE(tb->R[0]) != in check_after_balance_leaf()
1707 MAX_CHILD_SIZE(tb->R[0]) - in check_after_balance_leaf()
1709 (tb->FR[0], get_right_neighbor_position(tb, 0)))) { in check_after_balance_leaf()
1711 reiserfs_panic(tb->tb_sb, "PAP-12360", in check_after_balance_leaf()
1715 if (PATH_H_PBUFFER(tb->tb_path, 1) && in check_after_balance_leaf()
1716 (B_FREE_SPACE(PATH_H_PBUFFER(tb->tb_path, 0)) != in check_after_balance_leaf()
1717 (MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)) - in check_after_balance_leaf()
1718 dc_size(B_N_CHILD(PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1719 PATH_H_POSITION(tb->tb_path, 1)))))) { in check_after_balance_leaf()
1720 int left = B_FREE_SPACE(PATH_H_PBUFFER(tb->tb_path, 0)); in check_after_balance_leaf()
1721 int right = (MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)) - in check_after_balance_leaf()
1722 dc_size(B_N_CHILD(PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1723 PATH_H_POSITION(tb->tb_path, in check_after_balance_leaf()
1726 reiserfs_warning(tb->tb_sb, "reiserfs-12363", in check_after_balance_leaf()
1730 MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)), in check_after_balance_leaf()
1731 PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1732 PATH_H_POSITION(tb->tb_path, 1), in check_after_balance_leaf()
1734 (PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1735 PATH_H_POSITION(tb->tb_path, 1))), in check_after_balance_leaf()
1737 reiserfs_panic(tb->tb_sb, "PAP-12365", "S is incorrect"); in check_after_balance_leaf()
1741 static void check_leaf_level(struct tree_balance *tb) in check_leaf_level() argument
1743 check_leaf(tb->L[0]); in check_leaf_level()
1744 check_leaf(tb->R[0]); in check_leaf_level()
1745 check_leaf(PATH_PLAST_BUFFER(tb->tb_path)); in check_leaf_level()
1748 static void check_internal_levels(struct tree_balance *tb) in check_internal_levels() argument
1753 for (h = 1; tb->insert_size[h]; h++) { in check_internal_levels()
1754 check_internal_node(tb->tb_sb, PATH_H_PBUFFER(tb->tb_path, h), in check_internal_levels()
1756 if (tb->lnum[h]) in check_internal_levels()
1757 check_internal_node(tb->tb_sb, tb->L[h], "BAD L"); in check_internal_levels()
1758 if (tb->rnum[h]) in check_internal_levels()
1759 check_internal_node(tb->tb_sb, tb->R[h], "BAD R"); in check_internal_levels()
1800 static inline void do_balance_starts(struct tree_balance *tb) in do_balance_starts() argument
1811 RFALSE(check_before_balancing(tb), "PAP-12340: locked buffers in TB"); in do_balance_starts()
1813 REISERFS_SB(tb->tb_sb)->cur_tb = tb; in do_balance_starts()
1817 static inline void do_balance_completed(struct tree_balance *tb) in do_balance_completed() argument
1821 check_leaf_level(tb); in do_balance_completed()
1822 check_internal_levels(tb); in do_balance_completed()
1823 REISERFS_SB(tb->tb_sb)->cur_tb = NULL; in do_balance_completed()
1832 REISERFS_SB(tb->tb_sb)->s_do_balance++; in do_balance_completed()
1835 unfix_nodes(tb); in do_balance_completed()
1837 free_thrown(tb); in do_balance_completed()
1858 void do_balance(struct tree_balance *tb, struct item_head *ih, in do_balance() argument
1875 tb->tb_mode = flag; in do_balance()
1876 tb->need_balance_dirty = 0; in do_balance()
1878 if (FILESYSTEM_CHANGED_TB(tb)) { in do_balance()
1879 reiserfs_panic(tb->tb_sb, "clm-6000", "fs generation has " in do_balance()
1883 if (!tb->insert_size[0]) { in do_balance()
1884 reiserfs_warning(tb->tb_sb, "PAP-12350", in do_balance()
1886 unfix_nodes(tb); in do_balance()
1890 atomic_inc(&fs_generation(tb->tb_sb)); in do_balance()
1891 do_balance_starts(tb); in do_balance()
1898 child_pos = PATH_H_B_ITEM_ORDER(tb->tb_path, 0) + in do_balance()
1899 balance_leaf(tb, ih, body, flag, insert_key, insert_ptr); in do_balance()
1902 check_after_balance_leaf(tb); in do_balance()
1906 for (h = 1; h < MAX_HEIGHT && tb->insert_size[h]; h++) in do_balance()
1907 child_pos = balance_internal(tb, h, child_pos, insert_key, in do_balance()
1910 do_balance_completed(tb); in do_balance()