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()
245 RFALSE(tb->FR[0] && B_LEVEL(tb->FR[0]) != DISK_LEAF_NODE_LEVEL + 1, in balance_leaf_when_delete()
246 "vs- 12000: level: wrong FR %z", tb->FR[0]); in balance_leaf_when_delete()
247 RFALSE(tb->blknum[0] > 1, in balance_leaf_when_delete()
248 "PAP-12005: tb->blknum == %d, can not be > 1", tb->blknum[0]); in balance_leaf_when_delete()
249 RFALSE(!tb->blknum[0] && !PATH_H_PPARENT(tb->tb_path, 0), in balance_leaf_when_delete()
252 buffer_info_init_tbS0(tb, &bi); in balance_leaf_when_delete()
258 balance_leaf_when_delete_del(tb); in balance_leaf_when_delete()
260 balance_leaf_when_delete_cut(tb); in balance_leaf_when_delete()
271 if (tb->lnum[0]) in balance_leaf_when_delete()
272 return balance_leaf_when_delete_left(tb); in balance_leaf_when_delete()
274 if (tb->rnum[0] == -1) { in balance_leaf_when_delete()
276 leaf_shift_right(tb, n, -1); in balance_leaf_when_delete()
277 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf_when_delete()
281 RFALSE(tb->rnum[0], in balance_leaf_when_delete()
282 "PAP-12065: bad rnum parameter must be 0 (%d)", tb->rnum[0]); in balance_leaf_when_delete()
286 static unsigned int balance_leaf_insert_left(struct tree_balance *tb, in balance_leaf_insert_left() argument
292 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_insert_left()
295 if (tb->item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) { in balance_leaf_insert_left()
299 ret = leaf_shift_left(tb, tb->lnum[0] - 1, -1); in balance_leaf_insert_left()
302 new_item_len = ih_item_len(ih) - tb->lbytes; in balance_leaf_insert_left()
312 buffer_info_init_left(tb, &bi); in balance_leaf_insert_left()
313 leaf_insert_into_buf(&bi, n + tb->item_pos - ret, ih, body, in balance_leaf_insert_left()
314 min_t(int, tb->zeroes_num, ih_item_len(ih))); in balance_leaf_insert_left()
322 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_insert_left()
324 add_le_ih_k_offset(ih, tb->lbytes << shift); in balance_leaf_insert_left()
327 if (tb->lbytes > tb->zeroes_num) { in balance_leaf_insert_left()
328 body_shift_bytes = tb->lbytes - tb->zeroes_num; in balance_leaf_insert_left()
329 tb->zeroes_num = 0; in balance_leaf_insert_left()
331 tb->zeroes_num -= tb->lbytes; in balance_leaf_insert_left()
339 ret = leaf_shift_left(tb, tb->lnum[0] - 1, tb->lbytes); in balance_leaf_insert_left()
342 buffer_info_init_left(tb, &bi); in balance_leaf_insert_left()
343 leaf_insert_into_buf(&bi, n + tb->item_pos - ret, ih, body, in balance_leaf_insert_left()
344 tb->zeroes_num); in balance_leaf_insert_left()
345 tb->insert_size[0] = 0; in balance_leaf_insert_left()
346 tb->zeroes_num = 0; in balance_leaf_insert_left()
351 static void balance_leaf_paste_left_shift_dirent(struct tree_balance *tb, in balance_leaf_paste_left_shift_dirent() argument
355 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_paste_left_shift_dirent()
358 RFALSE(tb->zeroes_num, in balance_leaf_paste_left_shift_dirent()
362 if (tb->lbytes > tb->pos_in_item) { in balance_leaf_paste_left_shift_dirent()
365 int ret, l_pos_in_item = tb->pos_in_item; in balance_leaf_paste_left_shift_dirent()
371 ret = leaf_shift_left(tb, tb->lnum[0], tb->lbytes - 1); in balance_leaf_paste_left_shift_dirent()
372 if (ret && !tb->item_pos) { in balance_leaf_paste_left_shift_dirent()
373 pasted = item_head(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1); in balance_leaf_paste_left_shift_dirent()
375 (tb->lbytes - 1); in balance_leaf_paste_left_shift_dirent()
379 buffer_info_init_left(tb, &bi); in balance_leaf_paste_left_shift_dirent()
380 leaf_paste_in_buffer(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_shift_dirent()
381 l_pos_in_item, tb->insert_size[0], in balance_leaf_paste_left_shift_dirent()
382 body, tb->zeroes_num); in balance_leaf_paste_left_shift_dirent()
395 leaf_paste_entries(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_shift_dirent()
398 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_left_shift_dirent()
399 tb->insert_size[0] = 0; in balance_leaf_paste_left_shift_dirent()
406 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_paste_left_shift_dirent()
410 tb->pos_in_item -= tb->lbytes; in balance_leaf_paste_left_shift_dirent()
413 static unsigned int balance_leaf_paste_left_shift(struct tree_balance *tb, in balance_leaf_paste_left_shift() argument
417 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_left_shift()
418 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_paste_left_shift()
422 if (is_direntry_le_ih(item_head(tbS0, tb->item_pos))) { in balance_leaf_paste_left_shift()
423 balance_leaf_paste_left_shift_dirent(tb, ih, body); in balance_leaf_paste_left_shift()
427 RFALSE(tb->lbytes <= 0, in balance_leaf_paste_left_shift()
429 "lbytes=%d", tb->lbytes); in balance_leaf_paste_left_shift()
430 RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)), in balance_leaf_paste_left_shift()
433 ih_item_len(item_head(tbS0, tb->item_pos)), tb->pos_in_item); in balance_leaf_paste_left_shift()
436 if (tb->lbytes >= tb->pos_in_item) { in balance_leaf_paste_left_shift()
442 tbS0_pos_ih = item_head(tbS0, tb->item_pos); in balance_leaf_paste_left_shift()
449 l_n = tb->lbytes - tb->pos_in_item; in balance_leaf_paste_left_shift()
452 tb->insert_size[0] -= l_n; in balance_leaf_paste_left_shift()
454 RFALSE(tb->insert_size[0] <= 0, in balance_leaf_paste_left_shift()
456 "L[0]. insert_size=%d", tb->insert_size[0]); in balance_leaf_paste_left_shift()
458 ret = leaf_shift_left(tb, tb->lnum[0], in balance_leaf_paste_left_shift()
461 tbL0_ih = item_head(tb->L[0], n + tb->item_pos - ret); in balance_leaf_paste_left_shift()
464 buffer_info_init_left(tb, &bi); in balance_leaf_paste_left_shift()
465 leaf_paste_in_buffer(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_shift()
467 min_t(int, l_n, tb->zeroes_num)); in balance_leaf_paste_left_shift()
478 leaf_key(tb->L[0], n + tb->item_pos - ret)), in balance_leaf_paste_left_shift()
482 int shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_paste_left_shift()
490 left_delim_key = internal_key(tb->CFL[0], tb->lkey[0]); in balance_leaf_paste_left_shift()
497 if (l_n > tb->zeroes_num) { in balance_leaf_paste_left_shift()
498 body_shift_bytes = l_n - tb->zeroes_num; in balance_leaf_paste_left_shift()
499 tb->zeroes_num = 0; in balance_leaf_paste_left_shift()
501 tb->zeroes_num -= l_n; in balance_leaf_paste_left_shift()
502 tb->pos_in_item = 0; in balance_leaf_paste_left_shift()
505 leaf_key(tb->L[0], in balance_leaf_paste_left_shift()
506 B_NR_ITEMS(tb->L[0]) - 1)) || in balance_leaf_paste_left_shift()
515 tb->pos_in_item -= tb->lbytes; in balance_leaf_paste_left_shift()
517 RFALSE(tb->pos_in_item <= 0, in balance_leaf_paste_left_shift()
519 tb->pos_in_item); in balance_leaf_paste_left_shift()
525 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_paste_left_shift()
532 static void balance_leaf_paste_left_whole(struct tree_balance *tb, in balance_leaf_paste_left_whole() argument
536 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_left_whole()
537 int n = B_NR_ITEMS(tb->L[0]); in balance_leaf_paste_left_whole()
543 if (!tb->item_pos && in balance_leaf_paste_left_whole()
549 pasted = item_head(tb->L[0], n - 1); in balance_leaf_paste_left_whole()
551 tb->pos_in_item += ih_entry_count(pasted); in balance_leaf_paste_left_whole()
553 tb->pos_in_item += ih_item_len(pasted); in balance_leaf_paste_left_whole()
560 ret = leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_paste_left_whole()
563 buffer_info_init_left(tb, &bi); in balance_leaf_paste_left_whole()
564 leaf_paste_in_buffer(&bi, n + tb->item_pos - ret, tb->pos_in_item, in balance_leaf_paste_left_whole()
565 tb->insert_size[0], body, tb->zeroes_num); in balance_leaf_paste_left_whole()
568 pasted = item_head(tb->L[0], n + tb->item_pos - ret); in balance_leaf_paste_left_whole()
570 leaf_paste_entries(&bi, n + tb->item_pos - ret, in balance_leaf_paste_left_whole()
571 tb->pos_in_item, 1, in balance_leaf_paste_left_whole()
573 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_left_whole()
582 tb->insert_size[0] = 0; in balance_leaf_paste_left_whole()
583 tb->zeroes_num = 0; in balance_leaf_paste_left_whole()
586 static unsigned int balance_leaf_paste_left(struct tree_balance *tb, in balance_leaf_paste_left() argument
591 if (tb->item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) in balance_leaf_paste_left()
592 return balance_leaf_paste_left_shift(tb, ih, body); in balance_leaf_paste_left()
594 balance_leaf_paste_left_whole(tb, ih, body); in balance_leaf_paste_left()
599 static unsigned int balance_leaf_left(struct tree_balance *tb, in balance_leaf_left() argument
603 if (tb->lnum[0] <= 0) in balance_leaf_left()
607 if (tb->item_pos < tb->lnum[0]) { in balance_leaf_left()
611 return balance_leaf_insert_left(tb, ih, body); in balance_leaf_left()
613 return balance_leaf_paste_left(tb, ih, body); in balance_leaf_left()
616 leaf_shift_left(tb, tb->lnum[0], tb->lbytes); in balance_leaf_left()
621 static void balance_leaf_insert_right(struct tree_balance *tb, in balance_leaf_insert_right() argument
626 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_insert_right()
631 if (n - tb->rnum[0] >= tb->item_pos) { in balance_leaf_insert_right()
632 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_insert_right()
639 if (tb->item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) { in balance_leaf_insert_right()
645 leaf_shift_right(tb, tb->rnum[0] - 1, -1); in balance_leaf_insert_right()
657 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_insert_right()
658 offset = le_ih_k_offset(ih) + ((old_len - tb->rbytes) << shift); in balance_leaf_insert_right()
660 put_ih_item_len(ih, tb->rbytes); in balance_leaf_insert_right()
663 buffer_info_init_right(tb, &bi); in balance_leaf_insert_right()
664 if ((old_len - tb->rbytes) > tb->zeroes_num) { in balance_leaf_insert_right()
666 r_body = body + (old_len - tb->rbytes) - tb->zeroes_num; in balance_leaf_insert_right()
669 r_zeroes_number = tb->zeroes_num - in balance_leaf_insert_right()
670 (old_len - tb->rbytes); in balance_leaf_insert_right()
671 tb->zeroes_num -= r_zeroes_number; in balance_leaf_insert_right()
677 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_insert_right()
684 put_ih_item_len(ih, old_len - tb->rbytes); in balance_leaf_insert_right()
686 tb->insert_size[0] -= tb->rbytes; in balance_leaf_insert_right()
692 leaf_shift_right(tb, tb->rnum[0] - 1, tb->rbytes); in balance_leaf_insert_right()
695 buffer_info_init_right(tb, &bi); in balance_leaf_insert_right()
696 leaf_insert_into_buf(&bi, tb->item_pos - n + tb->rnum[0] - 1, in balance_leaf_insert_right()
697 ih, body, tb->zeroes_num); in balance_leaf_insert_right()
699 if (tb->item_pos - n + tb->rnum[0] - 1 == 0) in balance_leaf_insert_right()
700 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_insert_right()
702 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_insert_right()
707 static void balance_leaf_paste_right_shift_dirent(struct tree_balance *tb, in balance_leaf_paste_right_shift_dirent() argument
711 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right_shift_dirent()
715 RFALSE(tb->zeroes_num, in balance_leaf_paste_right_shift_dirent()
717 entry_count = ih_entry_count(item_head(tbS0, tb->item_pos)); in balance_leaf_paste_right_shift_dirent()
720 if (entry_count - tb->rbytes < tb->pos_in_item) { in balance_leaf_paste_right_shift_dirent()
723 RFALSE(tb->rbytes - 1 >= entry_count || !tb->insert_size[0], in balance_leaf_paste_right_shift_dirent()
725 "rbytes=%d, entry_count=%d", tb->rbytes, entry_count); in balance_leaf_paste_right_shift_dirent()
732 leaf_shift_right(tb, tb->rnum[0], tb->rbytes - 1); in balance_leaf_paste_right_shift_dirent()
735 paste_entry_position = tb->pos_in_item - entry_count + in balance_leaf_paste_right_shift_dirent()
736 tb->rbytes - 1; in balance_leaf_paste_right_shift_dirent()
737 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_shift_dirent()
739 tb->insert_size[0], body, tb->zeroes_num); in balance_leaf_paste_right_shift_dirent()
744 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_right_shift_dirent()
748 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_paste_right_shift_dirent()
750 tb->insert_size[0] = 0; in balance_leaf_paste_right_shift_dirent()
751 tb->pos_in_item++; in balance_leaf_paste_right_shift_dirent()
754 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_paste_right_shift_dirent()
758 static void balance_leaf_paste_right_shift(struct tree_balance *tb, in balance_leaf_paste_right_shift() argument
762 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right_shift()
769 if (is_direntry_le_ih(item_head(tbS0, tb->item_pos))) { in balance_leaf_paste_right_shift()
770 balance_leaf_paste_right_shift_dirent(tb, ih, body); in balance_leaf_paste_right_shift()
780 n_shift = tb->rbytes - tb->insert_size[0]; in balance_leaf_paste_right_shift()
784 RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)), in balance_leaf_paste_right_shift()
786 "pos_in_item=%d", tb->pos_in_item, in balance_leaf_paste_right_shift()
787 ih_item_len(item_head(tbS0, tb->item_pos))); in balance_leaf_paste_right_shift()
789 leaf_shift_right(tb, tb->rnum[0], n_shift); in balance_leaf_paste_right_shift()
795 n_rem = tb->insert_size[0] - tb->rbytes; in balance_leaf_paste_right_shift()
801 version = ih_version(item_head(tb->R[0], 0)); in balance_leaf_paste_right_shift()
803 if (is_indirect_le_key(version, leaf_key(tb->R[0], 0))) { in balance_leaf_paste_right_shift()
804 int shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_paste_right_shift()
808 add_le_key_k_offset(version, leaf_key(tb->R[0], 0), temp_rem); in balance_leaf_paste_right_shift()
809 add_le_key_k_offset(version, internal_key(tb->CFR[0], tb->rkey[0]), in balance_leaf_paste_right_shift()
812 do_balance_mark_internal_dirty(tb, tb->CFR[0], 0); in balance_leaf_paste_right_shift()
815 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_shift()
816 if (n_rem > tb->zeroes_num) { in balance_leaf_paste_right_shift()
818 r_body = body + n_rem - tb->zeroes_num; in balance_leaf_paste_right_shift()
821 r_zeroes_number = tb->zeroes_num - n_rem; in balance_leaf_paste_right_shift()
822 tb->zeroes_num -= r_zeroes_number; in balance_leaf_paste_right_shift()
825 leaf_paste_in_buffer(&bi, 0, n_shift, tb->insert_size[0] - n_rem, in balance_leaf_paste_right_shift()
828 if (is_indirect_le_ih(item_head(tb->R[0], 0))) in balance_leaf_paste_right_shift()
829 set_ih_free_space(item_head(tb->R[0], 0), 0); in balance_leaf_paste_right_shift()
831 tb->insert_size[0] = n_rem; in balance_leaf_paste_right_shift()
833 tb->pos_in_item++; in balance_leaf_paste_right_shift()
836 static void balance_leaf_paste_right_whole(struct tree_balance *tb, in balance_leaf_paste_right_whole() argument
840 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right_whole()
845 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_whole()
846 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_paste_right_whole()
849 if (tb->pos_in_item >= 0) { in balance_leaf_paste_right_whole()
850 buffer_info_init_right(tb, &bi); in balance_leaf_paste_right_whole()
851 leaf_paste_in_buffer(&bi, tb->item_pos - n + tb->rnum[0], in balance_leaf_paste_right_whole()
852 tb->pos_in_item, tb->insert_size[0], body, in balance_leaf_paste_right_whole()
853 tb->zeroes_num); in balance_leaf_paste_right_whole()
857 pasted = item_head(tb->R[0], tb->item_pos - n + tb->rnum[0]); in balance_leaf_paste_right_whole()
858 if (is_direntry_le_ih(pasted) && tb->pos_in_item >= 0) { in balance_leaf_paste_right_whole()
859 leaf_paste_entries(&bi, tb->item_pos - n + tb->rnum[0], in balance_leaf_paste_right_whole()
860 tb->pos_in_item, 1, in balance_leaf_paste_right_whole()
862 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_paste_right_whole()
864 if (!tb->pos_in_item) { in balance_leaf_paste_right_whole()
866 RFALSE(tb->item_pos - n + tb->rnum[0], in balance_leaf_paste_right_whole()
871 replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); in balance_leaf_paste_right_whole()
877 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_paste_right_whole()
880 static void balance_leaf_paste_right(struct tree_balance *tb, in balance_leaf_paste_right() argument
884 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_paste_right()
888 if (n - tb->rnum[0] > tb->item_pos) { in balance_leaf_paste_right()
889 leaf_shift_right(tb, tb->rnum[0], tb->rbytes); in balance_leaf_paste_right()
895 if (tb->item_pos == n - tb->rnum[0] && tb->rbytes != -1) in balance_leaf_paste_right()
897 balance_leaf_paste_right_shift(tb, ih, body); in balance_leaf_paste_right()
900 balance_leaf_paste_right_whole(tb, ih, body); in balance_leaf_paste_right()
904 static void balance_leaf_right(struct tree_balance *tb, in balance_leaf_right() argument
908 if (tb->rnum[0] <= 0) in balance_leaf_right()
914 balance_leaf_insert_right(tb, ih, body); in balance_leaf_right()
916 balance_leaf_paste_right(tb, ih, body); in balance_leaf_right()
919 static void balance_leaf_new_nodes_insert(struct tree_balance *tb, in balance_leaf_new_nodes_insert() argument
926 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_insert()
932 if (n - tb->snum[i] >= tb->item_pos) { in balance_leaf_new_nodes_insert()
933 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, in balance_leaf_new_nodes_insert()
934 tb->snum[i], tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_insert()
941 if (tb->item_pos == n - tb->snum[i] + 1 && tb->sbytes[i] != -1) { in balance_leaf_new_nodes_insert()
946 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i] - 1, -1, in balance_leaf_new_nodes_insert()
947 tb->S_new[i]); in balance_leaf_new_nodes_insert()
959 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_new_nodes_insert()
962 ((old_len - tb->sbytes[i]) << shift)); in balance_leaf_new_nodes_insert()
964 put_ih_item_len(ih, tb->sbytes[i]); in balance_leaf_new_nodes_insert()
967 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_insert()
969 if ((old_len - tb->sbytes[i]) > tb->zeroes_num) { in balance_leaf_new_nodes_insert()
971 r_body = body + (old_len - tb->sbytes[i]) - in balance_leaf_new_nodes_insert()
972 tb->zeroes_num; in balance_leaf_new_nodes_insert()
975 r_zeroes_number = tb->zeroes_num - (old_len - in balance_leaf_new_nodes_insert()
976 tb->sbytes[i]); in balance_leaf_new_nodes_insert()
977 tb->zeroes_num -= r_zeroes_number; in balance_leaf_new_nodes_insert()
987 put_ih_item_len(ih, old_len - tb->sbytes[i]); in balance_leaf_new_nodes_insert()
988 tb->insert_size[0] -= tb->sbytes[i]; in balance_leaf_new_nodes_insert()
996 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, in balance_leaf_new_nodes_insert()
997 tb->snum[i] - 1, tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_insert()
1000 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_insert()
1001 leaf_insert_into_buf(&bi, tb->item_pos - n + tb->snum[i] - 1, in balance_leaf_new_nodes_insert()
1002 ih, body, tb->zeroes_num); in balance_leaf_new_nodes_insert()
1004 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_new_nodes_insert()
1009 static void balance_leaf_new_nodes_paste_dirent(struct tree_balance *tb, in balance_leaf_new_nodes_paste_dirent() argument
1016 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste_dirent()
1017 struct item_head *aux_ih = item_head(tbS0, tb->item_pos); in balance_leaf_new_nodes_paste_dirent()
1021 if (entry_count - tb->sbytes[i] < tb->pos_in_item && in balance_leaf_new_nodes_paste_dirent()
1022 tb->pos_in_item <= entry_count) { in balance_leaf_new_nodes_paste_dirent()
1025 RFALSE(!tb->insert_size[0], in balance_leaf_new_nodes_paste_dirent()
1027 RFALSE(tb->sbytes[i] - 1 >= entry_count, in balance_leaf_new_nodes_paste_dirent()
1029 tb->sbytes[i] - 1, entry_count); in balance_leaf_new_nodes_paste_dirent()
1036 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], in balance_leaf_new_nodes_paste_dirent()
1037 tb->sbytes[i] - 1, tb->S_new[i]); in balance_leaf_new_nodes_paste_dirent()
1043 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_paste_dirent()
1044 leaf_paste_in_buffer(&bi, 0, tb->pos_in_item - entry_count + in balance_leaf_new_nodes_paste_dirent()
1045 tb->sbytes[i] - 1, tb->insert_size[0], in balance_leaf_new_nodes_paste_dirent()
1046 body, tb->zeroes_num); in balance_leaf_new_nodes_paste_dirent()
1049 leaf_paste_entries(&bi, 0, tb->pos_in_item - entry_count + in balance_leaf_new_nodes_paste_dirent()
1050 tb->sbytes[i] - 1, 1, in balance_leaf_new_nodes_paste_dirent()
1052 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_new_nodes_paste_dirent()
1054 tb->insert_size[0] = 0; in balance_leaf_new_nodes_paste_dirent()
1055 tb->pos_in_item++; in balance_leaf_new_nodes_paste_dirent()
1058 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], in balance_leaf_new_nodes_paste_dirent()
1059 tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_paste_dirent()
1064 static void balance_leaf_new_nodes_paste_shift(struct tree_balance *tb, in balance_leaf_new_nodes_paste_shift() argument
1071 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste_shift()
1072 struct item_head *aux_ih = item_head(tbS0, tb->item_pos); in balance_leaf_new_nodes_paste_shift()
1081 balance_leaf_new_nodes_paste_dirent(tb, ih, body, insert_key, in balance_leaf_new_nodes_paste_shift()
1089 RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)) || in balance_leaf_new_nodes_paste_shift()
1090 tb->insert_size[0] <= 0, in balance_leaf_new_nodes_paste_shift()
1096 n_shift = tb->sbytes[i] - tb->insert_size[0]; in balance_leaf_new_nodes_paste_shift()
1099 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], n_shift, in balance_leaf_new_nodes_paste_shift()
1100 tb->S_new[i]); in balance_leaf_new_nodes_paste_shift()
1106 n_rem = tb->insert_size[0] - tb->sbytes[i]; in balance_leaf_new_nodes_paste_shift()
1111 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_paste_shift()
1112 if (n_rem > tb->zeroes_num) { in balance_leaf_new_nodes_paste_shift()
1114 r_body = body + n_rem - tb->zeroes_num; in balance_leaf_new_nodes_paste_shift()
1117 r_zeroes_number = tb->zeroes_num - n_rem; in balance_leaf_new_nodes_paste_shift()
1118 tb->zeroes_num -= r_zeroes_number; in balance_leaf_new_nodes_paste_shift()
1121 leaf_paste_in_buffer(&bi, 0, n_shift, tb->insert_size[0] - n_rem, in balance_leaf_new_nodes_paste_shift()
1124 tmp = item_head(tb->S_new[i], 0); in balance_leaf_new_nodes_paste_shift()
1128 shift = tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT; in balance_leaf_new_nodes_paste_shift()
1132 tb->insert_size[0] = n_rem; in balance_leaf_new_nodes_paste_shift()
1134 tb->pos_in_item++; in balance_leaf_new_nodes_paste_shift()
1137 static void balance_leaf_new_nodes_paste_whole(struct tree_balance *tb, in balance_leaf_new_nodes_paste_whole() argument
1145 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste_whole()
1152 struct item_head *ih_check = item_head(tbS0, tb->item_pos); in balance_leaf_new_nodes_paste_whole()
1155 (tb->pos_in_item != ih_item_len(ih_check) || in balance_leaf_new_nodes_paste_whole()
1156 tb->insert_size[0] <= 0)) in balance_leaf_new_nodes_paste_whole()
1157 reiserfs_panic(tb->tb_sb, in balance_leaf_new_nodes_paste_whole()
1162 leaf_mi = leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], in balance_leaf_new_nodes_paste_whole()
1163 tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_paste_whole()
1170 buffer_info_init_bh(tb, &bi, tb->S_new[i]); in balance_leaf_new_nodes_paste_whole()
1171 leaf_paste_in_buffer(&bi, tb->item_pos - n + tb->snum[i], in balance_leaf_new_nodes_paste_whole()
1172 tb->pos_in_item, tb->insert_size[0], in balance_leaf_new_nodes_paste_whole()
1173 body, tb->zeroes_num); in balance_leaf_new_nodes_paste_whole()
1175 pasted = item_head(tb->S_new[i], tb->item_pos - n + in balance_leaf_new_nodes_paste_whole()
1176 tb->snum[i]); in balance_leaf_new_nodes_paste_whole()
1178 leaf_paste_entries(&bi, tb->item_pos - n + tb->snum[i], in balance_leaf_new_nodes_paste_whole()
1179 tb->pos_in_item, 1, in balance_leaf_new_nodes_paste_whole()
1181 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_new_nodes_paste_whole()
1187 tb->zeroes_num = tb->insert_size[0] = 0; in balance_leaf_new_nodes_paste_whole()
1190 static void balance_leaf_new_nodes_paste(struct tree_balance *tb, in balance_leaf_new_nodes_paste() argument
1197 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_new_nodes_paste()
1201 if (n - tb->snum[i] > tb->item_pos) { in balance_leaf_new_nodes_paste()
1202 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, in balance_leaf_new_nodes_paste()
1203 tb->snum[i], tb->sbytes[i], tb->S_new[i]); in balance_leaf_new_nodes_paste()
1209 if (tb->item_pos == n - tb->snum[i] && tb->sbytes[i] != -1) in balance_leaf_new_nodes_paste()
1211 balance_leaf_new_nodes_paste_shift(tb, ih, body, insert_key, in balance_leaf_new_nodes_paste()
1215 balance_leaf_new_nodes_paste_whole(tb, ih, body, insert_key, in balance_leaf_new_nodes_paste()
1220 static void balance_leaf_new_nodes(struct tree_balance *tb, in balance_leaf_new_nodes() argument
1228 for (i = tb->blknum[0] - 2; i >= 0; i--) { in balance_leaf_new_nodes()
1231 RFALSE(!tb->snum[i], in balance_leaf_new_nodes()
1233 tb->snum[i]); in balance_leaf_new_nodes()
1237 tb->S_new[i] = get_FEB(tb); in balance_leaf_new_nodes()
1240 set_blkh_level(B_BLK_HEAD(tb->S_new[i]), DISK_LEAF_NODE_LEVEL); in balance_leaf_new_nodes()
1243 balance_leaf_new_nodes_insert(tb, ih, body, insert_key, in balance_leaf_new_nodes()
1246 balance_leaf_new_nodes_paste(tb, ih, body, insert_key, in balance_leaf_new_nodes()
1249 memcpy(insert_key + i, leaf_key(tb->S_new[i], 0), KEY_SIZE); in balance_leaf_new_nodes()
1250 insert_ptr[i] = tb->S_new[i]; in balance_leaf_new_nodes()
1252 RFALSE(!buffer_journaled(tb->S_new[i]) in balance_leaf_new_nodes()
1253 || buffer_journal_dirty(tb->S_new[i]) in balance_leaf_new_nodes()
1254 || buffer_dirty(tb->S_new[i]), in balance_leaf_new_nodes()
1256 i, tb->S_new[i]); in balance_leaf_new_nodes()
1260 static void balance_leaf_finish_node_insert(struct tree_balance *tb, in balance_leaf_finish_node_insert() argument
1264 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_finish_node_insert()
1266 buffer_info_init_tbS0(tb, &bi); in balance_leaf_finish_node_insert()
1267 leaf_insert_into_buf(&bi, tb->item_pos, ih, body, tb->zeroes_num); in balance_leaf_finish_node_insert()
1270 if (tb->item_pos == 0) { in balance_leaf_finish_node_insert()
1271 if (tb->CFL[0]) /* can be 0 in reiserfsck */ in balance_leaf_finish_node_insert()
1272 replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); in balance_leaf_finish_node_insert()
1277 static void balance_leaf_finish_node_paste_dirent(struct tree_balance *tb, in balance_leaf_finish_node_paste_dirent() argument
1281 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_finish_node_paste_dirent()
1282 struct item_head *pasted = item_head(tbS0, tb->item_pos); in balance_leaf_finish_node_paste_dirent()
1285 if (tb->pos_in_item >= 0 && tb->pos_in_item <= ih_entry_count(pasted)) { in balance_leaf_finish_node_paste_dirent()
1286 RFALSE(!tb->insert_size[0], in balance_leaf_finish_node_paste_dirent()
1290 buffer_info_init_tbS0(tb, &bi); in balance_leaf_finish_node_paste_dirent()
1291 leaf_paste_in_buffer(&bi, tb->item_pos, tb->pos_in_item, in balance_leaf_finish_node_paste_dirent()
1292 tb->insert_size[0], body, tb->zeroes_num); in balance_leaf_finish_node_paste_dirent()
1295 leaf_paste_entries(&bi, tb->item_pos, tb->pos_in_item, 1, in balance_leaf_finish_node_paste_dirent()
1297 body + DEH_SIZE, tb->insert_size[0]); in balance_leaf_finish_node_paste_dirent()
1299 if (!tb->item_pos && !tb->pos_in_item) { in balance_leaf_finish_node_paste_dirent()
1300 RFALSE(!tb->CFL[0] || !tb->L[0], in balance_leaf_finish_node_paste_dirent()
1302 if (tb->CFL[0]) in balance_leaf_finish_node_paste_dirent()
1303 replace_key(tb, tb->CFL[0], tb->lkey[0], in balance_leaf_finish_node_paste_dirent()
1307 tb->insert_size[0] = 0; in balance_leaf_finish_node_paste_dirent()
1311 static void balance_leaf_finish_node_paste(struct tree_balance *tb, in balance_leaf_finish_node_paste() argument
1315 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf_finish_node_paste()
1317 struct item_head *pasted = item_head(tbS0, tb->item_pos); in balance_leaf_finish_node_paste()
1321 balance_leaf_finish_node_paste_dirent(tb, ih, body); in balance_leaf_finish_node_paste()
1327 if (tb->pos_in_item == ih_item_len(pasted)) { in balance_leaf_finish_node_paste()
1328 RFALSE(tb->insert_size[0] <= 0, in balance_leaf_finish_node_paste()
1330 tb->insert_size[0]); in balance_leaf_finish_node_paste()
1331 buffer_info_init_tbS0(tb, &bi); in balance_leaf_finish_node_paste()
1332 leaf_paste_in_buffer(&bi, tb->item_pos, in balance_leaf_finish_node_paste()
1333 tb->pos_in_item, tb->insert_size[0], body, in balance_leaf_finish_node_paste()
1334 tb->zeroes_num); in balance_leaf_finish_node_paste()
1339 tb->insert_size[0] = 0; in balance_leaf_finish_node_paste()
1342 else if (tb->insert_size[0]) { in balance_leaf_finish_node_paste()
1344 reiserfs_panic(tb->tb_sb, "PAP-12285", in balance_leaf_finish_node_paste()
1345 "insert_size must be 0 (%d)", tb->insert_size[0]); in balance_leaf_finish_node_paste()
1355 static void balance_leaf_finish_node(struct tree_balance *tb, in balance_leaf_finish_node() argument
1360 if (0 <= tb->item_pos && tb->item_pos < tb->s0num) { in balance_leaf_finish_node()
1362 balance_leaf_finish_node_insert(tb, ih, body); in balance_leaf_finish_node()
1364 balance_leaf_finish_node_paste(tb, ih, body); in balance_leaf_finish_node()
1382 static int balance_leaf(struct tree_balance *tb, struct item_head *ih, in balance_leaf() argument
1387 struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); in balance_leaf()
1389 PROC_INFO_INC(tb->tb_sb, balance_at[0]); in balance_leaf()
1392 if (tb->insert_size[0] < 0) in balance_leaf()
1393 return balance_leaf_when_delete(tb, flag); in balance_leaf()
1395 tb->item_pos = PATH_LAST_POSITION(tb->tb_path), in balance_leaf()
1396 tb->pos_in_item = tb->tb_path->pos_in_item, in balance_leaf()
1397 tb->zeroes_num = 0; in balance_leaf()
1399 tb->zeroes_num = ih_item_len(ih); in balance_leaf()
1406 && is_indirect_le_ih(item_head(tbS0, tb->item_pos))) in balance_leaf()
1407 tb->pos_in_item *= UNFM_P_SIZE; in balance_leaf()
1409 body += balance_leaf_left(tb, ih, body, flag); in balance_leaf()
1413 tb->item_pos -= (tb->lnum[0] - ((tb->lbytes != -1) ? 1 : 0)); in balance_leaf()
1415 balance_leaf_right(tb, ih, body, flag); in balance_leaf()
1418 RFALSE(tb->blknum[0] > 3, in balance_leaf()
1419 "PAP-12180: blknum can not be %d. It must be <= 3", tb->blknum[0]); in balance_leaf()
1420 RFALSE(tb->blknum[0] < 0, in balance_leaf()
1421 "PAP-12185: blknum can not be %d. It must be >= 0", tb->blknum[0]); in balance_leaf()
1428 if (tb->blknum[0] == 0) { /* node S[0] is empty now */ in balance_leaf()
1430 RFALSE(!tb->lnum[0] || !tb->rnum[0], in balance_leaf()
1437 if (tb->CFL[0]) { in balance_leaf()
1438 if (!tb->CFR[0]) in balance_leaf()
1439 reiserfs_panic(tb->tb_sb, "vs-12195", in balance_leaf()
1441 copy_key(internal_key(tb->CFL[0], tb->lkey[0]), in balance_leaf()
1442 internal_key(tb->CFR[0], tb->rkey[0])); in balance_leaf()
1443 do_balance_mark_internal_dirty(tb, tb->CFL[0], 0); in balance_leaf()
1446 reiserfs_invalidate_buffer(tb, tbS0); in balance_leaf()
1450 balance_leaf_new_nodes(tb, ih, body, insert_key, insert_ptr, flag); in balance_leaf()
1452 balance_leaf_finish_node(tb, ih, body, flag); in balance_leaf()
1455 if (flag == M_PASTE && tb->insert_size[0]) { in balance_leaf()
1457 reiserfs_panic(tb->tb_sb, in balance_leaf()
1459 tb->insert_size[0]); in balance_leaf()
1483 struct buffer_head *get_FEB(struct tree_balance *tb) in get_FEB() argument
1489 if (tb->FEB[i] != NULL) in get_FEB()
1493 reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty"); in get_FEB()
1495 buffer_info_init_bh(tb, &bi, tb->FEB[i]); in get_FEB()
1497 set_buffer_uptodate(tb->FEB[i]); in get_FEB()
1498 tb->used[i] = tb->FEB[i]; in get_FEB()
1499 tb->FEB[i] = NULL; in get_FEB()
1501 return tb->used[i]; in get_FEB()
1505 static void store_thrown(struct tree_balance *tb, struct buffer_head *bh) in store_thrown() argument
1510 reiserfs_warning(tb->tb_sb, "reiserfs-12320", in store_thrown()
1512 for (i = 0; i < ARRAY_SIZE(tb->thrown); i++) in store_thrown()
1513 if (!tb->thrown[i]) { in store_thrown()
1514 tb->thrown[i] = bh; in store_thrown()
1518 reiserfs_warning(tb->tb_sb, "reiserfs-12321", in store_thrown()
1522 static void free_thrown(struct tree_balance *tb) in free_thrown() argument
1526 for (i = 0; i < ARRAY_SIZE(tb->thrown); i++) { in free_thrown()
1527 if (tb->thrown[i]) { in free_thrown()
1528 blocknr = tb->thrown[i]->b_blocknr; in free_thrown()
1529 if (buffer_dirty(tb->thrown[i])) in free_thrown()
1530 reiserfs_warning(tb->tb_sb, "reiserfs-12322", in free_thrown()
1533 brelse(tb->thrown[i]); /* incremented in store_thrown */ in free_thrown()
1534 reiserfs_free_block(tb->transaction_handle, NULL, in free_thrown()
1540 void reiserfs_invalidate_buffer(struct tree_balance *tb, struct buffer_head *bh) in reiserfs_invalidate_buffer() argument
1548 store_thrown(tb, bh); in reiserfs_invalidate_buffer()
1552 void replace_key(struct tree_balance *tb, struct buffer_head *dest, int n_dest, in replace_key() argument
1576 do_balance_mark_internal_dirty(tb, dest, 0); in replace_key()
1579 int get_left_neighbor_position(struct tree_balance *tb, int h) in get_left_neighbor_position() argument
1581 int Sh_position = PATH_H_POSITION(tb->tb_path, h + 1); in get_left_neighbor_position()
1583 RFALSE(PATH_H_PPARENT(tb->tb_path, h) == NULL || tb->FL[h] == NULL, in get_left_neighbor_position()
1585 h, tb->FL[h], h, PATH_H_PPARENT(tb->tb_path, h)); in get_left_neighbor_position()
1588 return B_NR_ITEMS(tb->FL[h]); in get_left_neighbor_position()
1593 int get_right_neighbor_position(struct tree_balance *tb, int h) in get_right_neighbor_position() argument
1595 int Sh_position = PATH_H_POSITION(tb->tb_path, h + 1); in get_right_neighbor_position()
1597 RFALSE(PATH_H_PPARENT(tb->tb_path, h) == NULL || tb->FR[h] == NULL, in get_right_neighbor_position()
1599 h, PATH_H_PPARENT(tb->tb_path, h), h, tb->FR[h]); in get_right_neighbor_position()
1601 if (Sh_position == B_NR_ITEMS(PATH_H_PPARENT(tb->tb_path, h))) in get_right_neighbor_position()
1636 static int locked_or_not_in_tree(struct tree_balance *tb, in locked_or_not_in_tree() argument
1641 reiserfs_warning(tb->tb_sb, "vs-12339", "%s (%b)", which, bh); in locked_or_not_in_tree()
1647 static int check_before_balancing(struct tree_balance *tb) in check_before_balancing() argument
1651 if (REISERFS_SB(tb->tb_sb)->cur_tb) { in check_before_balancing()
1652 reiserfs_panic(tb->tb_sb, "vs-12335", "suspect that schedule " in check_before_balancing()
1663 if (tb->lnum[0]) { in check_before_balancing()
1664 retval |= locked_or_not_in_tree(tb, tb->L[0], "L[0]"); in check_before_balancing()
1665 retval |= locked_or_not_in_tree(tb, tb->FL[0], "FL[0]"); in check_before_balancing()
1666 retval |= locked_or_not_in_tree(tb, tb->CFL[0], "CFL[0]"); in check_before_balancing()
1667 check_leaf(tb->L[0]); in check_before_balancing()
1669 if (tb->rnum[0]) { in check_before_balancing()
1670 retval |= locked_or_not_in_tree(tb, tb->R[0], "R[0]"); in check_before_balancing()
1671 retval |= locked_or_not_in_tree(tb, tb->FR[0], "FR[0]"); in check_before_balancing()
1672 retval |= locked_or_not_in_tree(tb, tb->CFR[0], "CFR[0]"); in check_before_balancing()
1673 check_leaf(tb->R[0]); in check_before_balancing()
1675 retval |= locked_or_not_in_tree(tb, PATH_PLAST_BUFFER(tb->tb_path), in check_before_balancing()
1677 check_leaf(PATH_PLAST_BUFFER(tb->tb_path)); in check_before_balancing()
1682 static void check_after_balance_leaf(struct tree_balance *tb) in check_after_balance_leaf() argument
1684 if (tb->lnum[0]) { in check_after_balance_leaf()
1685 if (B_FREE_SPACE(tb->L[0]) != in check_after_balance_leaf()
1686 MAX_CHILD_SIZE(tb->L[0]) - in check_after_balance_leaf()
1688 (tb->FL[0], get_left_neighbor_position(tb, 0)))) { in check_after_balance_leaf()
1690 reiserfs_panic(tb->tb_sb, "PAP-12355", in check_after_balance_leaf()
1694 if (tb->rnum[0]) { in check_after_balance_leaf()
1695 if (B_FREE_SPACE(tb->R[0]) != in check_after_balance_leaf()
1696 MAX_CHILD_SIZE(tb->R[0]) - in check_after_balance_leaf()
1698 (tb->FR[0], get_right_neighbor_position(tb, 0)))) { in check_after_balance_leaf()
1700 reiserfs_panic(tb->tb_sb, "PAP-12360", in check_after_balance_leaf()
1704 if (PATH_H_PBUFFER(tb->tb_path, 1) && in check_after_balance_leaf()
1705 (B_FREE_SPACE(PATH_H_PBUFFER(tb->tb_path, 0)) != in check_after_balance_leaf()
1706 (MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)) - in check_after_balance_leaf()
1707 dc_size(B_N_CHILD(PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1708 PATH_H_POSITION(tb->tb_path, 1)))))) { in check_after_balance_leaf()
1709 int left = B_FREE_SPACE(PATH_H_PBUFFER(tb->tb_path, 0)); in check_after_balance_leaf()
1710 int right = (MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)) - in check_after_balance_leaf()
1711 dc_size(B_N_CHILD(PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1712 PATH_H_POSITION(tb->tb_path, in check_after_balance_leaf()
1715 reiserfs_warning(tb->tb_sb, "reiserfs-12363", in check_after_balance_leaf()
1719 MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)), in check_after_balance_leaf()
1720 PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1721 PATH_H_POSITION(tb->tb_path, 1), in check_after_balance_leaf()
1723 (PATH_H_PBUFFER(tb->tb_path, 1), in check_after_balance_leaf()
1724 PATH_H_POSITION(tb->tb_path, 1))), in check_after_balance_leaf()
1726 reiserfs_panic(tb->tb_sb, "PAP-12365", "S is incorrect"); in check_after_balance_leaf()
1730 static void check_leaf_level(struct tree_balance *tb) in check_leaf_level() argument
1732 check_leaf(tb->L[0]); in check_leaf_level()
1733 check_leaf(tb->R[0]); in check_leaf_level()
1734 check_leaf(PATH_PLAST_BUFFER(tb->tb_path)); in check_leaf_level()
1737 static void check_internal_levels(struct tree_balance *tb) in check_internal_levels() argument
1742 for (h = 1; tb->insert_size[h]; h++) { in check_internal_levels()
1743 check_internal_node(tb->tb_sb, PATH_H_PBUFFER(tb->tb_path, h), in check_internal_levels()
1745 if (tb->lnum[h]) in check_internal_levels()
1746 check_internal_node(tb->tb_sb, tb->L[h], "BAD L"); in check_internal_levels()
1747 if (tb->rnum[h]) in check_internal_levels()
1748 check_internal_node(tb->tb_sb, tb->R[h], "BAD R"); in check_internal_levels()
1789 static inline void do_balance_starts(struct tree_balance *tb) in do_balance_starts() argument
1800 RFALSE(check_before_balancing(tb), "PAP-12340: locked buffers in TB"); in do_balance_starts()
1802 REISERFS_SB(tb->tb_sb)->cur_tb = tb; in do_balance_starts()
1806 static inline void do_balance_completed(struct tree_balance *tb) in do_balance_completed() argument
1810 check_leaf_level(tb); in do_balance_completed()
1811 check_internal_levels(tb); in do_balance_completed()
1812 REISERFS_SB(tb->tb_sb)->cur_tb = NULL; in do_balance_completed()
1821 REISERFS_SB(tb->tb_sb)->s_do_balance++; in do_balance_completed()
1824 unfix_nodes(tb); in do_balance_completed()
1826 free_thrown(tb); in do_balance_completed()
1847 void do_balance(struct tree_balance *tb, struct item_head *ih, in do_balance() argument
1864 tb->tb_mode = flag; in do_balance()
1865 tb->need_balance_dirty = 0; in do_balance()
1867 if (FILESYSTEM_CHANGED_TB(tb)) { in do_balance()
1868 reiserfs_panic(tb->tb_sb, "clm-6000", "fs generation has " in do_balance()
1872 if (!tb->insert_size[0]) { in do_balance()
1873 reiserfs_warning(tb->tb_sb, "PAP-12350", in do_balance()
1875 unfix_nodes(tb); in do_balance()
1879 atomic_inc(&fs_generation(tb->tb_sb)); in do_balance()
1880 do_balance_starts(tb); in do_balance()
1887 child_pos = PATH_H_B_ITEM_ORDER(tb->tb_path, 0) + in do_balance()
1888 balance_leaf(tb, ih, body, flag, insert_key, insert_ptr); in do_balance()
1891 check_after_balance_leaf(tb); in do_balance()
1895 for (h = 1; h < MAX_HEIGHT && tb->insert_size[h]; h++) in do_balance()
1896 child_pos = balance_internal(tb, h, child_pos, insert_key, in do_balance()
1899 do_balance_completed(tb); in do_balance()