Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb
[linux-2.6] / fs / reiserfs / do_balan.c
1 /*
2  * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
3  */
4
5 /* Now we have all buffers that must be used in balancing of the tree   */
6 /* Further calculations can not cause schedule(), and thus the buffer   */
7 /* tree will be stable until the balancing will be finished             */
8 /* balance the tree according to the analysis made before,              */
9 /* and using buffers obtained after all above.                          */
10
11 /**
12  ** balance_leaf_when_delete
13  ** balance_leaf
14  ** do_balance
15  **
16  **/
17
18 #include <asm/uaccess.h>
19 #include <linux/time.h>
20 #include <linux/reiserfs_fs.h>
21 #include <linux/buffer_head.h>
22 #include <linux/kernel.h>
23
24 #ifdef CONFIG_REISERFS_CHECK
25
26 struct tree_balance *cur_tb = NULL;     /* detects whether more than one
27                                            copy of tb exists as a means
28                                            of checking whether schedule
29                                            is interrupting do_balance */
30 #endif
31
32 static inline void buffer_info_init_left(struct tree_balance *tb,
33                                          struct buffer_info *bi)
34 {
35         bi->tb          = tb;
36         bi->bi_bh       = tb->L[0];
37         bi->bi_parent   = tb->FL[0];
38         bi->bi_position = get_left_neighbor_position(tb, 0);
39 }
40
41 static inline void buffer_info_init_right(struct tree_balance *tb,
42                                           struct buffer_info *bi)
43 {
44         bi->tb          = tb;
45         bi->bi_bh       = tb->R[0];
46         bi->bi_parent   = tb->FR[0];
47         bi->bi_position = get_right_neighbor_position(tb, 0);
48 }
49
50 static inline void buffer_info_init_tbS0(struct tree_balance *tb,
51                                          struct buffer_info *bi)
52 {
53         bi->tb          = tb;
54         bi->bi_bh        = PATH_PLAST_BUFFER(tb->tb_path);
55         bi->bi_parent   = PATH_H_PPARENT(tb->tb_path, 0);
56         bi->bi_position = PATH_H_POSITION(tb->tb_path, 1);
57 }
58
59 static inline void buffer_info_init_bh(struct tree_balance *tb,
60                                        struct buffer_info *bi,
61                                        struct buffer_head *bh)
62 {
63         bi->tb          = tb;
64         bi->bi_bh       = bh;
65         bi->bi_parent   = NULL;
66         bi->bi_position = 0;
67 }
68
69 inline void do_balance_mark_leaf_dirty(struct tree_balance *tb,
70                                        struct buffer_head *bh, int flag)
71 {
72         journal_mark_dirty(tb->transaction_handle,
73                            tb->transaction_handle->t_super, bh);
74 }
75
76 #define do_balance_mark_internal_dirty do_balance_mark_leaf_dirty
77 #define do_balance_mark_sb_dirty do_balance_mark_leaf_dirty
78
79 /* summary:
80  if deleting something ( tb->insert_size[0] < 0 )
81    return(balance_leaf_when_delete()); (flag d handled here)
82  else
83    if lnum is larger than 0 we put items into the left node
84    if rnum is larger than 0 we put items into the right node
85    if snum1 is larger than 0 we put items into the new node s1
86    if snum2 is larger than 0 we put items into the new node s2
87 Note that all *num* count new items being created.
88
89 It would be easier to read balance_leaf() if each of these summary
90 lines was a separate procedure rather than being inlined.  I think
91 that there are many passages here and in balance_leaf_when_delete() in
92 which two calls to one procedure can replace two passages, and it
93 might save cache space and improve software maintenance costs to do so.
94
95 Vladimir made the perceptive comment that we should offload most of
96 the decision making in this function into fix_nodes/check_balance, and
97 then create some sort of structure in tb that says what actions should
98 be performed by do_balance.
99
100 -Hans */
101
102 /* Balance leaf node in case of delete or cut: insert_size[0] < 0
103  *
104  * lnum, rnum can have values >= -1
105  *      -1 means that the neighbor must be joined with S
106  *       0 means that nothing should be done with the neighbor
107  *      >0 means to shift entirely or partly the specified number of items to the neighbor
108  */
109 static int balance_leaf_when_delete(struct tree_balance *tb, int flag)
110 {
111         struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path);
112         int item_pos = PATH_LAST_POSITION(tb->tb_path);
113         int pos_in_item = tb->tb_path->pos_in_item;
114         struct buffer_info bi;
115         int n;
116         struct item_head *ih;
117
118         RFALSE(tb->FR[0] && B_LEVEL(tb->FR[0]) != DISK_LEAF_NODE_LEVEL + 1,
119                "vs- 12000: level: wrong FR %z", tb->FR[0]);
120         RFALSE(tb->blknum[0] > 1,
121                "PAP-12005: tb->blknum == %d, can not be > 1", tb->blknum[0]);
122         RFALSE(!tb->blknum[0] && !PATH_H_PPARENT(tb->tb_path, 0),
123                "PAP-12010: tree can not be empty");
124
125         ih = B_N_PITEM_HEAD(tbS0, item_pos);
126         buffer_info_init_tbS0(tb, &bi);
127
128         /* Delete or truncate the item */
129
130         switch (flag) {
131         case M_DELETE:          /* delete item in S[0] */
132
133                 RFALSE(ih_item_len(ih) + IH_SIZE != -tb->insert_size[0],
134                        "vs-12013: mode Delete, insert size %d, ih to be deleted %h",
135                        -tb->insert_size[0], ih);
136
137                 leaf_delete_items(&bi, 0, item_pos, 1, -1);
138
139                 if (!item_pos && tb->CFL[0]) {
140                         if (B_NR_ITEMS(tbS0)) {
141                                 replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0,
142                                             0);
143                         } else {
144                                 if (!PATH_H_POSITION(tb->tb_path, 1))
145                                         replace_key(tb, tb->CFL[0], tb->lkey[0],
146                                                     PATH_H_PPARENT(tb->tb_path,
147                                                                    0), 0);
148                         }
149                 }
150
151                 RFALSE(!item_pos && !tb->CFL[0],
152                        "PAP-12020: tb->CFL[0]==%p, tb->L[0]==%p", tb->CFL[0],
153                        tb->L[0]);
154
155                 break;
156
157         case M_CUT:{            /* cut item in S[0] */
158                         if (is_direntry_le_ih(ih)) {
159
160                                 /* UFS unlink semantics are such that you can only delete one directory entry at a time. */
161                                 /* when we cut a directory tb->insert_size[0] means number of entries to be cut (always 1) */
162                                 tb->insert_size[0] = -1;
163                                 leaf_cut_from_buffer(&bi, item_pos, pos_in_item,
164                                                      -tb->insert_size[0]);
165
166                                 RFALSE(!item_pos && !pos_in_item && !tb->CFL[0],
167                                        "PAP-12030: can not change delimiting key. CFL[0]=%p",
168                                        tb->CFL[0]);
169
170                                 if (!item_pos && !pos_in_item && tb->CFL[0]) {
171                                         replace_key(tb, tb->CFL[0], tb->lkey[0],
172                                                     tbS0, 0);
173                                 }
174                         } else {
175                                 leaf_cut_from_buffer(&bi, item_pos, pos_in_item,
176                                                      -tb->insert_size[0]);
177
178                                 RFALSE(!ih_item_len(ih),
179                                        "PAP-12035: cut must leave non-zero dynamic length of item");
180                         }
181                         break;
182                 }
183
184         default:
185                 print_cur_tb("12040");
186                 reiserfs_panic(tb->tb_sb, "PAP-12040",
187                                "unexpected mode: %s(%d)",
188                                (flag ==
189                                 M_PASTE) ? "PASTE" : ((flag ==
190                                                        M_INSERT) ? "INSERT" :
191                                                       "UNKNOWN"), flag);
192         }
193
194         /* the rule is that no shifting occurs unless by shifting a node can be freed */
195         n = B_NR_ITEMS(tbS0);
196         if (tb->lnum[0]) {      /* L[0] takes part in balancing */
197                 if (tb->lnum[0] == -1) {        /* L[0] must be joined with S[0] */
198                         if (tb->rnum[0] == -1) {        /* R[0] must be also joined with S[0] */
199                                 if (tb->FR[0] == PATH_H_PPARENT(tb->tb_path, 0)) {
200                                         /* all contents of all the 3 buffers will be in L[0] */
201                                         if (PATH_H_POSITION(tb->tb_path, 1) == 0
202                                             && 1 < B_NR_ITEMS(tb->FR[0]))
203                                                 replace_key(tb, tb->CFL[0],
204                                                             tb->lkey[0],
205                                                             tb->FR[0], 1);
206
207                                         leaf_move_items(LEAF_FROM_S_TO_L, tb, n,
208                                                         -1, NULL);
209                                         leaf_move_items(LEAF_FROM_R_TO_L, tb,
210                                                         B_NR_ITEMS(tb->R[0]),
211                                                         -1, NULL);
212
213                                         reiserfs_invalidate_buffer(tb, tbS0);
214                                         reiserfs_invalidate_buffer(tb,
215                                                                    tb->R[0]);
216
217                                         return 0;
218                                 }
219                                 /* all contents of all the 3 buffers will be in R[0] */
220                                 leaf_move_items(LEAF_FROM_S_TO_R, tb, n, -1,
221                                                 NULL);
222                                 leaf_move_items(LEAF_FROM_L_TO_R, tb,
223                                                 B_NR_ITEMS(tb->L[0]), -1, NULL);
224
225                                 /* right_delimiting_key is correct in R[0] */
226                                 replace_key(tb, tb->CFR[0], tb->rkey[0],
227                                             tb->R[0], 0);
228
229                                 reiserfs_invalidate_buffer(tb, tbS0);
230                                 reiserfs_invalidate_buffer(tb, tb->L[0]);
231
232                                 return -1;
233                         }
234
235                         RFALSE(tb->rnum[0] != 0,
236                                "PAP-12045: rnum must be 0 (%d)", tb->rnum[0]);
237                         /* all contents of L[0] and S[0] will be in L[0] */
238                         leaf_shift_left(tb, n, -1);
239
240                         reiserfs_invalidate_buffer(tb, tbS0);
241
242                         return 0;
243                 }
244                 /* a part of contents of S[0] will be in L[0] and the rest part of S[0] will be in R[0] */
245
246                 RFALSE((tb->lnum[0] + tb->rnum[0] < n) ||
247                        (tb->lnum[0] + tb->rnum[0] > n + 1),
248                        "PAP-12050: rnum(%d) and lnum(%d) and item number(%d) in S[0] are not consistent",
249                        tb->rnum[0], tb->lnum[0], n);
250                 RFALSE((tb->lnum[0] + tb->rnum[0] == n) &&
251                        (tb->lbytes != -1 || tb->rbytes != -1),
252                        "PAP-12055: bad rbytes (%d)/lbytes (%d) parameters when items are not split",
253                        tb->rbytes, tb->lbytes);
254                 RFALSE((tb->lnum[0] + tb->rnum[0] == n + 1) &&
255                        (tb->lbytes < 1 || tb->rbytes != -1),
256                        "PAP-12060: bad rbytes (%d)/lbytes (%d) parameters when items are split",
257                        tb->rbytes, tb->lbytes);
258
259                 leaf_shift_left(tb, tb->lnum[0], tb->lbytes);
260                 leaf_shift_right(tb, tb->rnum[0], tb->rbytes);
261
262                 reiserfs_invalidate_buffer(tb, tbS0);
263
264                 return 0;
265         }
266
267         if (tb->rnum[0] == -1) {
268                 /* all contents of R[0] and S[0] will be in R[0] */
269                 leaf_shift_right(tb, n, -1);
270                 reiserfs_invalidate_buffer(tb, tbS0);
271                 return 0;
272         }
273
274         RFALSE(tb->rnum[0],
275                "PAP-12065: bad rnum parameter must be 0 (%d)", tb->rnum[0]);
276         return 0;
277 }
278
279 static int balance_leaf(struct tree_balance *tb, struct item_head *ih,  /* item header of inserted item (this is on little endian) */
280                         const char *body,       /* body  of inserted item or bytes to paste */
281                         int flag,       /* i - insert, d - delete, c - cut, p - paste
282                                            (see comment to do_balance) */
283                         struct item_head *insert_key,   /* in our processing of one level we sometimes determine what
284                                                            must be inserted into the next higher level.  This insertion
285                                                            consists of a key or two keys and their corresponding
286                                                            pointers */
287                         struct buffer_head **insert_ptr /* inserted node-ptrs for the next level */
288     )
289 {
290         struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path);
291         int item_pos = PATH_LAST_POSITION(tb->tb_path); /*  index into the array of item headers in S[0]
292                                                            of the affected item */
293         struct buffer_info bi;
294         struct buffer_head *S_new[2];   /* new nodes allocated to hold what could not fit into S */
295         int snum[2];            /* number of items that will be placed
296                                    into S_new (includes partially shifted
297                                    items) */
298         int sbytes[2];          /* if an item is partially shifted into S_new then
299                                    if it is a directory item
300                                    it is the number of entries from the item that are shifted into S_new
301                                    else
302                                    it is the number of bytes from the item that are shifted into S_new
303                                  */
304         int n, i;
305         int ret_val;
306         int pos_in_item;
307         int zeros_num;
308
309         PROC_INFO_INC(tb->tb_sb, balance_at[0]);
310
311         /* Make balance in case insert_size[0] < 0 */
312         if (tb->insert_size[0] < 0)
313                 return balance_leaf_when_delete(tb, flag);
314
315         zeros_num = 0;
316         if (flag == M_INSERT && !body)
317                 zeros_num = ih_item_len(ih);
318
319         pos_in_item = tb->tb_path->pos_in_item;
320         /* for indirect item pos_in_item is measured in unformatted node
321            pointers. Recalculate to bytes */
322         if (flag != M_INSERT
323             && is_indirect_le_ih(B_N_PITEM_HEAD(tbS0, item_pos)))
324                 pos_in_item *= UNFM_P_SIZE;
325
326         if (tb->lnum[0] > 0) {
327                 /* Shift lnum[0] items from S[0] to the left neighbor L[0] */
328                 if (item_pos < tb->lnum[0]) {
329                         /* new item or it part falls to L[0], shift it too */
330                         n = B_NR_ITEMS(tb->L[0]);
331
332                         switch (flag) {
333                         case M_INSERT:  /* insert item into L[0] */
334
335                                 if (item_pos == tb->lnum[0] - 1
336                                     && tb->lbytes != -1) {
337                                         /* part of new item falls into L[0] */
338                                         int new_item_len;
339                                         int version;
340
341                                         ret_val =
342                                             leaf_shift_left(tb, tb->lnum[0] - 1,
343                                                             -1);
344
345                                         /* Calculate item length to insert to S[0] */
346                                         new_item_len =
347                                             ih_item_len(ih) - tb->lbytes;
348                                         /* Calculate and check item length to insert to L[0] */
349                                         put_ih_item_len(ih,
350                                                         ih_item_len(ih) -
351                                                         new_item_len);
352
353                                         RFALSE(ih_item_len(ih) <= 0,
354                                                "PAP-12080: there is nothing to insert into L[0]: ih_item_len=%d",
355                                                ih_item_len(ih));
356
357                                         /* Insert new item into L[0] */
358                                         buffer_info_init_left(tb, &bi);
359                                         leaf_insert_into_buf(&bi,
360                                                              n + item_pos -
361                                                              ret_val, ih, body,
362                                                              zeros_num >
363                                                              ih_item_len(ih) ?
364                                                              ih_item_len(ih) :
365                                                              zeros_num);
366
367                                         version = ih_version(ih);
368
369                                         /* Calculate key component, item length and body to insert into S[0] */
370                                         set_le_ih_k_offset(ih,
371                                                            le_ih_k_offset(ih) +
372                                                            (tb->
373                                                             lbytes <<
374                                                             (is_indirect_le_ih
375                                                              (ih) ? tb->tb_sb->
376                                                              s_blocksize_bits -
377                                                              UNFM_P_SHIFT :
378                                                              0)));
379
380                                         put_ih_item_len(ih, new_item_len);
381                                         if (tb->lbytes > zeros_num) {
382                                                 body +=
383                                                     (tb->lbytes - zeros_num);
384                                                 zeros_num = 0;
385                                         } else
386                                                 zeros_num -= tb->lbytes;
387
388                                         RFALSE(ih_item_len(ih) <= 0,
389                                                "PAP-12085: there is nothing to insert into S[0]: ih_item_len=%d",
390                                                ih_item_len(ih));
391                                 } else {
392                                         /* new item in whole falls into L[0] */
393                                         /* Shift lnum[0]-1 items to L[0] */
394                                         ret_val =
395                                             leaf_shift_left(tb, tb->lnum[0] - 1,
396                                                             tb->lbytes);
397                                         /* Insert new item into L[0] */
398                                         buffer_info_init_left(tb, &bi);
399                                         leaf_insert_into_buf(&bi,
400                                                              n + item_pos -
401                                                              ret_val, ih, body,
402                                                              zeros_num);
403                                         tb->insert_size[0] = 0;
404                                         zeros_num = 0;
405                                 }
406                                 break;
407
408                         case M_PASTE:   /* append item in L[0] */
409
410                                 if (item_pos == tb->lnum[0] - 1
411                                     && tb->lbytes != -1) {
412                                         /* we must shift the part of the appended item */
413                                         if (is_direntry_le_ih
414                                             (B_N_PITEM_HEAD(tbS0, item_pos))) {
415
416                                                 RFALSE(zeros_num,
417                                                        "PAP-12090: invalid parameter in case of a directory");
418                                                 /* directory item */
419                                                 if (tb->lbytes > pos_in_item) {
420                                                         /* new directory entry falls into L[0] */
421                                                         struct item_head
422                                                             *pasted;
423                                                         int l_pos_in_item =
424                                                             pos_in_item;
425
426                                                         /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */
427                                                         ret_val =
428                                                             leaf_shift_left(tb,
429                                                                             tb->
430                                                                             lnum
431                                                                             [0],
432                                                                             tb->
433                                                                             lbytes
434                                                                             -
435                                                                             1);
436                                                         if (ret_val
437                                                             && !item_pos) {
438                                                                 pasted =
439                                                                     B_N_PITEM_HEAD
440                                                                     (tb->L[0],
441                                                                      B_NR_ITEMS
442                                                                      (tb->
443                                                                       L[0]) -
444                                                                      1);
445                                                                 l_pos_in_item +=
446                                                                     I_ENTRY_COUNT
447                                                                     (pasted) -
448                                                                     (tb->
449                                                                      lbytes -
450                                                                      1);
451                                                         }
452
453                                                         /* Append given directory entry to directory item */
454                                                         buffer_info_init_left(tb, &bi);
455                                                         leaf_paste_in_buffer
456                                                             (&bi,
457                                                              n + item_pos -
458                                                              ret_val,
459                                                              l_pos_in_item,
460                                                              tb->insert_size[0],
461                                                              body, zeros_num);
462
463                                                         /* previous string prepared space for pasting new entry, following string pastes this entry */
464
465                                                         /* when we have merge directory item, pos_in_item has been changed too */
466
467                                                         /* paste new directory entry. 1 is entry number */
468                                                         leaf_paste_entries(&bi,
469                                                                            n +
470                                                                            item_pos
471                                                                            -
472                                                                            ret_val,
473                                                                            l_pos_in_item,
474                                                                            1,
475                                                                            (struct
476                                                                             reiserfs_de_head
477                                                                             *)
478                                                                            body,
479                                                                            body
480                                                                            +
481                                                                            DEH_SIZE,
482                                                                            tb->
483                                                                            insert_size
484                                                                            [0]
485                                                             );
486                                                         tb->insert_size[0] = 0;
487                                                 } else {
488                                                         /* new directory item doesn't fall into L[0] */
489                                                         /* Shift lnum[0]-1 items in whole. Shift lbytes directory entries from directory item number lnum[0] */
490                                                         leaf_shift_left(tb,
491                                                                         tb->
492                                                                         lnum[0],
493                                                                         tb->
494                                                                         lbytes);
495                                                 }
496                                                 /* Calculate new position to append in item body */
497                                                 pos_in_item -= tb->lbytes;
498                                         } else {
499                                                 /* regular object */
500                                                 RFALSE(tb->lbytes <= 0,
501                                                        "PAP-12095: there is nothing to shift to L[0]. lbytes=%d",
502                                                        tb->lbytes);
503                                                 RFALSE(pos_in_item !=
504                                                        ih_item_len
505                                                        (B_N_PITEM_HEAD
506                                                         (tbS0, item_pos)),
507                                                        "PAP-12100: incorrect position to paste: item_len=%d, pos_in_item=%d",
508                                                        ih_item_len
509                                                        (B_N_PITEM_HEAD
510                                                         (tbS0, item_pos)),
511                                                        pos_in_item);
512
513                                                 if (tb->lbytes >= pos_in_item) {
514                                                         /* appended item will be in L[0] in whole */
515                                                         int l_n;
516
517                                                         /* this bytes number must be appended to the last item of L[h] */
518                                                         l_n =
519                                                             tb->lbytes -
520                                                             pos_in_item;
521
522                                                         /* Calculate new insert_size[0] */
523                                                         tb->insert_size[0] -=
524                                                             l_n;
525
526                                                         RFALSE(tb->
527                                                                insert_size[0] <=
528                                                                0,
529                                                                "PAP-12105: there is nothing to paste into L[0]. insert_size=%d",
530                                                                tb->
531                                                                insert_size[0]);
532                                                         ret_val =
533                                                             leaf_shift_left(tb,
534                                                                             tb->
535                                                                             lnum
536                                                                             [0],
537                                                                             ih_item_len
538                                                                             (B_N_PITEM_HEAD
539                                                                              (tbS0,
540                                                                               item_pos)));
541                                                         /* Append to body of item in L[0] */
542                                                         buffer_info_init_left(tb, &bi);
543                                                         leaf_paste_in_buffer
544                                                             (&bi,
545                                                              n + item_pos -
546                                                              ret_val,
547                                                              ih_item_len
548                                                              (B_N_PITEM_HEAD
549                                                               (tb->L[0],
550                                                                n + item_pos -
551                                                                ret_val)), l_n,
552                                                              body,
553                                                              zeros_num >
554                                                              l_n ? l_n :
555                                                              zeros_num);
556                                                         /* 0-th item in S0 can be only of DIRECT type when l_n != 0 */
557                                                         {
558                                                                 int version;
559                                                                 int temp_l =
560                                                                     l_n;
561
562                                                                 RFALSE
563                                                                     (ih_item_len
564                                                                      (B_N_PITEM_HEAD
565                                                                       (tbS0,
566                                                                        0)),
567                                                                      "PAP-12106: item length must be 0");
568                                                                 RFALSE
569                                                                     (comp_short_le_keys
570                                                                      (B_N_PKEY
571                                                                       (tbS0, 0),
572                                                                       B_N_PKEY
573                                                                       (tb->L[0],
574                                                                        n +
575                                                                        item_pos
576                                                                        -
577                                                                        ret_val)),
578                                                                      "PAP-12107: items must be of the same file");
579                                                                 if (is_indirect_le_ih(B_N_PITEM_HEAD(tb->L[0], n + item_pos - ret_val))) {
580                                                                         temp_l =
581                                                                             l_n
582                                                                             <<
583                                                                             (tb->
584                                                                              tb_sb->
585                                                                              s_blocksize_bits
586                                                                              -
587                                                                              UNFM_P_SHIFT);
588                                                                 }
589                                                                 /* update key of first item in S0 */
590                                                                 version =
591                                                                     ih_version
592                                                                     (B_N_PITEM_HEAD
593                                                                      (tbS0, 0));
594                                                                 set_le_key_k_offset
595                                                                     (version,
596                                                                      B_N_PKEY
597                                                                      (tbS0, 0),
598                                                                      le_key_k_offset
599                                                                      (version,
600                                                                       B_N_PKEY
601                                                                       (tbS0,
602                                                                        0)) +
603                                                                      temp_l);
604                                                                 /* update left delimiting key */
605                                                                 set_le_key_k_offset
606                                                                     (version,
607                                                                      B_N_PDELIM_KEY
608                                                                      (tb->
609                                                                       CFL[0],
610                                                                       tb->
611                                                                       lkey[0]),
612                                                                      le_key_k_offset
613                                                                      (version,
614                                                                       B_N_PDELIM_KEY
615                                                                       (tb->
616                                                                        CFL[0],
617                                                                        tb->
618                                                                        lkey[0]))
619                                                                      + temp_l);
620                                                         }
621
622                                                         /* Calculate new body, position in item and insert_size[0] */
623                                                         if (l_n > zeros_num) {
624                                                                 body +=
625                                                                     (l_n -
626                                                                      zeros_num);
627                                                                 zeros_num = 0;
628                                                         } else
629                                                                 zeros_num -=
630                                                                     l_n;
631                                                         pos_in_item = 0;
632
633                                                         RFALSE
634                                                             (comp_short_le_keys
635                                                              (B_N_PKEY(tbS0, 0),
636                                                               B_N_PKEY(tb->L[0],
637                                                                        B_NR_ITEMS
638                                                                        (tb->
639                                                                         L[0]) -
640                                                                        1))
641                                                              ||
642                                                              !op_is_left_mergeable
643                                                              (B_N_PKEY(tbS0, 0),
644                                                               tbS0->b_size)
645                                                              ||
646                                                              !op_is_left_mergeable
647                                                              (B_N_PDELIM_KEY
648                                                               (tb->CFL[0],
649                                                                tb->lkey[0]),
650                                                               tbS0->b_size),
651                                                              "PAP-12120: item must be merge-able with left neighboring item");
652                                                 } else {        /* only part of the appended item will be in L[0] */
653
654                                                         /* Calculate position in item for append in S[0] */
655                                                         pos_in_item -=
656                                                             tb->lbytes;
657
658                                                         RFALSE(pos_in_item <= 0,
659                                                                "PAP-12125: no place for paste. pos_in_item=%d",
660                                                                pos_in_item);
661
662                                                         /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */
663                                                         leaf_shift_left(tb,
664                                                                         tb->
665                                                                         lnum[0],
666                                                                         tb->
667                                                                         lbytes);
668                                                 }
669                                         }
670                                 } else {        /* appended item will be in L[0] in whole */
671
672                                         struct item_head *pasted;
673
674                                         if (!item_pos && op_is_left_mergeable(B_N_PKEY(tbS0, 0), tbS0->b_size)) {       /* if we paste into first item of S[0] and it is left mergable */
675                                                 /* then increment pos_in_item by the size of the last item in L[0] */
676                                                 pasted =
677                                                     B_N_PITEM_HEAD(tb->L[0],
678                                                                    n - 1);
679                                                 if (is_direntry_le_ih(pasted))
680                                                         pos_in_item +=
681                                                             ih_entry_count
682                                                             (pasted);
683                                                 else
684                                                         pos_in_item +=
685                                                             ih_item_len(pasted);
686                                         }
687
688                                         /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */
689                                         ret_val =
690                                             leaf_shift_left(tb, tb->lnum[0],
691                                                             tb->lbytes);
692                                         /* Append to body of item in L[0] */
693                                         buffer_info_init_left(tb, &bi);
694                                         leaf_paste_in_buffer(&bi,
695                                                              n + item_pos -
696                                                              ret_val,
697                                                              pos_in_item,
698                                                              tb->insert_size[0],
699                                                              body, zeros_num);
700
701                                         /* if appended item is directory, paste entry */
702                                         pasted =
703                                             B_N_PITEM_HEAD(tb->L[0],
704                                                            n + item_pos -
705                                                            ret_val);
706                                         if (is_direntry_le_ih(pasted))
707                                                 leaf_paste_entries(&bi,
708                                                                    n +
709                                                                    item_pos -
710                                                                    ret_val,
711                                                                    pos_in_item,
712                                                                    1,
713                                                                    (struct
714                                                                     reiserfs_de_head
715                                                                     *)body,
716                                                                    body +
717                                                                    DEH_SIZE,
718                                                                    tb->
719                                                                    insert_size
720                                                                    [0]
721                                                     );
722                                         /* if appended item is indirect item, put unformatted node into un list */
723                                         if (is_indirect_le_ih(pasted))
724                                                 set_ih_free_space(pasted, 0);
725                                         tb->insert_size[0] = 0;
726                                         zeros_num = 0;
727                                 }
728                                 break;
729                         default:        /* cases d and t */
730                                 reiserfs_panic(tb->tb_sb, "PAP-12130",
731                                                "lnum > 0: unexpected mode: "
732                                                " %s(%d)",
733                                                (flag ==
734                                                 M_DELETE) ? "DELETE" : ((flag ==
735                                                                          M_CUT)
736                                                                         ? "CUT"
737                                                                         :
738                                                                         "UNKNOWN"),
739                                                flag);
740                         }
741                 } else {
742                         /* new item doesn't fall into L[0] */
743                         leaf_shift_left(tb, tb->lnum[0], tb->lbytes);
744                 }
745         }
746
747         /* tb->lnum[0] > 0 */
748         /* Calculate new item position */
749         item_pos -= (tb->lnum[0] - ((tb->lbytes != -1) ? 1 : 0));
750
751         if (tb->rnum[0] > 0) {
752                 /* shift rnum[0] items from S[0] to the right neighbor R[0] */
753                 n = B_NR_ITEMS(tbS0);
754                 switch (flag) {
755
756                 case M_INSERT:  /* insert item */
757                         if (n - tb->rnum[0] < item_pos) {       /* new item or its part falls to R[0] */
758                                 if (item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) {      /* part of new item falls into R[0] */
759                                         loff_t old_key_comp, old_len,
760                                             r_zeros_number;
761                                         const char *r_body;
762                                         int version;
763                                         loff_t offset;
764
765                                         leaf_shift_right(tb, tb->rnum[0] - 1,
766                                                          -1);
767
768                                         version = ih_version(ih);
769                                         /* Remember key component and item length */
770                                         old_key_comp = le_ih_k_offset(ih);
771                                         old_len = ih_item_len(ih);
772
773                                         /* Calculate key component and item length to insert into R[0] */
774                                         offset =
775                                             le_ih_k_offset(ih) +
776                                             ((old_len -
777                                               tb->
778                                               rbytes) << (is_indirect_le_ih(ih)
779                                                           ? tb->tb_sb->
780                                                           s_blocksize_bits -
781                                                           UNFM_P_SHIFT : 0));
782                                         set_le_ih_k_offset(ih, offset);
783                                         put_ih_item_len(ih, tb->rbytes);
784                                         /* Insert part of the item into R[0] */
785                                         buffer_info_init_right(tb, &bi);
786                                         if ((old_len - tb->rbytes) > zeros_num) {
787                                                 r_zeros_number = 0;
788                                                 r_body =
789                                                     body + (old_len -
790                                                             tb->rbytes) -
791                                                     zeros_num;
792                                         } else {
793                                                 r_body = body;
794                                                 r_zeros_number =
795                                                     zeros_num - (old_len -
796                                                                  tb->rbytes);
797                                                 zeros_num -= r_zeros_number;
798                                         }
799
800                                         leaf_insert_into_buf(&bi, 0, ih, r_body,
801                                                              r_zeros_number);
802
803                                         /* Replace right delimiting key by first key in R[0] */
804                                         replace_key(tb, tb->CFR[0], tb->rkey[0],
805                                                     tb->R[0], 0);
806
807                                         /* Calculate key component and item length to insert into S[0] */
808                                         set_le_ih_k_offset(ih, old_key_comp);
809                                         put_ih_item_len(ih,
810                                                         old_len - tb->rbytes);
811
812                                         tb->insert_size[0] -= tb->rbytes;
813
814                                 } else {        /* whole new item falls into R[0] */
815
816                                         /* Shift rnum[0]-1 items to R[0] */
817                                         ret_val =
818                                             leaf_shift_right(tb,
819                                                              tb->rnum[0] - 1,
820                                                              tb->rbytes);
821                                         /* Insert new item into R[0] */
822                                         buffer_info_init_right(tb, &bi);
823                                         leaf_insert_into_buf(&bi,
824                                                              item_pos - n +
825                                                              tb->rnum[0] - 1,
826                                                              ih, body,
827                                                              zeros_num);
828
829                                         if (item_pos - n + tb->rnum[0] - 1 == 0) {
830                                                 replace_key(tb, tb->CFR[0],
831                                                             tb->rkey[0],
832                                                             tb->R[0], 0);
833
834                                         }
835                                         zeros_num = tb->insert_size[0] = 0;
836                                 }
837                         } else {        /* new item or part of it doesn't fall into R[0] */
838
839                                 leaf_shift_right(tb, tb->rnum[0], tb->rbytes);
840                         }
841                         break;
842
843                 case M_PASTE:   /* append item */
844
845                         if (n - tb->rnum[0] <= item_pos) {      /* pasted item or part of it falls to R[0] */
846                                 if (item_pos == n - tb->rnum[0] && tb->rbytes != -1) {  /* we must shift the part of the appended item */
847                                         if (is_direntry_le_ih(B_N_PITEM_HEAD(tbS0, item_pos))) {        /* we append to directory item */
848                                                 int entry_count;
849
850                                                 RFALSE(zeros_num,
851                                                        "PAP-12145: invalid parameter in case of a directory");
852                                                 entry_count =
853                                                     I_ENTRY_COUNT(B_N_PITEM_HEAD
854                                                                   (tbS0,
855                                                                    item_pos));
856                                                 if (entry_count - tb->rbytes <
857                                                     pos_in_item)
858                                                         /* new directory entry falls into R[0] */
859                                                 {
860                                                         int paste_entry_position;
861
862                                                         RFALSE(tb->rbytes - 1 >=
863                                                                entry_count
864                                                                || !tb->
865                                                                insert_size[0],
866                                                                "PAP-12150: no enough of entries to shift to R[0]: rbytes=%d, entry_count=%d",
867                                                                tb->rbytes,
868                                                                entry_count);
869                                                         /* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */
870                                                         leaf_shift_right(tb,
871                                                                          tb->
872                                                                          rnum
873                                                                          [0],
874                                                                          tb->
875                                                                          rbytes
876                                                                          - 1);
877                                                         /* Paste given directory entry to directory item */
878                                                         paste_entry_position =
879                                                             pos_in_item -
880                                                             entry_count +
881                                                             tb->rbytes - 1;
882                                                         buffer_info_init_right(tb, &bi);
883                                                         leaf_paste_in_buffer
884                                                             (&bi, 0,
885                                                              paste_entry_position,
886                                                              tb->insert_size[0],
887                                                              body, zeros_num);
888                                                         /* paste entry */
889                                                         leaf_paste_entries(&bi,
890                                                                            0,
891                                                                            paste_entry_position,
892                                                                            1,
893                                                                            (struct
894                                                                             reiserfs_de_head
895                                                                             *)
896                                                                            body,
897                                                                            body
898                                                                            +
899                                                                            DEH_SIZE,
900                                                                            tb->
901                                                                            insert_size
902                                                                            [0]
903                                                             );
904
905                                                         if (paste_entry_position
906                                                             == 0) {
907                                                                 /* change delimiting keys */
908                                                                 replace_key(tb,
909                                                                             tb->
910                                                                             CFR
911                                                                             [0],
912                                                                             tb->
913                                                                             rkey
914                                                                             [0],
915                                                                             tb->
916                                                                             R
917                                                                             [0],
918                                                                             0);
919                                                         }
920
921                                                         tb->insert_size[0] = 0;
922                                                         pos_in_item++;
923                                                 } else {        /* new directory entry doesn't fall into R[0] */
924
925                                                         leaf_shift_right(tb,
926                                                                          tb->
927                                                                          rnum
928                                                                          [0],
929                                                                          tb->
930                                                                          rbytes);
931                                                 }
932                                         } else {        /* regular object */
933
934                                                 int n_shift, n_rem,
935                                                     r_zeros_number;
936                                                 const char *r_body;
937
938                                                 /* Calculate number of bytes which must be shifted from appended item */
939                                                 if ((n_shift =
940                                                      tb->rbytes -
941                                                      tb->insert_size[0]) < 0)
942                                                         n_shift = 0;
943
944                                                 RFALSE(pos_in_item !=
945                                                        ih_item_len
946                                                        (B_N_PITEM_HEAD
947                                                         (tbS0, item_pos)),
948                                                        "PAP-12155: invalid position to paste. ih_item_len=%d, pos_in_item=%d",
949                                                        pos_in_item,
950                                                        ih_item_len
951                                                        (B_N_PITEM_HEAD
952                                                         (tbS0, item_pos)));
953
954                                                 leaf_shift_right(tb,
955                                                                  tb->rnum[0],
956                                                                  n_shift);
957                                                 /* Calculate number of bytes which must remain in body after appending to R[0] */
958                                                 if ((n_rem =
959                                                      tb->insert_size[0] -
960                                                      tb->rbytes) < 0)
961                                                         n_rem = 0;
962
963                                                 {
964                                                         int version;
965                                                         unsigned long temp_rem =
966                                                             n_rem;
967
968                                                         version =
969                                                             ih_version
970                                                             (B_N_PITEM_HEAD
971                                                              (tb->R[0], 0));
972                                                         if (is_indirect_le_key
973                                                             (version,
974                                                              B_N_PKEY(tb->R[0],
975                                                                       0))) {
976                                                                 temp_rem =
977                                                                     n_rem <<
978                                                                     (tb->tb_sb->
979                                                                      s_blocksize_bits
980                                                                      -
981                                                                      UNFM_P_SHIFT);
982                                                         }
983                                                         set_le_key_k_offset
984                                                             (version,
985                                                              B_N_PKEY(tb->R[0],
986                                                                       0),
987                                                              le_key_k_offset
988                                                              (version,
989                                                               B_N_PKEY(tb->R[0],
990                                                                        0)) +
991                                                              temp_rem);
992                                                         set_le_key_k_offset
993                                                             (version,
994                                                              B_N_PDELIM_KEY(tb->
995                                                                             CFR
996                                                                             [0],
997                                                                             tb->
998                                                                             rkey
999                                                                             [0]),
1000                                                              le_key_k_offset
1001                                                              (version,
1002                                                               B_N_PDELIM_KEY
1003                                                               (tb->CFR[0],
1004                                                                tb->rkey[0])) +
1005                                                              temp_rem);
1006                                                 }
1007 /*                k_offset (B_N_PKEY(tb->R[0],0)) += n_rem;
1008                   k_offset (B_N_PDELIM_KEY(tb->CFR[0],tb->rkey[0])) += n_rem;*/
1009                                                 do_balance_mark_internal_dirty
1010                                                     (tb, tb->CFR[0], 0);
1011
1012                                                 /* Append part of body into R[0] */
1013                                                 buffer_info_init_right(tb, &bi);
1014                                                 if (n_rem > zeros_num) {
1015                                                         r_zeros_number = 0;
1016                                                         r_body =
1017                                                             body + n_rem -
1018                                                             zeros_num;
1019                                                 } else {
1020                                                         r_body = body;
1021                                                         r_zeros_number =
1022                                                             zeros_num - n_rem;
1023                                                         zeros_num -=
1024                                                             r_zeros_number;
1025                                                 }
1026
1027                                                 leaf_paste_in_buffer(&bi, 0,
1028                                                                      n_shift,
1029                                                                      tb->
1030                                                                      insert_size
1031                                                                      [0] -
1032                                                                      n_rem,
1033                                                                      r_body,
1034                                                                      r_zeros_number);
1035
1036                                                 if (is_indirect_le_ih
1037                                                     (B_N_PITEM_HEAD
1038                                                      (tb->R[0], 0))) {
1039 #if 0
1040                                                         RFALSE(n_rem,
1041                                                                "PAP-12160: paste more than one unformatted node pointer");
1042 #endif
1043                                                         set_ih_free_space
1044                                                             (B_N_PITEM_HEAD
1045                                                              (tb->R[0], 0), 0);
1046                                                 }
1047                                                 tb->insert_size[0] = n_rem;
1048                                                 if (!n_rem)
1049                                                         pos_in_item++;
1050                                         }
1051                                 } else {        /* pasted item in whole falls into R[0] */
1052
1053                                         struct item_head *pasted;
1054
1055                                         ret_val =
1056                                             leaf_shift_right(tb, tb->rnum[0],
1057                                                              tb->rbytes);
1058                                         /* append item in R[0] */
1059                                         if (pos_in_item >= 0) {
1060                                                 buffer_info_init_right(tb, &bi);
1061                                                 leaf_paste_in_buffer(&bi,
1062                                                                      item_pos -
1063                                                                      n +
1064                                                                      tb->
1065                                                                      rnum[0],
1066                                                                      pos_in_item,
1067                                                                      tb->
1068                                                                      insert_size
1069                                                                      [0], body,
1070                                                                      zeros_num);
1071                                         }
1072
1073                                         /* paste new entry, if item is directory item */
1074                                         pasted =
1075                                             B_N_PITEM_HEAD(tb->R[0],
1076                                                            item_pos - n +
1077                                                            tb->rnum[0]);
1078                                         if (is_direntry_le_ih(pasted)
1079                                             && pos_in_item >= 0) {
1080                                                 leaf_paste_entries(&bi,
1081                                                                    item_pos -
1082                                                                    n +
1083                                                                    tb->rnum[0],
1084                                                                    pos_in_item,
1085                                                                    1,
1086                                                                    (struct
1087                                                                     reiserfs_de_head
1088                                                                     *)body,
1089                                                                    body +
1090                                                                    DEH_SIZE,
1091                                                                    tb->
1092                                                                    insert_size
1093                                                                    [0]
1094                                                     );
1095                                                 if (!pos_in_item) {
1096
1097                                                         RFALSE(item_pos - n +
1098                                                                tb->rnum[0],
1099                                                                "PAP-12165: directory item must be first item of node when pasting is in 0th position");
1100
1101                                                         /* update delimiting keys */
1102                                                         replace_key(tb,
1103                                                                     tb->CFR[0],
1104                                                                     tb->rkey[0],
1105                                                                     tb->R[0],
1106                                                                     0);
1107                                                 }
1108                                         }
1109
1110                                         if (is_indirect_le_ih(pasted))
1111                                                 set_ih_free_space(pasted, 0);
1112                                         zeros_num = tb->insert_size[0] = 0;
1113                                 }
1114                         } else {        /* new item doesn't fall into R[0] */
1115
1116                                 leaf_shift_right(tb, tb->rnum[0], tb->rbytes);
1117                         }
1118                         break;
1119                 default:        /* cases d and t */
1120                         reiserfs_panic(tb->tb_sb, "PAP-12175",
1121                                        "rnum > 0: unexpected mode: %s(%d)",
1122                                        (flag ==
1123                                         M_DELETE) ? "DELETE" : ((flag ==
1124                                                                  M_CUT) ? "CUT"
1125                                                                 : "UNKNOWN"),
1126                                        flag);
1127                 }
1128
1129         }
1130
1131         /* tb->rnum[0] > 0 */
1132         RFALSE(tb->blknum[0] > 3,
1133                "PAP-12180: blknum can not be %d. It must be <= 3",
1134                tb->blknum[0]);
1135         RFALSE(tb->blknum[0] < 0,
1136                "PAP-12185: blknum can not be %d. It must be >= 0",
1137                tb->blknum[0]);
1138
1139         /* if while adding to a node we discover that it is possible to split
1140            it in two, and merge the left part into the left neighbor and the
1141            right part into the right neighbor, eliminating the node */
1142         if (tb->blknum[0] == 0) {       /* node S[0] is empty now */
1143
1144                 RFALSE(!tb->lnum[0] || !tb->rnum[0],
1145                        "PAP-12190: lnum and rnum must not be zero");
1146                 /* if insertion was done before 0-th position in R[0], right
1147                    delimiting key of the tb->L[0]'s and left delimiting key are
1148                    not set correctly */
1149                 if (tb->CFL[0]) {
1150                         if (!tb->CFR[0])
1151                                 reiserfs_panic(tb->tb_sb, "vs-12195",
1152                                                "CFR not initialized");
1153                         copy_key(B_N_PDELIM_KEY(tb->CFL[0], tb->lkey[0]),
1154                                  B_N_PDELIM_KEY(tb->CFR[0], tb->rkey[0]));
1155                         do_balance_mark_internal_dirty(tb, tb->CFL[0], 0);
1156                 }
1157
1158                 reiserfs_invalidate_buffer(tb, tbS0);
1159                 return 0;
1160         }
1161
1162         /* Fill new nodes that appear in place of S[0] */
1163
1164         /* I am told that this copying is because we need an array to enable
1165            the looping code. -Hans */
1166         snum[0] = tb->s1num, snum[1] = tb->s2num;
1167         sbytes[0] = tb->s1bytes;
1168         sbytes[1] = tb->s2bytes;
1169         for (i = tb->blknum[0] - 2; i >= 0; i--) {
1170
1171                 RFALSE(!snum[i], "PAP-12200: snum[%d] == %d. Must be > 0", i,
1172                        snum[i]);
1173
1174                 /* here we shift from S to S_new nodes */
1175
1176                 S_new[i] = get_FEB(tb);
1177
1178                 /* initialized block type and tree level */
1179                 set_blkh_level(B_BLK_HEAD(S_new[i]), DISK_LEAF_NODE_LEVEL);
1180
1181                 n = B_NR_ITEMS(tbS0);
1182
1183                 switch (flag) {
1184                 case M_INSERT:  /* insert item */
1185
1186                         if (n - snum[i] < item_pos) {   /* new item or it's part falls to first new node S_new[i] */
1187                                 if (item_pos == n - snum[i] + 1 && sbytes[i] != -1) {   /* part of new item falls into S_new[i] */
1188                                         int old_key_comp, old_len,
1189                                             r_zeros_number;
1190                                         const char *r_body;
1191                                         int version;
1192
1193                                         /* Move snum[i]-1 items from S[0] to S_new[i] */
1194                                         leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
1195                                                         snum[i] - 1, -1,
1196                                                         S_new[i]);
1197                                         /* Remember key component and item length */
1198                                         version = ih_version(ih);
1199                                         old_key_comp = le_ih_k_offset(ih);
1200                                         old_len = ih_item_len(ih);
1201
1202                                         /* Calculate key component and item length to insert into S_new[i] */
1203                                         set_le_ih_k_offset(ih,
1204                                                            le_ih_k_offset(ih) +
1205                                                            ((old_len -
1206                                                              sbytes[i]) <<
1207                                                             (is_indirect_le_ih
1208                                                              (ih) ? tb->tb_sb->
1209                                                              s_blocksize_bits -
1210                                                              UNFM_P_SHIFT :
1211                                                              0)));
1212
1213                                         put_ih_item_len(ih, sbytes[i]);
1214
1215                                         /* Insert part of the item into S_new[i] before 0-th item */
1216                                         buffer_info_init_bh(tb, &bi, S_new[i]);
1217
1218                                         if ((old_len - sbytes[i]) > zeros_num) {
1219                                                 r_zeros_number = 0;
1220                                                 r_body =
1221                                                     body + (old_len -
1222                                                             sbytes[i]) -
1223                                                     zeros_num;
1224                                         } else {
1225                                                 r_body = body;
1226                                                 r_zeros_number =
1227                                                     zeros_num - (old_len -
1228                                                                  sbytes[i]);
1229                                                 zeros_num -= r_zeros_number;
1230                                         }
1231
1232                                         leaf_insert_into_buf(&bi, 0, ih, r_body,
1233                                                              r_zeros_number);
1234
1235                                         /* Calculate key component and item length to insert into S[i] */
1236                                         set_le_ih_k_offset(ih, old_key_comp);
1237                                         put_ih_item_len(ih,
1238                                                         old_len - sbytes[i]);
1239                                         tb->insert_size[0] -= sbytes[i];
1240                                 } else {        /* whole new item falls into S_new[i] */
1241
1242                                         /* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */
1243                                         leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
1244                                                         snum[i] - 1, sbytes[i],
1245                                                         S_new[i]);
1246
1247                                         /* Insert new item into S_new[i] */
1248                                         buffer_info_init_bh(tb, &bi, S_new[i]);
1249                                         leaf_insert_into_buf(&bi,
1250                                                              item_pos - n +
1251                                                              snum[i] - 1, ih,
1252                                                              body, zeros_num);
1253
1254                                         zeros_num = tb->insert_size[0] = 0;
1255                                 }
1256                         }
1257
1258                         else {  /* new item or it part don't falls into S_new[i] */
1259
1260                                 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
1261                                                 snum[i], sbytes[i], S_new[i]);
1262                         }
1263                         break;
1264
1265                 case M_PASTE:   /* append item */
1266
1267                         if (n - snum[i] <= item_pos) {  /* pasted item or part if it falls to S_new[i] */
1268                                 if (item_pos == n - snum[i] && sbytes[i] != -1) {       /* we must shift part of the appended item */
1269                                         struct item_head *aux_ih;
1270
1271                                         RFALSE(ih, "PAP-12210: ih must be 0");
1272
1273                                         aux_ih = B_N_PITEM_HEAD(tbS0, item_pos);
1274                                         if (is_direntry_le_ih(aux_ih)) {
1275                                                 /* we append to directory item */
1276
1277                                                 int entry_count;
1278
1279                                                 entry_count =
1280                                                     ih_entry_count(aux_ih);
1281
1282                                                 if (entry_count - sbytes[i] <
1283                                                     pos_in_item
1284                                                     && pos_in_item <=
1285                                                     entry_count) {
1286                                                         /* new directory entry falls into S_new[i] */
1287
1288                                                         RFALSE(!tb->
1289                                                                insert_size[0],
1290                                                                "PAP-12215: insert_size is already 0");
1291                                                         RFALSE(sbytes[i] - 1 >=
1292                                                                entry_count,
1293                                                                "PAP-12220: there are no so much entries (%d), only %d",
1294                                                                sbytes[i] - 1,
1295                                                                entry_count);
1296
1297                                                         /* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */
1298                                                         leaf_move_items
1299                                                             (LEAF_FROM_S_TO_SNEW,
1300                                                              tb, snum[i],
1301                                                              sbytes[i] - 1,
1302                                                              S_new[i]);
1303                                                         /* Paste given directory entry to directory item */
1304                                                         buffer_info_init_bh(tb, &bi, S_new[i]);
1305                                                         leaf_paste_in_buffer
1306                                                             (&bi, 0,
1307                                                              pos_in_item -
1308                                                              entry_count +
1309                                                              sbytes[i] - 1,
1310                                                              tb->insert_size[0],
1311                                                              body, zeros_num);
1312                                                         /* paste new directory entry */
1313                                                         leaf_paste_entries(&bi,
1314                                                                            0,
1315                                                                            pos_in_item
1316                                                                            -
1317                                                                            entry_count
1318                                                                            +
1319                                                                            sbytes
1320                                                                            [i] -
1321                                                                            1, 1,
1322                                                                            (struct
1323                                                                             reiserfs_de_head
1324                                                                             *)
1325                                                                            body,
1326                                                                            body
1327                                                                            +
1328                                                                            DEH_SIZE,
1329                                                                            tb->
1330                                                                            insert_size
1331                                                                            [0]
1332                                                             );
1333                                                         tb->insert_size[0] = 0;
1334                                                         pos_in_item++;
1335                                                 } else {        /* new directory entry doesn't fall into S_new[i] */
1336                                                         leaf_move_items
1337                                                             (LEAF_FROM_S_TO_SNEW,
1338                                                              tb, snum[i],
1339                                                              sbytes[i],
1340                                                              S_new[i]);
1341                                                 }
1342                                         } else {        /* regular object */
1343
1344                                                 int n_shift, n_rem,
1345                                                     r_zeros_number;
1346                                                 const char *r_body;
1347
1348                                                 RFALSE(pos_in_item !=
1349                                                        ih_item_len
1350                                                        (B_N_PITEM_HEAD
1351                                                         (tbS0, item_pos))
1352                                                        || tb->insert_size[0] <=
1353                                                        0,
1354                                                        "PAP-12225: item too short or insert_size <= 0");
1355
1356                                                 /* Calculate number of bytes which must be shifted from appended item */
1357                                                 n_shift =
1358                                                     sbytes[i] -
1359                                                     tb->insert_size[0];
1360                                                 if (n_shift < 0)
1361                                                         n_shift = 0;
1362                                                 leaf_move_items
1363                                                     (LEAF_FROM_S_TO_SNEW, tb,
1364                                                      snum[i], n_shift,
1365                                                      S_new[i]);
1366
1367                                                 /* Calculate number of bytes which must remain in body after append to S_new[i] */
1368                                                 n_rem =
1369                                                     tb->insert_size[0] -
1370                                                     sbytes[i];
1371                                                 if (n_rem < 0)
1372                                                         n_rem = 0;
1373                                                 /* Append part of body into S_new[0] */
1374                                                 buffer_info_init_bh(tb, &bi, S_new[i]);
1375                                                 if (n_rem > zeros_num) {
1376                                                         r_zeros_number = 0;
1377                                                         r_body =
1378                                                             body + n_rem -
1379                                                             zeros_num;
1380                                                 } else {
1381                                                         r_body = body;
1382                                                         r_zeros_number =
1383                                                             zeros_num - n_rem;
1384                                                         zeros_num -=
1385                                                             r_zeros_number;
1386                                                 }
1387
1388                                                 leaf_paste_in_buffer(&bi, 0,
1389                                                                      n_shift,
1390                                                                      tb->
1391                                                                      insert_size
1392                                                                      [0] -
1393                                                                      n_rem,
1394                                                                      r_body,
1395                                                                      r_zeros_number);
1396                                                 {
1397                                                         struct item_head *tmp;
1398
1399                                                         tmp =
1400                                                             B_N_PITEM_HEAD(S_new
1401                                                                            [i],
1402                                                                            0);
1403                                                         if (is_indirect_le_ih
1404                                                             (tmp)) {
1405                                                                 set_ih_free_space
1406                                                                     (tmp, 0);
1407                                                                 set_le_ih_k_offset
1408                                                                     (tmp,
1409                                                                      le_ih_k_offset
1410                                                                      (tmp) +
1411                                                                      (n_rem <<
1412                                                                       (tb->
1413                                                                        tb_sb->
1414                                                                        s_blocksize_bits
1415                                                                        -
1416                                                                        UNFM_P_SHIFT)));
1417                                                         } else {
1418                                                                 set_le_ih_k_offset
1419                                                                     (tmp,
1420                                                                      le_ih_k_offset
1421                                                                      (tmp) +
1422                                                                      n_rem);
1423                                                         }
1424                                                 }
1425
1426                                                 tb->insert_size[0] = n_rem;
1427                                                 if (!n_rem)
1428                                                         pos_in_item++;
1429                                         }
1430                                 } else
1431                                         /* item falls wholly into S_new[i] */
1432                                 {
1433                                         int leaf_mi;
1434                                         struct item_head *pasted;
1435
1436 #ifdef CONFIG_REISERFS_CHECK
1437                                         struct item_head *ih_check =
1438                                             B_N_PITEM_HEAD(tbS0, item_pos);
1439
1440                                         if (!is_direntry_le_ih(ih_check)
1441                                             && (pos_in_item != ih_item_len(ih_check)
1442                                                 || tb->insert_size[0] <= 0))
1443                                                 reiserfs_panic(tb->tb_sb,
1444                                                              "PAP-12235",
1445                                                              "pos_in_item "
1446                                                              "must be equal "
1447                                                              "to ih_item_len");
1448 #endif                          /* CONFIG_REISERFS_CHECK */
1449
1450                                         leaf_mi =
1451                                             leaf_move_items(LEAF_FROM_S_TO_SNEW,
1452                                                             tb, snum[i],
1453                                                             sbytes[i],
1454                                                             S_new[i]);
1455
1456                                         RFALSE(leaf_mi,
1457                                                "PAP-12240: unexpected value returned by leaf_move_items (%d)",
1458                                                leaf_mi);
1459
1460                                         /* paste into item */
1461                                         buffer_info_init_bh(tb, &bi, S_new[i]);
1462                                         leaf_paste_in_buffer(&bi,
1463                                                              item_pos - n +
1464                                                              snum[i],
1465                                                              pos_in_item,
1466                                                              tb->insert_size[0],
1467                                                              body, zeros_num);
1468
1469                                         pasted =
1470                                             B_N_PITEM_HEAD(S_new[i],
1471                                                            item_pos - n +
1472                                                            snum[i]);
1473                                         if (is_direntry_le_ih(pasted)) {
1474                                                 leaf_paste_entries(&bi,
1475                                                                    item_pos -
1476                                                                    n + snum[i],
1477                                                                    pos_in_item,
1478                                                                    1,
1479                                                                    (struct
1480                                                                     reiserfs_de_head
1481                                                                     *)body,
1482                                                                    body +
1483                                                                    DEH_SIZE,
1484                                                                    tb->
1485                                                                    insert_size
1486                                                                    [0]
1487                                                     );
1488                                         }
1489
1490                                         /* if we paste to indirect item update ih_free_space */
1491                                         if (is_indirect_le_ih(pasted))
1492                                                 set_ih_free_space(pasted, 0);
1493                                         zeros_num = tb->insert_size[0] = 0;
1494                                 }
1495                         }
1496
1497                         else {  /* pasted item doesn't fall into S_new[i] */
1498
1499                                 leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
1500                                                 snum[i], sbytes[i], S_new[i]);
1501                         }
1502                         break;
1503                 default:        /* cases d and t */
1504                         reiserfs_panic(tb->tb_sb, "PAP-12245",
1505                                        "blknum > 2: unexpected mode: %s(%d)",
1506                                        (flag ==
1507                                         M_DELETE) ? "DELETE" : ((flag ==
1508                                                                  M_CUT) ? "CUT"
1509                                                                 : "UNKNOWN"),
1510                                        flag);
1511                 }
1512
1513                 memcpy(insert_key + i, B_N_PKEY(S_new[i], 0), KEY_SIZE);
1514                 insert_ptr[i] = S_new[i];
1515
1516                 RFALSE(!buffer_journaled(S_new[i])
1517                        || buffer_journal_dirty(S_new[i])
1518                        || buffer_dirty(S_new[i]), "PAP-12247: S_new[%d] : (%b)",
1519                        i, S_new[i]);
1520         }
1521
1522         /* if the affected item was not wholly shifted then we perform all necessary operations on that part or whole of the
1523            affected item which remains in S */
1524         if (0 <= item_pos && item_pos < tb->s0num) {    /* if we must insert or append into buffer S[0] */
1525
1526                 switch (flag) {
1527                 case M_INSERT:  /* insert item into S[0] */
1528                         buffer_info_init_tbS0(tb, &bi);
1529                         leaf_insert_into_buf(&bi, item_pos, ih, body,
1530                                              zeros_num);
1531
1532                         /* If we insert the first key change the delimiting key */
1533                         if (item_pos == 0) {
1534                                 if (tb->CFL[0]) /* can be 0 in reiserfsck */
1535                                         replace_key(tb, tb->CFL[0], tb->lkey[0],
1536                                                     tbS0, 0);
1537
1538                         }
1539                         break;
1540
1541                 case M_PASTE:{  /* append item in S[0] */
1542                                 struct item_head *pasted;
1543
1544                                 pasted = B_N_PITEM_HEAD(tbS0, item_pos);
1545                                 /* when directory, may be new entry already pasted */
1546                                 if (is_direntry_le_ih(pasted)) {
1547                                         if (pos_in_item >= 0 &&
1548                                             pos_in_item <=
1549                                             ih_entry_count(pasted)) {
1550
1551                                                 RFALSE(!tb->insert_size[0],
1552                                                        "PAP-12260: insert_size is 0 already");
1553
1554                                                 /* prepare space */
1555                                                 buffer_info_init_tbS0(tb, &bi);
1556                                                 leaf_paste_in_buffer(&bi,
1557                                                                      item_pos,
1558                                                                      pos_in_item,
1559                                                                      tb->
1560                                                                      insert_size
1561                                                                      [0], body,
1562                                                                      zeros_num);
1563
1564                                                 /* paste entry */
1565                                                 leaf_paste_entries(&bi,
1566                                                                    item_pos,
1567                                                                    pos_in_item,
1568                                                                    1,
1569                                                                    (struct
1570                                                                     reiserfs_de_head
1571                                                                     *)body,
1572                                                                    body +
1573                                                                    DEH_SIZE,
1574                                                                    tb->
1575                                                                    insert_size
1576                                                                    [0]
1577                                                     );
1578                                                 if (!item_pos && !pos_in_item) {
1579                                                         RFALSE(!tb->CFL[0]
1580                                                                || !tb->L[0],
1581                                                                "PAP-12270: CFL[0]/L[0] must be specified");
1582                                                         if (tb->CFL[0]) {
1583                                                                 replace_key(tb,
1584                                                                             tb->
1585                                                                             CFL
1586                                                                             [0],
1587                                                                             tb->
1588                                                                             lkey
1589                                                                             [0],
1590                                                                             tbS0,
1591                                                                             0);
1592
1593                                                         }
1594                                                 }
1595                                                 tb->insert_size[0] = 0;
1596                                         }
1597                                 } else {        /* regular object */
1598                                         if (pos_in_item == ih_item_len(pasted)) {
1599
1600                                                 RFALSE(tb->insert_size[0] <= 0,
1601                                                        "PAP-12275: insert size must not be %d",
1602                                                        tb->insert_size[0]);
1603                                                 buffer_info_init_tbS0(tb, &bi);
1604                                                 leaf_paste_in_buffer(&bi,
1605                                                                      item_pos,
1606                                                                      pos_in_item,
1607                                                                      tb->
1608                                                                      insert_size
1609                                                                      [0], body,
1610                                                                      zeros_num);
1611
1612                                                 if (is_indirect_le_ih(pasted)) {
1613 #if 0
1614                                                         RFALSE(tb->
1615                                                                insert_size[0] !=
1616                                                                UNFM_P_SIZE,
1617                                                                "PAP-12280: insert_size for indirect item must be %d, not %d",
1618                                                                UNFM_P_SIZE,
1619                                                                tb->
1620                                                                insert_size[0]);
1621 #endif
1622                                                         set_ih_free_space
1623                                                             (pasted, 0);
1624                                                 }
1625                                                 tb->insert_size[0] = 0;
1626                                         }
1627 #ifdef CONFIG_REISERFS_CHECK
1628                                         else {
1629                                                 if (tb->insert_size[0]) {
1630                                                         print_cur_tb("12285");
1631                                                         reiserfs_panic(tb->
1632                                                                        tb_sb,
1633                                                             "PAP-12285",
1634                                                             "insert_size "
1635                                                             "must be 0 "
1636                                                             "(%d)",
1637                                                             tb->insert_size[0]);
1638                                                 }
1639                                         }
1640 #endif                          /* CONFIG_REISERFS_CHECK */
1641
1642                                 }
1643                         }       /* case M_PASTE: */
1644                 }
1645         }
1646 #ifdef CONFIG_REISERFS_CHECK
1647         if (flag == M_PASTE && tb->insert_size[0]) {
1648                 print_cur_tb("12290");
1649                 reiserfs_panic(tb->tb_sb,
1650                                "PAP-12290", "insert_size is still not 0 (%d)",
1651                                tb->insert_size[0]);
1652         }
1653 #endif                          /* CONFIG_REISERFS_CHECK */
1654         return 0;
1655 }                               /* Leaf level of the tree is balanced (end of balance_leaf) */
1656
1657 /* Make empty node */
1658 void make_empty_node(struct buffer_info *bi)
1659 {
1660         struct block_head *blkh;
1661
1662         RFALSE(bi->bi_bh == NULL, "PAP-12295: pointer to the buffer is NULL");
1663
1664         blkh = B_BLK_HEAD(bi->bi_bh);
1665         set_blkh_nr_item(blkh, 0);
1666         set_blkh_free_space(blkh, MAX_CHILD_SIZE(bi->bi_bh));
1667
1668         if (bi->bi_parent)
1669                 B_N_CHILD(bi->bi_parent, bi->bi_position)->dc_size = 0; /* Endian safe if 0 */
1670 }
1671
1672 /* Get first empty buffer */
1673 struct buffer_head *get_FEB(struct tree_balance *tb)
1674 {
1675         int i;
1676         struct buffer_info bi;
1677
1678         for (i = 0; i < MAX_FEB_SIZE; i++)
1679                 if (tb->FEB[i] != NULL)
1680                         break;
1681
1682         if (i == MAX_FEB_SIZE)
1683                 reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty");
1684
1685         buffer_info_init_bh(tb, &bi, tb->FEB[i]);
1686         make_empty_node(&bi);
1687         set_buffer_uptodate(tb->FEB[i]);
1688         tb->used[i] = tb->FEB[i];
1689         tb->FEB[i] = NULL;
1690
1691         return tb->used[i];
1692 }
1693
1694 /* This is now used because reiserfs_free_block has to be able to
1695 ** schedule.
1696 */
1697 static void store_thrown(struct tree_balance *tb, struct buffer_head *bh)
1698 {
1699         int i;
1700
1701         if (buffer_dirty(bh))
1702                 reiserfs_warning(tb->tb_sb, "reiserfs-12320",
1703                                  "called with dirty buffer");
1704         for (i = 0; i < ARRAY_SIZE(tb->thrown); i++)
1705                 if (!tb->thrown[i]) {
1706                         tb->thrown[i] = bh;
1707                         get_bh(bh);     /* free_thrown puts this */
1708                         return;
1709                 }
1710         reiserfs_warning(tb->tb_sb, "reiserfs-12321",
1711                          "too many thrown buffers");
1712 }
1713
1714 static void free_thrown(struct tree_balance *tb)
1715 {
1716         int i;
1717         b_blocknr_t blocknr;
1718         for (i = 0; i < ARRAY_SIZE(tb->thrown); i++) {
1719                 if (tb->thrown[i]) {
1720                         blocknr = tb->thrown[i]->b_blocknr;
1721                         if (buffer_dirty(tb->thrown[i]))
1722                                 reiserfs_warning(tb->tb_sb, "reiserfs-12322",
1723                                                  "called with dirty buffer %d",
1724                                                  blocknr);
1725                         brelse(tb->thrown[i]);  /* incremented in store_thrown */
1726                         reiserfs_free_block(tb->transaction_handle, NULL,
1727                                             blocknr, 0);
1728                 }
1729         }
1730 }
1731
1732 void reiserfs_invalidate_buffer(struct tree_balance *tb, struct buffer_head *bh)
1733 {
1734         struct block_head *blkh;
1735         blkh = B_BLK_HEAD(bh);
1736         set_blkh_level(blkh, FREE_LEVEL);
1737         set_blkh_nr_item(blkh, 0);
1738
1739         clear_buffer_dirty(bh);
1740         store_thrown(tb, bh);
1741 }
1742
1743 /* Replace n_dest'th key in buffer dest by n_src'th key of buffer src.*/
1744 void replace_key(struct tree_balance *tb, struct buffer_head *dest, int n_dest,
1745                  struct buffer_head *src, int n_src)
1746 {
1747
1748         RFALSE(dest == NULL || src == NULL,
1749                "vs-12305: source or destination buffer is 0 (src=%p, dest=%p)",
1750                src, dest);
1751         RFALSE(!B_IS_KEYS_LEVEL(dest),
1752                "vs-12310: invalid level (%z) for destination buffer. dest must be leaf",
1753                dest);
1754         RFALSE(n_dest < 0 || n_src < 0,
1755                "vs-12315: src(%d) or dest(%d) key number < 0", n_src, n_dest);
1756         RFALSE(n_dest >= B_NR_ITEMS(dest) || n_src >= B_NR_ITEMS(src),
1757                "vs-12320: src(%d(%d)) or dest(%d(%d)) key number is too big",
1758                n_src, B_NR_ITEMS(src), n_dest, B_NR_ITEMS(dest));
1759
1760         if (B_IS_ITEMS_LEVEL(src))
1761                 /* source buffer contains leaf node */
1762                 memcpy(B_N_PDELIM_KEY(dest, n_dest), B_N_PITEM_HEAD(src, n_src),
1763                        KEY_SIZE);
1764         else
1765                 memcpy(B_N_PDELIM_KEY(dest, n_dest), B_N_PDELIM_KEY(src, n_src),
1766                        KEY_SIZE);
1767
1768         do_balance_mark_internal_dirty(tb, dest, 0);
1769 }
1770
1771 int get_left_neighbor_position(struct tree_balance *tb, int h)
1772 {
1773         int Sh_position = PATH_H_POSITION(tb->tb_path, h + 1);
1774
1775         RFALSE(PATH_H_PPARENT(tb->tb_path, h) == NULL || tb->FL[h] == NULL,
1776                "vs-12325: FL[%d](%p) or F[%d](%p) does not exist",
1777                h, tb->FL[h], h, PATH_H_PPARENT(tb->tb_path, h));
1778
1779         if (Sh_position == 0)
1780                 return B_NR_ITEMS(tb->FL[h]);
1781         else
1782                 return Sh_position - 1;
1783 }
1784
1785 int get_right_neighbor_position(struct tree_balance *tb, int h)
1786 {
1787         int Sh_position = PATH_H_POSITION(tb->tb_path, h + 1);
1788
1789         RFALSE(PATH_H_PPARENT(tb->tb_path, h) == NULL || tb->FR[h] == NULL,
1790                "vs-12330: F[%d](%p) or FR[%d](%p) does not exist",
1791                h, PATH_H_PPARENT(tb->tb_path, h), h, tb->FR[h]);
1792
1793         if (Sh_position == B_NR_ITEMS(PATH_H_PPARENT(tb->tb_path, h)))
1794                 return 0;
1795         else
1796                 return Sh_position + 1;
1797 }
1798
1799 #ifdef CONFIG_REISERFS_CHECK
1800
1801 int is_reusable(struct super_block *s, b_blocknr_t block, int bit_value);
1802 static void check_internal_node(struct super_block *s, struct buffer_head *bh,
1803                                 char *mes)
1804 {
1805         struct disk_child *dc;
1806         int i;
1807
1808         RFALSE(!bh, "PAP-12336: bh == 0");
1809
1810         if (!bh || !B_IS_IN_TREE(bh))
1811                 return;
1812
1813         RFALSE(!buffer_dirty(bh) &&
1814                !(buffer_journaled(bh) || buffer_journal_dirty(bh)),
1815                "PAP-12337: buffer (%b) must be dirty", bh);
1816         dc = B_N_CHILD(bh, 0);
1817
1818         for (i = 0; i <= B_NR_ITEMS(bh); i++, dc++) {
1819                 if (!is_reusable(s, dc_block_number(dc), 1)) {
1820                         print_cur_tb(mes);
1821                         reiserfs_panic(s, "PAP-12338",
1822                                        "invalid child pointer %y in %b",
1823                                        dc, bh);
1824                 }
1825         }
1826 }
1827
1828 static int locked_or_not_in_tree(struct tree_balance *tb,
1829                                   struct buffer_head *bh, char *which)
1830 {
1831         if ((!buffer_journal_prepared(bh) && buffer_locked(bh)) ||
1832             !B_IS_IN_TREE(bh)) {
1833                 reiserfs_warning(tb->tb_sb, "vs-12339", "%s (%b)", which, bh);
1834                 return 1;
1835         }
1836         return 0;
1837 }
1838
1839 static int check_before_balancing(struct tree_balance *tb)
1840 {
1841         int retval = 0;
1842
1843         if (cur_tb) {
1844                 reiserfs_panic(tb->tb_sb, "vs-12335", "suspect that schedule "
1845                                "occurred based on cur_tb not being null at "
1846                                "this point in code. do_balance cannot properly "
1847                                "handle schedule occurring while it runs.");
1848         }
1849
1850         /* double check that buffers that we will modify are unlocked. (fix_nodes should already have
1851            prepped all of these for us). */
1852         if (tb->lnum[0]) {
1853                 retval |= locked_or_not_in_tree(tb, tb->L[0], "L[0]");
1854                 retval |= locked_or_not_in_tree(tb, tb->FL[0], "FL[0]");
1855                 retval |= locked_or_not_in_tree(tb, tb->CFL[0], "CFL[0]");
1856                 check_leaf(tb->L[0]);
1857         }
1858         if (tb->rnum[0]) {
1859                 retval |= locked_or_not_in_tree(tb, tb->R[0], "R[0]");
1860                 retval |= locked_or_not_in_tree(tb, tb->FR[0], "FR[0]");
1861                 retval |= locked_or_not_in_tree(tb, tb->CFR[0], "CFR[0]");
1862                 check_leaf(tb->R[0]);
1863         }
1864         retval |= locked_or_not_in_tree(tb, PATH_PLAST_BUFFER(tb->tb_path),
1865                                         "S[0]");
1866         check_leaf(PATH_PLAST_BUFFER(tb->tb_path));
1867
1868         return retval;
1869 }
1870
1871 static void check_after_balance_leaf(struct tree_balance *tb)
1872 {
1873         if (tb->lnum[0]) {
1874                 if (B_FREE_SPACE(tb->L[0]) !=
1875                     MAX_CHILD_SIZE(tb->L[0]) -
1876                     dc_size(B_N_CHILD
1877                             (tb->FL[0], get_left_neighbor_position(tb, 0)))) {
1878                         print_cur_tb("12221");
1879                         reiserfs_panic(tb->tb_sb, "PAP-12355",
1880                                        "shift to left was incorrect");
1881                 }
1882         }
1883         if (tb->rnum[0]) {
1884                 if (B_FREE_SPACE(tb->R[0]) !=
1885                     MAX_CHILD_SIZE(tb->R[0]) -
1886                     dc_size(B_N_CHILD
1887                             (tb->FR[0], get_right_neighbor_position(tb, 0)))) {
1888                         print_cur_tb("12222");
1889                         reiserfs_panic(tb->tb_sb, "PAP-12360",
1890                                        "shift to right was incorrect");
1891                 }
1892         }
1893         if (PATH_H_PBUFFER(tb->tb_path, 1) &&
1894             (B_FREE_SPACE(PATH_H_PBUFFER(tb->tb_path, 0)) !=
1895              (MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)) -
1896               dc_size(B_N_CHILD(PATH_H_PBUFFER(tb->tb_path, 1),
1897                                 PATH_H_POSITION(tb->tb_path, 1)))))) {
1898                 int left = B_FREE_SPACE(PATH_H_PBUFFER(tb->tb_path, 0));
1899                 int right = (MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)) -
1900                              dc_size(B_N_CHILD(PATH_H_PBUFFER(tb->tb_path, 1),
1901                                                PATH_H_POSITION(tb->tb_path,
1902                                                                1))));
1903                 print_cur_tb("12223");
1904                 reiserfs_warning(tb->tb_sb, "reiserfs-12363",
1905                                  "B_FREE_SPACE (PATH_H_PBUFFER(tb->tb_path,0)) = %d; "
1906                                  "MAX_CHILD_SIZE (%d) - dc_size( %y, %d ) [%d] = %d",
1907                                  left,
1908                                  MAX_CHILD_SIZE(PATH_H_PBUFFER(tb->tb_path, 0)),
1909                                  PATH_H_PBUFFER(tb->tb_path, 1),
1910                                  PATH_H_POSITION(tb->tb_path, 1),
1911                                  dc_size(B_N_CHILD
1912                                          (PATH_H_PBUFFER(tb->tb_path, 1),
1913                                           PATH_H_POSITION(tb->tb_path, 1))),
1914                                  right);
1915                 reiserfs_panic(tb->tb_sb, "PAP-12365", "S is incorrect");
1916         }
1917 }
1918
1919 static void check_leaf_level(struct tree_balance *tb)
1920 {
1921         check_leaf(tb->L[0]);
1922         check_leaf(tb->R[0]);
1923         check_leaf(PATH_PLAST_BUFFER(tb->tb_path));
1924 }
1925
1926 static void check_internal_levels(struct tree_balance *tb)
1927 {
1928         int h;
1929
1930         /* check all internal nodes */
1931         for (h = 1; tb->insert_size[h]; h++) {
1932                 check_internal_node(tb->tb_sb, PATH_H_PBUFFER(tb->tb_path, h),
1933                                     "BAD BUFFER ON PATH");
1934                 if (tb->lnum[h])
1935                         check_internal_node(tb->tb_sb, tb->L[h], "BAD L");
1936                 if (tb->rnum[h])
1937                         check_internal_node(tb->tb_sb, tb->R[h], "BAD R");
1938         }
1939
1940 }
1941
1942 #endif
1943
1944 /* Now we have all of the buffers that must be used in balancing of
1945    the tree.  We rely on the assumption that schedule() will not occur
1946    while do_balance works. ( Only interrupt handlers are acceptable.)
1947    We balance the tree according to the analysis made before this,
1948    using buffers already obtained.  For SMP support it will someday be
1949    necessary to add ordered locking of tb. */
1950
1951 /* Some interesting rules of balancing:
1952
1953    we delete a maximum of two nodes per level per balancing: we never
1954    delete R, when we delete two of three nodes L, S, R then we move
1955    them into R.
1956
1957    we only delete L if we are deleting two nodes, if we delete only
1958    one node we delete S
1959
1960    if we shift leaves then we shift as much as we can: this is a
1961    deliberate policy of extremism in node packing which results in
1962    higher average utilization after repeated random balance operations
1963    at the cost of more memory copies and more balancing as a result of
1964    small insertions to full nodes.
1965
1966    if we shift internal nodes we try to evenly balance the node
1967    utilization, with consequent less balancing at the cost of lower
1968    utilization.
1969
1970    one could argue that the policy for directories in leaves should be
1971    that of internal nodes, but we will wait until another day to
1972    evaluate this....  It would be nice to someday measure and prove
1973    these assumptions as to what is optimal....
1974
1975 */
1976
1977 static inline void do_balance_starts(struct tree_balance *tb)
1978 {
1979         /* use print_cur_tb() to see initial state of struct
1980            tree_balance */
1981
1982         /* store_print_tb (tb); */
1983
1984         /* do not delete, just comment it out */
1985 /*    print_tb(flag, PATH_LAST_POSITION(tb->tb_path), tb->tb_path->pos_in_item, tb,
1986              "check");*/
1987         RFALSE(check_before_balancing(tb), "PAP-12340: locked buffers in TB");
1988 #ifdef CONFIG_REISERFS_CHECK
1989         cur_tb = tb;
1990 #endif
1991 }
1992
1993 static inline void do_balance_completed(struct tree_balance *tb)
1994 {
1995
1996 #ifdef CONFIG_REISERFS_CHECK
1997         check_leaf_level(tb);
1998         check_internal_levels(tb);
1999         cur_tb = NULL;
2000 #endif
2001
2002         /* reiserfs_free_block is no longer schedule safe.  So, we need to
2003          ** put the buffers we want freed on the thrown list during do_balance,
2004          ** and then free them now
2005          */
2006
2007         REISERFS_SB(tb->tb_sb)->s_do_balance++;
2008
2009         /* release all nodes hold to perform the balancing */
2010         unfix_nodes(tb);
2011
2012         free_thrown(tb);
2013 }
2014
2015 void do_balance(struct tree_balance *tb,        /* tree_balance structure */
2016                 struct item_head *ih,   /* item header of inserted item */
2017                 const char *body,       /* body  of inserted item or bytes to paste */
2018                 int flag)
2019 {                               /* i - insert, d - delete
2020                                    c - cut, p - paste
2021
2022                                    Cut means delete part of an item
2023                                    (includes removing an entry from a
2024                                    directory).
2025
2026                                    Delete means delete whole item.
2027
2028                                    Insert means add a new item into the
2029                                    tree.
2030
2031                                    Paste means to append to the end of an
2032                                    existing file or to insert a directory
2033                                    entry.  */
2034         int child_pos,          /* position of a child node in its parent */
2035          h;                     /* level of the tree being processed */
2036         struct item_head insert_key[2]; /* in our processing of one level
2037                                            we sometimes determine what
2038                                            must be inserted into the next
2039                                            higher level.  This insertion
2040                                            consists of a key or two keys
2041                                            and their corresponding
2042                                            pointers */
2043         struct buffer_head *insert_ptr[2];      /* inserted node-ptrs for the next
2044                                                    level */
2045
2046         tb->tb_mode = flag;
2047         tb->need_balance_dirty = 0;
2048
2049         if (FILESYSTEM_CHANGED_TB(tb)) {
2050                 reiserfs_panic(tb->tb_sb, "clm-6000", "fs generation has "
2051                                "changed");
2052         }
2053         /* if we have no real work to do  */
2054         if (!tb->insert_size[0]) {
2055                 reiserfs_warning(tb->tb_sb, "PAP-12350",
2056                                  "insert_size == 0, mode == %c", flag);
2057                 unfix_nodes(tb);
2058                 return;
2059         }
2060
2061         atomic_inc(&(fs_generation(tb->tb_sb)));
2062         do_balance_starts(tb);
2063
2064         /* balance leaf returns 0 except if combining L R and S into
2065            one node.  see balance_internal() for explanation of this
2066            line of code. */
2067         child_pos = PATH_H_B_ITEM_ORDER(tb->tb_path, 0) +
2068             balance_leaf(tb, ih, body, flag, insert_key, insert_ptr);
2069
2070 #ifdef CONFIG_REISERFS_CHECK
2071         check_after_balance_leaf(tb);
2072 #endif
2073
2074         /* Balance internal level of the tree. */
2075         for (h = 1; h < MAX_HEIGHT && tb->insert_size[h]; h++)
2076                 child_pos =
2077                     balance_internal(tb, h, child_pos, insert_key, insert_ptr);
2078
2079         do_balance_completed(tb);
2080
2081 }