diff options
Diffstat (limited to 'fs/reiserfs/do_balan.c')
| -rw-r--r-- | fs/reiserfs/do_balan.c | 895 |
1 files changed, 195 insertions, 700 deletions
diff --git a/fs/reiserfs/do_balan.c b/fs/reiserfs/do_balan.c index 2b7882b508db..9a3c68cf6026 100644 --- a/fs/reiserfs/do_balan.c +++ b/fs/reiserfs/do_balan.c | |||
| @@ -324,23 +324,17 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 324 | switch (flag) { | 324 | switch (flag) { |
| 325 | case M_INSERT: /* insert item into L[0] */ | 325 | case M_INSERT: /* insert item into L[0] */ |
| 326 | 326 | ||
| 327 | if (item_pos == tb->lnum[0] - 1 | 327 | if (item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) { |
| 328 | && tb->lbytes != -1) { | ||
| 329 | /* part of new item falls into L[0] */ | 328 | /* part of new item falls into L[0] */ |
| 330 | int new_item_len; | 329 | int new_item_len; |
| 331 | int version; | 330 | int version; |
| 332 | 331 | ||
| 333 | ret_val = | 332 | ret_val = leaf_shift_left(tb, tb->lnum[0] - 1, -1); |
| 334 | leaf_shift_left(tb, tb->lnum[0] - 1, | ||
| 335 | -1); | ||
| 336 | 333 | ||
| 337 | /* Calculate item length to insert to S[0] */ | 334 | /* Calculate item length to insert to S[0] */ |
| 338 | new_item_len = | 335 | new_item_len = ih_item_len(ih) - tb->lbytes; |
| 339 | ih_item_len(ih) - tb->lbytes; | ||
| 340 | /* Calculate and check item length to insert to L[0] */ | 336 | /* Calculate and check item length to insert to L[0] */ |
| 341 | put_ih_item_len(ih, | 337 | put_ih_item_len(ih, ih_item_len(ih) - new_item_len); |
| 342 | ih_item_len(ih) - | ||
| 343 | new_item_len); | ||
| 344 | 338 | ||
| 345 | RFALSE(ih_item_len(ih) <= 0, | 339 | RFALSE(ih_item_len(ih) <= 0, |
| 346 | "PAP-12080: there is nothing to insert into L[0]: ih_item_len=%d", | 340 | "PAP-12080: there is nothing to insert into L[0]: ih_item_len=%d", |
| @@ -349,30 +343,18 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 349 | /* Insert new item into L[0] */ | 343 | /* Insert new item into L[0] */ |
| 350 | buffer_info_init_left(tb, &bi); | 344 | buffer_info_init_left(tb, &bi); |
| 351 | leaf_insert_into_buf(&bi, | 345 | leaf_insert_into_buf(&bi, |
| 352 | n + item_pos - | 346 | n + item_pos - ret_val, ih, body, |
| 353 | ret_val, ih, body, | 347 | zeros_num > ih_item_len(ih) ? ih_item_len(ih) : zeros_num); |
| 354 | zeros_num > | ||
| 355 | ih_item_len(ih) ? | ||
| 356 | ih_item_len(ih) : | ||
| 357 | zeros_num); | ||
| 358 | 348 | ||
| 359 | version = ih_version(ih); | 349 | version = ih_version(ih); |
| 360 | 350 | ||
| 361 | /* Calculate key component, item length and body to insert into S[0] */ | 351 | /* Calculate key component, item length and body to insert into S[0] */ |
| 362 | set_le_ih_k_offset(ih, | 352 | set_le_ih_k_offset(ih, le_ih_k_offset(ih) + |
| 363 | le_ih_k_offset(ih) + | 353 | (tb-> lbytes << (is_indirect_le_ih(ih) ? tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT : 0))); |
| 364 | (tb-> | ||
| 365 | lbytes << | ||
| 366 | (is_indirect_le_ih | ||
| 367 | (ih) ? tb->tb_sb-> | ||
| 368 | s_blocksize_bits - | ||
| 369 | UNFM_P_SHIFT : | ||
| 370 | 0))); | ||
| 371 | 354 | ||
| 372 | put_ih_item_len(ih, new_item_len); | 355 | put_ih_item_len(ih, new_item_len); |
| 373 | if (tb->lbytes > zeros_num) { | 356 | if (tb->lbytes > zeros_num) { |
| 374 | body += | 357 | body += (tb->lbytes - zeros_num); |
| 375 | (tb->lbytes - zeros_num); | ||
| 376 | zeros_num = 0; | 358 | zeros_num = 0; |
| 377 | } else | 359 | } else |
| 378 | zeros_num -= tb->lbytes; | 360 | zeros_num -= tb->lbytes; |
| @@ -383,15 +365,10 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 383 | } else { | 365 | } else { |
| 384 | /* new item in whole falls into L[0] */ | 366 | /* new item in whole falls into L[0] */ |
| 385 | /* Shift lnum[0]-1 items to L[0] */ | 367 | /* Shift lnum[0]-1 items to L[0] */ |
| 386 | ret_val = | 368 | ret_val = leaf_shift_left(tb, tb->lnum[0] - 1, tb->lbytes); |
| 387 | leaf_shift_left(tb, tb->lnum[0] - 1, | ||
| 388 | tb->lbytes); | ||
| 389 | /* Insert new item into L[0] */ | 369 | /* Insert new item into L[0] */ |
| 390 | buffer_info_init_left(tb, &bi); | 370 | buffer_info_init_left(tb, &bi); |
| 391 | leaf_insert_into_buf(&bi, | 371 | leaf_insert_into_buf(&bi, n + item_pos - ret_val, ih, body, zeros_num); |
| 392 | n + item_pos - | ||
| 393 | ret_val, ih, body, | ||
| 394 | zeros_num); | ||
| 395 | tb->insert_size[0] = 0; | 372 | tb->insert_size[0] = 0; |
| 396 | zeros_num = 0; | 373 | zeros_num = 0; |
| 397 | } | 374 | } |
| @@ -399,264 +376,117 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 399 | 376 | ||
| 400 | case M_PASTE: /* append item in L[0] */ | 377 | case M_PASTE: /* append item in L[0] */ |
| 401 | 378 | ||
| 402 | if (item_pos == tb->lnum[0] - 1 | 379 | if (item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) { |
| 403 | && tb->lbytes != -1) { | ||
| 404 | /* we must shift the part of the appended item */ | 380 | /* we must shift the part of the appended item */ |
| 405 | if (is_direntry_le_ih | 381 | if (is_direntry_le_ih(B_N_PITEM_HEAD(tbS0, item_pos))) { |
| 406 | (B_N_PITEM_HEAD(tbS0, item_pos))) { | ||
| 407 | 382 | ||
| 408 | RFALSE(zeros_num, | 383 | RFALSE(zeros_num, |
| 409 | "PAP-12090: invalid parameter in case of a directory"); | 384 | "PAP-12090: invalid parameter in case of a directory"); |
| 410 | /* directory item */ | 385 | /* directory item */ |
| 411 | if (tb->lbytes > pos_in_item) { | 386 | if (tb->lbytes > pos_in_item) { |
| 412 | /* new directory entry falls into L[0] */ | 387 | /* new directory entry falls into L[0] */ |
| 413 | struct item_head | 388 | struct item_head *pasted; |
| 414 | *pasted; | 389 | int l_pos_in_item = pos_in_item; |
| 415 | int l_pos_in_item = | ||
| 416 | pos_in_item; | ||
| 417 | 390 | ||
| 418 | /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */ | 391 | /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */ |
| 419 | ret_val = | 392 | ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes-1); |
| 420 | leaf_shift_left(tb, | 393 | if (ret_val && !item_pos) { |
| 421 | tb-> | 394 | pasted = B_N_PITEM_HEAD(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1); |
| 422 | lnum | 395 | l_pos_in_item += I_ENTRY_COUNT(pasted) - (tb->lbytes -1); |
| 423 | [0], | ||
| 424 | tb-> | ||
| 425 | lbytes | ||
| 426 | - | ||
| 427 | 1); | ||
| 428 | if (ret_val | ||
| 429 | && !item_pos) { | ||
| 430 | pasted = | ||
| 431 | B_N_PITEM_HEAD | ||
| 432 | (tb->L[0], | ||
| 433 | B_NR_ITEMS | ||
| 434 | (tb-> | ||
| 435 | L[0]) - | ||
| 436 | 1); | ||
| 437 | l_pos_in_item += | ||
| 438 | I_ENTRY_COUNT | ||
| 439 | (pasted) - | ||
| 440 | (tb-> | ||
| 441 | lbytes - | ||
| 442 | 1); | ||
| 443 | } | 396 | } |
| 444 | 397 | ||
| 445 | /* Append given directory entry to directory item */ | 398 | /* Append given directory entry to directory item */ |
| 446 | buffer_info_init_left(tb, &bi); | 399 | buffer_info_init_left(tb, &bi); |
| 447 | leaf_paste_in_buffer | 400 | leaf_paste_in_buffer(&bi, n + item_pos - ret_val, l_pos_in_item, tb->insert_size[0], body, zeros_num); |
| 448 | (&bi, | ||
| 449 | n + item_pos - | ||
| 450 | ret_val, | ||
| 451 | l_pos_in_item, | ||
| 452 | tb->insert_size[0], | ||
| 453 | body, zeros_num); | ||
| 454 | 401 | ||
| 455 | /* previous string prepared space for pasting new entry, following string pastes this entry */ | 402 | /* previous string prepared space for pasting new entry, following string pastes this entry */ |
| 456 | 403 | ||
| 457 | /* when we have merge directory item, pos_in_item has been changed too */ | 404 | /* when we have merge directory item, pos_in_item has been changed too */ |
| 458 | 405 | ||
| 459 | /* paste new directory entry. 1 is entry number */ | 406 | /* paste new directory entry. 1 is entry number */ |
| 460 | leaf_paste_entries(&bi, | 407 | leaf_paste_entries(&bi, n + item_pos - ret_val, l_pos_in_item, |
| 461 | n + | 408 | 1, (struct reiserfs_de_head *) body, |
| 462 | item_pos | 409 | body + DEH_SIZE, tb->insert_size[0]); |
| 463 | - | ||
| 464 | ret_val, | ||
| 465 | l_pos_in_item, | ||
| 466 | 1, | ||
| 467 | (struct | ||
| 468 | reiserfs_de_head | ||
| 469 | *) | ||
| 470 | body, | ||
| 471 | body | ||
| 472 | + | ||
| 473 | DEH_SIZE, | ||
| 474 | tb-> | ||
| 475 | insert_size | ||
| 476 | [0] | ||
| 477 | ); | ||
| 478 | tb->insert_size[0] = 0; | 410 | tb->insert_size[0] = 0; |
| 479 | } else { | 411 | } else { |
| 480 | /* new directory item doesn't fall into L[0] */ | 412 | /* new directory item doesn't fall into L[0] */ |
| 481 | /* Shift lnum[0]-1 items in whole. Shift lbytes directory entries from directory item number lnum[0] */ | 413 | /* Shift lnum[0]-1 items in whole. Shift lbytes directory entries from directory item number lnum[0] */ |
| 482 | leaf_shift_left(tb, | 414 | leaf_shift_left(tb, tb->lnum[0], tb->lbytes); |
| 483 | tb-> | ||
| 484 | lnum[0], | ||
| 485 | tb-> | ||
| 486 | lbytes); | ||
| 487 | } | 415 | } |
| 488 | /* Calculate new position to append in item body */ | 416 | /* Calculate new position to append in item body */ |
| 489 | pos_in_item -= tb->lbytes; | 417 | pos_in_item -= tb->lbytes; |
| 490 | } else { | 418 | } else { |
| 491 | /* regular object */ | 419 | /* regular object */ |
| 492 | RFALSE(tb->lbytes <= 0, | 420 | RFALSE(tb->lbytes <= 0, "PAP-12095: there is nothing to shift to L[0]. lbytes=%d", tb->lbytes); |
| 493 | "PAP-12095: there is nothing to shift to L[0]. lbytes=%d", | 421 | RFALSE(pos_in_item != ih_item_len(B_N_PITEM_HEAD(tbS0, item_pos)), |
| 494 | tb->lbytes); | ||
| 495 | RFALSE(pos_in_item != | ||
| 496 | ih_item_len | ||
| 497 | (B_N_PITEM_HEAD | ||
| 498 | (tbS0, item_pos)), | ||
| 499 | "PAP-12100: incorrect position to paste: item_len=%d, pos_in_item=%d", | 422 | "PAP-12100: incorrect position to paste: item_len=%d, pos_in_item=%d", |
| 500 | ih_item_len | 423 | ih_item_len(B_N_PITEM_HEAD(tbS0, item_pos)),pos_in_item); |
| 501 | (B_N_PITEM_HEAD | ||
| 502 | (tbS0, item_pos)), | ||
| 503 | pos_in_item); | ||
| 504 | 424 | ||
| 505 | if (tb->lbytes >= pos_in_item) { | 425 | if (tb->lbytes >= pos_in_item) { |
| 506 | /* appended item will be in L[0] in whole */ | 426 | /* appended item will be in L[0] in whole */ |
| 507 | int l_n; | 427 | int l_n; |
| 508 | 428 | ||
| 509 | /* this bytes number must be appended to the last item of L[h] */ | 429 | /* this bytes number must be appended to the last item of L[h] */ |
| 510 | l_n = | 430 | l_n = tb->lbytes - pos_in_item; |
| 511 | tb->lbytes - | ||
| 512 | pos_in_item; | ||
| 513 | 431 | ||
| 514 | /* Calculate new insert_size[0] */ | 432 | /* Calculate new insert_size[0] */ |
| 515 | tb->insert_size[0] -= | 433 | tb->insert_size[0] -= l_n; |
| 516 | l_n; | ||
| 517 | 434 | ||
| 518 | RFALSE(tb-> | 435 | RFALSE(tb->insert_size[0] <= 0, |
| 519 | insert_size[0] <= | ||
| 520 | 0, | ||
| 521 | "PAP-12105: there is nothing to paste into L[0]. insert_size=%d", | 436 | "PAP-12105: there is nothing to paste into L[0]. insert_size=%d", |
| 522 | tb-> | 437 | tb->insert_size[0]); |
| 523 | insert_size[0]); | 438 | ret_val = leaf_shift_left(tb, tb->lnum[0], ih_item_len |
| 524 | ret_val = | 439 | (B_N_PITEM_HEAD(tbS0, item_pos))); |
| 525 | leaf_shift_left(tb, | ||
| 526 | tb-> | ||
| 527 | lnum | ||
| 528 | [0], | ||
| 529 | ih_item_len | ||
| 530 | (B_N_PITEM_HEAD | ||
| 531 | (tbS0, | ||
| 532 | item_pos))); | ||
| 533 | /* Append to body of item in L[0] */ | 440 | /* Append to body of item in L[0] */ |
| 534 | buffer_info_init_left(tb, &bi); | 441 | buffer_info_init_left(tb, &bi); |
| 535 | leaf_paste_in_buffer | 442 | leaf_paste_in_buffer |
| 536 | (&bi, | 443 | (&bi, n + item_pos - ret_val, ih_item_len |
| 537 | n + item_pos - | 444 | (B_N_PITEM_HEAD(tb->L[0], n + item_pos - ret_val)), |
| 538 | ret_val, | 445 | l_n, body, |
| 539 | ih_item_len | 446 | zeros_num > l_n ? l_n : zeros_num); |
| 540 | (B_N_PITEM_HEAD | ||
| 541 | (tb->L[0], | ||
| 542 | n + item_pos - | ||
| 543 | ret_val)), l_n, | ||
| 544 | body, | ||
| 545 | zeros_num > | ||
| 546 | l_n ? l_n : | ||
| 547 | zeros_num); | ||
| 548 | /* 0-th item in S0 can be only of DIRECT type when l_n != 0 */ | 447 | /* 0-th item in S0 can be only of DIRECT type when l_n != 0 */ |
| 549 | { | 448 | { |
| 550 | int version; | 449 | int version; |
| 551 | int temp_l = | 450 | int temp_l = l_n; |
| 552 | l_n; | 451 | |
| 553 | 452 | RFALSE(ih_item_len(B_N_PITEM_HEAD(tbS0, 0)), | |
| 554 | RFALSE | ||
| 555 | (ih_item_len | ||
| 556 | (B_N_PITEM_HEAD | ||
| 557 | (tbS0, | ||
| 558 | 0)), | ||
| 559 | "PAP-12106: item length must be 0"); | 453 | "PAP-12106: item length must be 0"); |
| 560 | RFALSE | 454 | RFALSE(comp_short_le_keys(B_N_PKEY(tbS0, 0), B_N_PKEY |
| 561 | (comp_short_le_keys | 455 | (tb->L[0], n + item_pos - ret_val)), |
| 562 | (B_N_PKEY | ||
| 563 | (tbS0, 0), | ||
| 564 | B_N_PKEY | ||
| 565 | (tb->L[0], | ||
| 566 | n + | ||
| 567 | item_pos | ||
| 568 | - | ||
| 569 | ret_val)), | ||
| 570 | "PAP-12107: items must be of the same file"); | 456 | "PAP-12107: items must be of the same file"); |
| 571 | if (is_indirect_le_ih(B_N_PITEM_HEAD(tb->L[0], n + item_pos - ret_val))) { | 457 | if (is_indirect_le_ih(B_N_PITEM_HEAD(tb->L[0], n + item_pos - ret_val))) { |
| 572 | temp_l = | 458 | temp_l = l_n << (tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT); |
| 573 | l_n | ||
| 574 | << | ||
| 575 | (tb-> | ||
| 576 | tb_sb-> | ||
| 577 | s_blocksize_bits | ||
| 578 | - | ||
| 579 | UNFM_P_SHIFT); | ||
| 580 | } | 459 | } |
| 581 | /* update key of first item in S0 */ | 460 | /* update key of first item in S0 */ |
| 582 | version = | 461 | version = ih_version(B_N_PITEM_HEAD(tbS0, 0)); |
| 583 | ih_version | 462 | set_le_key_k_offset(version, B_N_PKEY(tbS0, 0), |
| 584 | (B_N_PITEM_HEAD | 463 | le_key_k_offset(version,B_N_PKEY(tbS0, 0)) + temp_l); |
| 585 | (tbS0, 0)); | ||
| 586 | set_le_key_k_offset | ||
| 587 | (version, | ||
| 588 | B_N_PKEY | ||
| 589 | (tbS0, 0), | ||
| 590 | le_key_k_offset | ||
| 591 | (version, | ||
| 592 | B_N_PKEY | ||
| 593 | (tbS0, | ||
| 594 | 0)) + | ||
| 595 | temp_l); | ||
| 596 | /* update left delimiting key */ | 464 | /* update left delimiting key */ |
| 597 | set_le_key_k_offset | 465 | set_le_key_k_offset(version, B_N_PDELIM_KEY(tb->CFL[0], tb->lkey[0]), |
| 598 | (version, | 466 | le_key_k_offset(version, B_N_PDELIM_KEY(tb->CFL[0], tb->lkey[0])) + temp_l); |
| 599 | B_N_PDELIM_KEY | ||
| 600 | (tb-> | ||
| 601 | CFL[0], | ||
| 602 | tb-> | ||
| 603 | lkey[0]), | ||
| 604 | le_key_k_offset | ||
| 605 | (version, | ||
| 606 | B_N_PDELIM_KEY | ||
| 607 | (tb-> | ||
| 608 | CFL[0], | ||
| 609 | tb-> | ||
| 610 | lkey[0])) | ||
| 611 | + temp_l); | ||
| 612 | } | 467 | } |
| 613 | 468 | ||
| 614 | /* Calculate new body, position in item and insert_size[0] */ | 469 | /* Calculate new body, position in item and insert_size[0] */ |
| 615 | if (l_n > zeros_num) { | 470 | if (l_n > zeros_num) { |
| 616 | body += | 471 | body += (l_n - zeros_num); |
| 617 | (l_n - | ||
| 618 | zeros_num); | ||
| 619 | zeros_num = 0; | 472 | zeros_num = 0; |
| 620 | } else | 473 | } else |
| 621 | zeros_num -= | 474 | zeros_num -= l_n; |
| 622 | l_n; | ||
| 623 | pos_in_item = 0; | 475 | pos_in_item = 0; |
| 624 | 476 | ||
| 625 | RFALSE | 477 | RFALSE(comp_short_le_keys(B_N_PKEY(tbS0, 0), B_N_PKEY(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1)) |
| 626 | (comp_short_le_keys | 478 | || !op_is_left_mergeable(B_N_PKEY(tbS0, 0), tbS0->b_size) |
| 627 | (B_N_PKEY(tbS0, 0), | 479 | || !op_is_left_mergeable(B_N_PDELIM_KEY(tb->CFL[0], tb->lkey[0]), tbS0->b_size), |
| 628 | B_N_PKEY(tb->L[0], | ||
| 629 | B_NR_ITEMS | ||
| 630 | (tb-> | ||
| 631 | L[0]) - | ||
| 632 | 1)) | ||
| 633 | || | ||
| 634 | !op_is_left_mergeable | ||
| 635 | (B_N_PKEY(tbS0, 0), | ||
| 636 | tbS0->b_size) | ||
| 637 | || | ||
| 638 | !op_is_left_mergeable | ||
| 639 | (B_N_PDELIM_KEY | ||
| 640 | (tb->CFL[0], | ||
| 641 | tb->lkey[0]), | ||
| 642 | tbS0->b_size), | ||
| 643 | "PAP-12120: item must be merge-able with left neighboring item"); | 480 | "PAP-12120: item must be merge-able with left neighboring item"); |
| 644 | } else { /* only part of the appended item will be in L[0] */ | 481 | } else { /* only part of the appended item will be in L[0] */ |
| 645 | 482 | ||
| 646 | /* Calculate position in item for append in S[0] */ | 483 | /* Calculate position in item for append in S[0] */ |
| 647 | pos_in_item -= | 484 | pos_in_item -= tb->lbytes; |
| 648 | tb->lbytes; | ||
| 649 | 485 | ||
| 650 | RFALSE(pos_in_item <= 0, | 486 | RFALSE(pos_in_item <= 0, "PAP-12125: no place for paste. pos_in_item=%d", pos_in_item); |
| 651 | "PAP-12125: no place for paste. pos_in_item=%d", | ||
| 652 | pos_in_item); | ||
| 653 | 487 | ||
| 654 | /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ | 488 | /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ |
| 655 | leaf_shift_left(tb, | 489 | leaf_shift_left(tb, tb->lnum[0], tb->lbytes); |
| 656 | tb-> | ||
| 657 | lnum[0], | ||
| 658 | tb-> | ||
| 659 | lbytes); | ||
| 660 | } | 490 | } |
| 661 | } | 491 | } |
| 662 | } else { /* appended item will be in L[0] in whole */ | 492 | } else { /* appended item will be in L[0] in whole */ |
| @@ -665,52 +495,30 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 665 | 495 | ||
| 666 | 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 */ | 496 | 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 */ |
| 667 | /* then increment pos_in_item by the size of the last item in L[0] */ | 497 | /* then increment pos_in_item by the size of the last item in L[0] */ |
| 668 | pasted = | 498 | pasted = B_N_PITEM_HEAD(tb->L[0], n - 1); |
| 669 | B_N_PITEM_HEAD(tb->L[0], | ||
| 670 | n - 1); | ||
| 671 | if (is_direntry_le_ih(pasted)) | 499 | if (is_direntry_le_ih(pasted)) |
| 672 | pos_in_item += | 500 | pos_in_item += ih_entry_count(pasted); |
| 673 | ih_entry_count | ||
| 674 | (pasted); | ||
| 675 | else | 501 | else |
| 676 | pos_in_item += | 502 | pos_in_item += ih_item_len(pasted); |
| 677 | ih_item_len(pasted); | ||
| 678 | } | 503 | } |
| 679 | 504 | ||
| 680 | /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ | 505 | /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ |
| 681 | ret_val = | 506 | ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes); |
| 682 | leaf_shift_left(tb, tb->lnum[0], | ||
| 683 | tb->lbytes); | ||
| 684 | /* Append to body of item in L[0] */ | 507 | /* Append to body of item in L[0] */ |
| 685 | buffer_info_init_left(tb, &bi); | 508 | buffer_info_init_left(tb, &bi); |
| 686 | leaf_paste_in_buffer(&bi, | 509 | leaf_paste_in_buffer(&bi, n + item_pos - ret_val, |
| 687 | n + item_pos - | ||
| 688 | ret_val, | ||
| 689 | pos_in_item, | 510 | pos_in_item, |
| 690 | tb->insert_size[0], | 511 | tb->insert_size[0], |
| 691 | body, zeros_num); | 512 | body, zeros_num); |
| 692 | 513 | ||
| 693 | /* if appended item is directory, paste entry */ | 514 | /* if appended item is directory, paste entry */ |
| 694 | pasted = | 515 | pasted = B_N_PITEM_HEAD(tb->L[0], n + item_pos - ret_val); |
| 695 | B_N_PITEM_HEAD(tb->L[0], | ||
| 696 | n + item_pos - | ||
| 697 | ret_val); | ||
| 698 | if (is_direntry_le_ih(pasted)) | 516 | if (is_direntry_le_ih(pasted)) |
| 699 | leaf_paste_entries(&bi, | 517 | leaf_paste_entries(&bi, n + item_pos - ret_val, |
| 700 | n + | 518 | pos_in_item, 1, |
| 701 | item_pos - | 519 | (struct reiserfs_de_head *) body, |
| 702 | ret_val, | 520 | body + DEH_SIZE, |
| 703 | pos_in_item, | 521 | tb->insert_size[0]); |
| 704 | 1, | ||
| 705 | (struct | ||
| 706 | reiserfs_de_head | ||
| 707 | *)body, | ||
| 708 | body + | ||
| 709 | DEH_SIZE, | ||
| 710 | tb-> | ||
| 711 | insert_size | ||
| 712 | [0] | ||
| 713 | ); | ||
| 714 | /* if appended item is indirect item, put unformatted node into un list */ | 522 | /* if appended item is indirect item, put unformatted node into un list */ |
| 715 | if (is_indirect_le_ih(pasted)) | 523 | if (is_indirect_le_ih(pasted)) |
| 716 | set_ih_free_space(pasted, 0); | 524 | set_ih_free_space(pasted, 0); |
| @@ -722,13 +530,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 722 | reiserfs_panic(tb->tb_sb, "PAP-12130", | 530 | reiserfs_panic(tb->tb_sb, "PAP-12130", |
| 723 | "lnum > 0: unexpected mode: " | 531 | "lnum > 0: unexpected mode: " |
| 724 | " %s(%d)", | 532 | " %s(%d)", |
| 725 | (flag == | 533 | (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); |
| 726 | M_DELETE) ? "DELETE" : ((flag == | ||
| 727 | M_CUT) | ||
| 728 | ? "CUT" | ||
| 729 | : | ||
| 730 | "UNKNOWN"), | ||
| 731 | flag); | ||
| 732 | } | 534 | } |
| 733 | } else { | 535 | } else { |
| 734 | /* new item doesn't fall into L[0] */ | 536 | /* new item doesn't fall into L[0] */ |
| @@ -748,14 +550,12 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 748 | case M_INSERT: /* insert item */ | 550 | case M_INSERT: /* insert item */ |
| 749 | if (n - tb->rnum[0] < item_pos) { /* new item or its part falls to R[0] */ | 551 | if (n - tb->rnum[0] < item_pos) { /* new item or its part falls to R[0] */ |
| 750 | if (item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) { /* part of new item falls into R[0] */ | 552 | if (item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) { /* part of new item falls into R[0] */ |
| 751 | loff_t old_key_comp, old_len, | 553 | loff_t old_key_comp, old_len, r_zeros_number; |
| 752 | r_zeros_number; | ||
| 753 | const char *r_body; | 554 | const char *r_body; |
| 754 | int version; | 555 | int version; |
| 755 | loff_t offset; | 556 | loff_t offset; |
| 756 | 557 | ||
| 757 | leaf_shift_right(tb, tb->rnum[0] - 1, | 558 | leaf_shift_right(tb, tb->rnum[0] - 1, -1); |
| 758 | -1); | ||
| 759 | 559 | ||
| 760 | version = ih_version(ih); | 560 | version = ih_version(ih); |
| 761 | /* Remember key component and item length */ | 561 | /* Remember key component and item length */ |
| @@ -763,29 +563,17 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 763 | old_len = ih_item_len(ih); | 563 | old_len = ih_item_len(ih); |
| 764 | 564 | ||
| 765 | /* Calculate key component and item length to insert into R[0] */ | 565 | /* Calculate key component and item length to insert into R[0] */ |
| 766 | offset = | 566 | offset = le_ih_k_offset(ih) + ((old_len - tb->rbytes) << (is_indirect_le_ih(ih) ? tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT : 0)); |
| 767 | le_ih_k_offset(ih) + | ||
| 768 | ((old_len - | ||
| 769 | tb-> | ||
| 770 | rbytes) << (is_indirect_le_ih(ih) | ||
| 771 | ? tb->tb_sb-> | ||
| 772 | s_blocksize_bits - | ||
| 773 | UNFM_P_SHIFT : 0)); | ||
| 774 | set_le_ih_k_offset(ih, offset); | 567 | set_le_ih_k_offset(ih, offset); |
| 775 | put_ih_item_len(ih, tb->rbytes); | 568 | put_ih_item_len(ih, tb->rbytes); |
| 776 | /* Insert part of the item into R[0] */ | 569 | /* Insert part of the item into R[0] */ |
| 777 | buffer_info_init_right(tb, &bi); | 570 | buffer_info_init_right(tb, &bi); |
| 778 | if ((old_len - tb->rbytes) > zeros_num) { | 571 | if ((old_len - tb->rbytes) > zeros_num) { |
| 779 | r_zeros_number = 0; | 572 | r_zeros_number = 0; |
| 780 | r_body = | 573 | r_body = body + (old_len - tb->rbytes) - zeros_num; |
| 781 | body + (old_len - | ||
| 782 | tb->rbytes) - | ||
| 783 | zeros_num; | ||
| 784 | } else { | 574 | } else { |
| 785 | r_body = body; | 575 | r_body = body; |
| 786 | r_zeros_number = | 576 | r_zeros_number = zeros_num - (old_len - tb->rbytes); |
| 787 | zeros_num - (old_len - | ||
| 788 | tb->rbytes); | ||
| 789 | zeros_num -= r_zeros_number; | 577 | zeros_num -= r_zeros_number; |
| 790 | } | 578 | } |
| 791 | 579 | ||
| @@ -798,25 +586,18 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 798 | 586 | ||
| 799 | /* Calculate key component and item length to insert into S[0] */ | 587 | /* Calculate key component and item length to insert into S[0] */ |
| 800 | set_le_ih_k_offset(ih, old_key_comp); | 588 | set_le_ih_k_offset(ih, old_key_comp); |
| 801 | put_ih_item_len(ih, | 589 | put_ih_item_len(ih, old_len - tb->rbytes); |
| 802 | old_len - tb->rbytes); | ||
| 803 | 590 | ||
| 804 | tb->insert_size[0] -= tb->rbytes; | 591 | tb->insert_size[0] -= tb->rbytes; |
| 805 | 592 | ||
| 806 | } else { /* whole new item falls into R[0] */ | 593 | } else { /* whole new item falls into R[0] */ |
| 807 | 594 | ||
| 808 | /* Shift rnum[0]-1 items to R[0] */ | 595 | /* Shift rnum[0]-1 items to R[0] */ |
| 809 | ret_val = | 596 | ret_val = leaf_shift_right(tb, tb->rnum[0] - 1, tb->rbytes); |
| 810 | leaf_shift_right(tb, | ||
| 811 | tb->rnum[0] - 1, | ||
| 812 | tb->rbytes); | ||
| 813 | /* Insert new item into R[0] */ | 597 | /* Insert new item into R[0] */ |
| 814 | buffer_info_init_right(tb, &bi); | 598 | buffer_info_init_right(tb, &bi); |
| 815 | leaf_insert_into_buf(&bi, | 599 | leaf_insert_into_buf(&bi, item_pos - n + tb->rnum[0] - 1, |
| 816 | item_pos - n + | 600 | ih, body, zeros_num); |
| 817 | tb->rnum[0] - 1, | ||
| 818 | ih, body, | ||
| 819 | zeros_num); | ||
| 820 | 601 | ||
| 821 | if (item_pos - n + tb->rnum[0] - 1 == 0) { | 602 | if (item_pos - n + tb->rnum[0] - 1 == 0) { |
| 822 | replace_key(tb, tb->CFR[0], | 603 | replace_key(tb, tb->CFR[0], |
| @@ -841,200 +622,97 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 841 | 622 | ||
| 842 | RFALSE(zeros_num, | 623 | RFALSE(zeros_num, |
| 843 | "PAP-12145: invalid parameter in case of a directory"); | 624 | "PAP-12145: invalid parameter in case of a directory"); |
| 844 | entry_count = | 625 | entry_count = I_ENTRY_COUNT(B_N_PITEM_HEAD |
| 845 | I_ENTRY_COUNT(B_N_PITEM_HEAD | 626 | (tbS0, item_pos)); |
| 846 | (tbS0, | ||
| 847 | item_pos)); | ||
| 848 | if (entry_count - tb->rbytes < | 627 | if (entry_count - tb->rbytes < |
| 849 | pos_in_item) | 628 | pos_in_item) |
| 850 | /* new directory entry falls into R[0] */ | 629 | /* new directory entry falls into R[0] */ |
| 851 | { | 630 | { |
| 852 | int paste_entry_position; | 631 | int paste_entry_position; |
| 853 | 632 | ||
| 854 | RFALSE(tb->rbytes - 1 >= | 633 | RFALSE(tb->rbytes - 1 >= entry_count || !tb-> insert_size[0], |
| 855 | entry_count | ||
| 856 | || !tb-> | ||
| 857 | insert_size[0], | ||
| 858 | "PAP-12150: no enough of entries to shift to R[0]: rbytes=%d, entry_count=%d", | 634 | "PAP-12150: no enough of entries to shift to R[0]: rbytes=%d, entry_count=%d", |
| 859 | tb->rbytes, | 635 | tb->rbytes, entry_count); |
| 860 | entry_count); | ||
| 861 | /* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */ | 636 | /* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */ |
| 862 | leaf_shift_right(tb, | 637 | leaf_shift_right(tb, tb->rnum[0], tb->rbytes - 1); |
| 863 | tb-> | ||
| 864 | rnum | ||
| 865 | [0], | ||
| 866 | tb-> | ||
| 867 | rbytes | ||
| 868 | - 1); | ||
| 869 | /* Paste given directory entry to directory item */ | 638 | /* Paste given directory entry to directory item */ |
| 870 | paste_entry_position = | 639 | paste_entry_position = pos_in_item - entry_count + tb->rbytes - 1; |
| 871 | pos_in_item - | ||
| 872 | entry_count + | ||
| 873 | tb->rbytes - 1; | ||
| 874 | buffer_info_init_right(tb, &bi); | 640 | buffer_info_init_right(tb, &bi); |
| 875 | leaf_paste_in_buffer | 641 | leaf_paste_in_buffer(&bi, 0, paste_entry_position, tb->insert_size[0], body, zeros_num); |
| 876 | (&bi, 0, | ||
| 877 | paste_entry_position, | ||
| 878 | tb->insert_size[0], | ||
| 879 | body, zeros_num); | ||
| 880 | /* paste entry */ | 642 | /* paste entry */ |
| 881 | leaf_paste_entries(&bi, | 643 | leaf_paste_entries(&bi, 0, paste_entry_position, 1, |
| 882 | 0, | 644 | (struct reiserfs_de_head *) body, |
| 883 | paste_entry_position, | 645 | body + DEH_SIZE, tb->insert_size[0]); |
| 884 | 1, | 646 | |
| 885 | (struct | 647 | if (paste_entry_position == 0) { |
| 886 | reiserfs_de_head | ||
| 887 | *) | ||
| 888 | body, | ||
| 889 | body | ||
| 890 | + | ||
| 891 | DEH_SIZE, | ||
| 892 | tb-> | ||
| 893 | insert_size | ||
| 894 | [0] | ||
| 895 | ); | ||
| 896 | |||
| 897 | if (paste_entry_position | ||
| 898 | == 0) { | ||
| 899 | /* change delimiting keys */ | 648 | /* change delimiting keys */ |
| 900 | replace_key(tb, | 649 | replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0],0); |
| 901 | tb-> | ||
| 902 | CFR | ||
| 903 | [0], | ||
| 904 | tb-> | ||
| 905 | rkey | ||
| 906 | [0], | ||
| 907 | tb-> | ||
| 908 | R | ||
| 909 | [0], | ||
| 910 | 0); | ||
| 911 | } | 650 | } |
| 912 | 651 | ||
| 913 | tb->insert_size[0] = 0; | 652 | tb->insert_size[0] = 0; |
| 914 | pos_in_item++; | 653 | pos_in_item++; |
| 915 | } else { /* new directory entry doesn't fall into R[0] */ | 654 | } else { /* new directory entry doesn't fall into R[0] */ |
| 916 | 655 | ||
| 917 | leaf_shift_right(tb, | 656 | leaf_shift_right(tb, tb->rnum[0], tb->rbytes); |
| 918 | tb-> | ||
| 919 | rnum | ||
| 920 | [0], | ||
| 921 | tb-> | ||
| 922 | rbytes); | ||
| 923 | } | 657 | } |
| 924 | } else { /* regular object */ | 658 | } else { /* regular object */ |
| 925 | 659 | ||
| 926 | int n_shift, n_rem, | 660 | int n_shift, n_rem, r_zeros_number; |
| 927 | r_zeros_number; | ||
| 928 | const char *r_body; | 661 | const char *r_body; |
| 929 | 662 | ||
| 930 | /* Calculate number of bytes which must be shifted from appended item */ | 663 | /* Calculate number of bytes which must be shifted from appended item */ |
| 931 | if ((n_shift = | 664 | if ((n_shift = tb->rbytes - tb->insert_size[0]) < 0) |
| 932 | tb->rbytes - | ||
| 933 | tb->insert_size[0]) < 0) | ||
| 934 | n_shift = 0; | 665 | n_shift = 0; |
| 935 | 666 | ||
| 936 | RFALSE(pos_in_item != | 667 | RFALSE(pos_in_item != ih_item_len |
| 937 | ih_item_len | 668 | (B_N_PITEM_HEAD(tbS0, item_pos)), |
| 938 | (B_N_PITEM_HEAD | ||
| 939 | (tbS0, item_pos)), | ||
| 940 | "PAP-12155: invalid position to paste. ih_item_len=%d, pos_in_item=%d", | 669 | "PAP-12155: invalid position to paste. ih_item_len=%d, pos_in_item=%d", |
| 941 | pos_in_item, | 670 | pos_in_item, ih_item_len |
| 942 | ih_item_len | 671 | (B_N_PITEM_HEAD(tbS0, item_pos))); |
| 943 | (B_N_PITEM_HEAD | 672 | |
| 944 | (tbS0, item_pos))); | 673 | leaf_shift_right(tb, tb->rnum[0], n_shift); |
| 945 | |||
| 946 | leaf_shift_right(tb, | ||
| 947 | tb->rnum[0], | ||
| 948 | n_shift); | ||
| 949 | /* Calculate number of bytes which must remain in body after appending to R[0] */ | 674 | /* Calculate number of bytes which must remain in body after appending to R[0] */ |
| 950 | if ((n_rem = | 675 | if ((n_rem = tb->insert_size[0] - tb->rbytes) < 0) |
| 951 | tb->insert_size[0] - | ||
| 952 | tb->rbytes) < 0) | ||
| 953 | n_rem = 0; | 676 | n_rem = 0; |
| 954 | 677 | ||
| 955 | { | 678 | { |
| 956 | int version; | 679 | int version; |
| 957 | unsigned long temp_rem = | 680 | unsigned long temp_rem = n_rem; |
| 958 | n_rem; | 681 | |
| 959 | 682 | version = ih_version(B_N_PITEM_HEAD(tb->R[0], 0)); | |
| 960 | version = | 683 | if (is_indirect_le_key(version, B_N_PKEY(tb->R[0], 0))) { |
| 961 | ih_version | 684 | temp_rem = n_rem << (tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT); |
| 962 | (B_N_PITEM_HEAD | ||
| 963 | (tb->R[0], 0)); | ||
| 964 | if (is_indirect_le_key | ||
| 965 | (version, | ||
| 966 | B_N_PKEY(tb->R[0], | ||
| 967 | 0))) { | ||
| 968 | temp_rem = | ||
| 969 | n_rem << | ||
| 970 | (tb->tb_sb-> | ||
| 971 | s_blocksize_bits | ||
| 972 | - | ||
| 973 | UNFM_P_SHIFT); | ||
| 974 | } | 685 | } |
| 975 | set_le_key_k_offset | 686 | set_le_key_k_offset(version, B_N_PKEY(tb->R[0], 0), |
| 976 | (version, | 687 | le_key_k_offset(version, B_N_PKEY(tb->R[0], 0)) + temp_rem); |
| 977 | B_N_PKEY(tb->R[0], | 688 | set_le_key_k_offset(version, B_N_PDELIM_KEY(tb->CFR[0], tb->rkey[0]), |
| 978 | 0), | 689 | le_key_k_offset(version, B_N_PDELIM_KEY(tb->CFR[0], tb->rkey[0])) + temp_rem); |
| 979 | le_key_k_offset | ||
| 980 | (version, | ||
| 981 | B_N_PKEY(tb->R[0], | ||
| 982 | 0)) + | ||
| 983 | temp_rem); | ||
| 984 | set_le_key_k_offset | ||
| 985 | (version, | ||
| 986 | B_N_PDELIM_KEY(tb-> | ||
| 987 | CFR | ||
| 988 | [0], | ||
| 989 | tb-> | ||
| 990 | rkey | ||
| 991 | [0]), | ||
| 992 | le_key_k_offset | ||
| 993 | (version, | ||
| 994 | B_N_PDELIM_KEY | ||
| 995 | (tb->CFR[0], | ||
| 996 | tb->rkey[0])) + | ||
| 997 | temp_rem); | ||
| 998 | } | 690 | } |
| 999 | /* k_offset (B_N_PKEY(tb->R[0],0)) += n_rem; | 691 | /* k_offset (B_N_PKEY(tb->R[0],0)) += n_rem; |
| 1000 | k_offset (B_N_PDELIM_KEY(tb->CFR[0],tb->rkey[0])) += n_rem;*/ | 692 | k_offset (B_N_PDELIM_KEY(tb->CFR[0],tb->rkey[0])) += n_rem;*/ |
| 1001 | do_balance_mark_internal_dirty | 693 | do_balance_mark_internal_dirty(tb, tb->CFR[0], 0); |
| 1002 | (tb, tb->CFR[0], 0); | ||
| 1003 | 694 | ||
| 1004 | /* Append part of body into R[0] */ | 695 | /* Append part of body into R[0] */ |
| 1005 | buffer_info_init_right(tb, &bi); | 696 | buffer_info_init_right(tb, &bi); |
| 1006 | if (n_rem > zeros_num) { | 697 | if (n_rem > zeros_num) { |
| 1007 | r_zeros_number = 0; | 698 | r_zeros_number = 0; |
| 1008 | r_body = | 699 | r_body = body + n_rem - zeros_num; |
| 1009 | body + n_rem - | ||
| 1010 | zeros_num; | ||
| 1011 | } else { | 700 | } else { |
| 1012 | r_body = body; | 701 | r_body = body; |
| 1013 | r_zeros_number = | 702 | r_zeros_number = zeros_num - n_rem; |
| 1014 | zeros_num - n_rem; | 703 | zeros_num -= r_zeros_number; |
| 1015 | zeros_num -= | ||
| 1016 | r_zeros_number; | ||
| 1017 | } | 704 | } |
| 1018 | 705 | ||
| 1019 | leaf_paste_in_buffer(&bi, 0, | 706 | leaf_paste_in_buffer(&bi, 0, n_shift, |
| 1020 | n_shift, | 707 | tb->insert_size[0] - n_rem, |
| 1021 | tb-> | 708 | r_body, r_zeros_number); |
| 1022 | insert_size | 709 | |
| 1023 | [0] - | 710 | if (is_indirect_le_ih(B_N_PITEM_HEAD(tb->R[0], 0))) { |
| 1024 | n_rem, | ||
| 1025 | r_body, | ||
| 1026 | r_zeros_number); | ||
| 1027 | |||
| 1028 | if (is_indirect_le_ih | ||
| 1029 | (B_N_PITEM_HEAD | ||
| 1030 | (tb->R[0], 0))) { | ||
| 1031 | #if 0 | 711 | #if 0 |
| 1032 | RFALSE(n_rem, | 712 | RFALSE(n_rem, |
| 1033 | "PAP-12160: paste more than one unformatted node pointer"); | 713 | "PAP-12160: paste more than one unformatted node pointer"); |
| 1034 | #endif | 714 | #endif |
| 1035 | set_ih_free_space | 715 | set_ih_free_space(B_N_PITEM_HEAD(tb->R[0], 0), 0); |
| 1036 | (B_N_PITEM_HEAD | ||
| 1037 | (tb->R[0], 0), 0); | ||
| 1038 | } | 716 | } |
| 1039 | tb->insert_size[0] = n_rem; | 717 | tb->insert_size[0] = n_rem; |
| 1040 | if (!n_rem) | 718 | if (!n_rem) |
| @@ -1044,58 +722,28 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1044 | 722 | ||
| 1045 | struct item_head *pasted; | 723 | struct item_head *pasted; |
| 1046 | 724 | ||
| 1047 | ret_val = | 725 | ret_val = leaf_shift_right(tb, tb->rnum[0], tb->rbytes); |
| 1048 | leaf_shift_right(tb, tb->rnum[0], | ||
| 1049 | tb->rbytes); | ||
| 1050 | /* append item in R[0] */ | 726 | /* append item in R[0] */ |
| 1051 | if (pos_in_item >= 0) { | 727 | if (pos_in_item >= 0) { |
| 1052 | buffer_info_init_right(tb, &bi); | 728 | buffer_info_init_right(tb, &bi); |
| 1053 | leaf_paste_in_buffer(&bi, | 729 | leaf_paste_in_buffer(&bi, item_pos - n + tb->rnum[0], pos_in_item, |
| 1054 | item_pos - | 730 | tb->insert_size[0], body, zeros_num); |
| 1055 | n + | ||
| 1056 | tb-> | ||
| 1057 | rnum[0], | ||
| 1058 | pos_in_item, | ||
| 1059 | tb-> | ||
| 1060 | insert_size | ||
| 1061 | [0], body, | ||
| 1062 | zeros_num); | ||
| 1063 | } | 731 | } |
| 1064 | 732 | ||
| 1065 | /* paste new entry, if item is directory item */ | 733 | /* paste new entry, if item is directory item */ |
| 1066 | pasted = | 734 | pasted = B_N_PITEM_HEAD(tb->R[0], item_pos - n + tb->rnum[0]); |
| 1067 | B_N_PITEM_HEAD(tb->R[0], | 735 | if (is_direntry_le_ih(pasted) && pos_in_item >= 0) { |
| 1068 | item_pos - n + | 736 | leaf_paste_entries(&bi, item_pos - n + tb->rnum[0], |
| 1069 | tb->rnum[0]); | 737 | pos_in_item, 1, |
| 1070 | if (is_direntry_le_ih(pasted) | 738 | (struct reiserfs_de_head *) body, |
| 1071 | && pos_in_item >= 0) { | 739 | body + DEH_SIZE, tb->insert_size[0]); |
| 1072 | leaf_paste_entries(&bi, | ||
| 1073 | item_pos - | ||
| 1074 | n + | ||
| 1075 | tb->rnum[0], | ||
| 1076 | pos_in_item, | ||
| 1077 | 1, | ||
| 1078 | (struct | ||
| 1079 | reiserfs_de_head | ||
| 1080 | *)body, | ||
| 1081 | body + | ||
| 1082 | DEH_SIZE, | ||
| 1083 | tb-> | ||
| 1084 | insert_size | ||
| 1085 | [0] | ||
| 1086 | ); | ||
| 1087 | if (!pos_in_item) { | 740 | if (!pos_in_item) { |
| 1088 | 741 | ||
| 1089 | RFALSE(item_pos - n + | 742 | RFALSE(item_pos - n + tb->rnum[0], |
| 1090 | tb->rnum[0], | ||
| 1091 | "PAP-12165: directory item must be first item of node when pasting is in 0th position"); | 743 | "PAP-12165: directory item must be first item of node when pasting is in 0th position"); |
| 1092 | 744 | ||
| 1093 | /* update delimiting keys */ | 745 | /* update delimiting keys */ |
| 1094 | replace_key(tb, | 746 | replace_key(tb, tb->CFR[0], tb->rkey[0], tb->R[0], 0); |
| 1095 | tb->CFR[0], | ||
| 1096 | tb->rkey[0], | ||
| 1097 | tb->R[0], | ||
| 1098 | 0); | ||
| 1099 | } | 747 | } |
| 1100 | } | 748 | } |
| 1101 | 749 | ||
| @@ -1111,22 +759,16 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1111 | default: /* cases d and t */ | 759 | default: /* cases d and t */ |
| 1112 | reiserfs_panic(tb->tb_sb, "PAP-12175", | 760 | reiserfs_panic(tb->tb_sb, "PAP-12175", |
| 1113 | "rnum > 0: unexpected mode: %s(%d)", | 761 | "rnum > 0: unexpected mode: %s(%d)", |
| 1114 | (flag == | 762 | (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); |
| 1115 | M_DELETE) ? "DELETE" : ((flag == | ||
| 1116 | M_CUT) ? "CUT" | ||
| 1117 | : "UNKNOWN"), | ||
| 1118 | flag); | ||
| 1119 | } | 763 | } |
| 1120 | 764 | ||
| 1121 | } | 765 | } |
| 1122 | 766 | ||
| 1123 | /* tb->rnum[0] > 0 */ | 767 | /* tb->rnum[0] > 0 */ |
| 1124 | RFALSE(tb->blknum[0] > 3, | 768 | RFALSE(tb->blknum[0] > 3, |
| 1125 | "PAP-12180: blknum can not be %d. It must be <= 3", | 769 | "PAP-12180: blknum can not be %d. It must be <= 3", tb->blknum[0]); |
| 1126 | tb->blknum[0]); | ||
| 1127 | RFALSE(tb->blknum[0] < 0, | 770 | RFALSE(tb->blknum[0] < 0, |
| 1128 | "PAP-12185: blknum can not be %d. It must be >= 0", | 771 | "PAP-12185: blknum can not be %d. It must be >= 0", tb->blknum[0]); |
| 1129 | tb->blknum[0]); | ||
| 1130 | 772 | ||
| 1131 | /* if while adding to a node we discover that it is possible to split | 773 | /* if while adding to a node we discover that it is possible to split |
| 1132 | it in two, and merge the left part into the left neighbor and the | 774 | it in two, and merge the left part into the left neighbor and the |
| @@ -1177,8 +819,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1177 | 819 | ||
| 1178 | if (n - snum[i] < item_pos) { /* new item or it's part falls to first new node S_new[i] */ | 820 | if (n - snum[i] < item_pos) { /* new item or it's part falls to first new node S_new[i] */ |
| 1179 | if (item_pos == n - snum[i] + 1 && sbytes[i] != -1) { /* part of new item falls into S_new[i] */ | 821 | if (item_pos == n - snum[i] + 1 && sbytes[i] != -1) { /* part of new item falls into S_new[i] */ |
| 1180 | int old_key_comp, old_len, | 822 | int old_key_comp, old_len, r_zeros_number; |
| 1181 | r_zeros_number; | ||
| 1182 | const char *r_body; | 823 | const char *r_body; |
| 1183 | int version; | 824 | int version; |
| 1184 | 825 | ||
| @@ -1192,15 +833,8 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1192 | old_len = ih_item_len(ih); | 833 | old_len = ih_item_len(ih); |
| 1193 | 834 | ||
| 1194 | /* Calculate key component and item length to insert into S_new[i] */ | 835 | /* Calculate key component and item length to insert into S_new[i] */ |
| 1195 | set_le_ih_k_offset(ih, | 836 | set_le_ih_k_offset(ih, le_ih_k_offset(ih) + |
| 1196 | le_ih_k_offset(ih) + | 837 | ((old_len - sbytes[i]) << (is_indirect_le_ih(ih) ? tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT : 0))); |
| 1197 | ((old_len - | ||
| 1198 | sbytes[i]) << | ||
| 1199 | (is_indirect_le_ih | ||
| 1200 | (ih) ? tb->tb_sb-> | ||
| 1201 | s_blocksize_bits - | ||
| 1202 | UNFM_P_SHIFT : | ||
| 1203 | 0))); | ||
| 1204 | 838 | ||
| 1205 | put_ih_item_len(ih, sbytes[i]); | 839 | put_ih_item_len(ih, sbytes[i]); |
| 1206 | 840 | ||
| @@ -1209,39 +843,29 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1209 | 843 | ||
| 1210 | if ((old_len - sbytes[i]) > zeros_num) { | 844 | if ((old_len - sbytes[i]) > zeros_num) { |
| 1211 | r_zeros_number = 0; | 845 | r_zeros_number = 0; |
| 1212 | r_body = | 846 | r_body = body + (old_len - sbytes[i]) - zeros_num; |
| 1213 | body + (old_len - | ||
| 1214 | sbytes[i]) - | ||
| 1215 | zeros_num; | ||
| 1216 | } else { | 847 | } else { |
| 1217 | r_body = body; | 848 | r_body = body; |
| 1218 | r_zeros_number = | 849 | r_zeros_number = zeros_num - (old_len - sbytes[i]); |
| 1219 | zeros_num - (old_len - | ||
| 1220 | sbytes[i]); | ||
| 1221 | zeros_num -= r_zeros_number; | 850 | zeros_num -= r_zeros_number; |
| 1222 | } | 851 | } |
| 1223 | 852 | ||
| 1224 | leaf_insert_into_buf(&bi, 0, ih, r_body, | 853 | leaf_insert_into_buf(&bi, 0, ih, r_body, r_zeros_number); |
| 1225 | r_zeros_number); | ||
| 1226 | 854 | ||
| 1227 | /* Calculate key component and item length to insert into S[i] */ | 855 | /* Calculate key component and item length to insert into S[i] */ |
| 1228 | set_le_ih_k_offset(ih, old_key_comp); | 856 | set_le_ih_k_offset(ih, old_key_comp); |
| 1229 | put_ih_item_len(ih, | 857 | put_ih_item_len(ih, old_len - sbytes[i]); |
| 1230 | old_len - sbytes[i]); | ||
| 1231 | tb->insert_size[0] -= sbytes[i]; | 858 | tb->insert_size[0] -= sbytes[i]; |
| 1232 | } else { /* whole new item falls into S_new[i] */ | 859 | } else { /* whole new item falls into S_new[i] */ |
| 1233 | 860 | ||
| 1234 | /* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */ | 861 | /* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */ |
| 1235 | leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, | 862 | leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, |
| 1236 | snum[i] - 1, sbytes[i], | 863 | snum[i] - 1, sbytes[i], S_new[i]); |
| 1237 | S_new[i]); | ||
| 1238 | 864 | ||
| 1239 | /* Insert new item into S_new[i] */ | 865 | /* Insert new item into S_new[i] */ |
| 1240 | buffer_info_init_bh(tb, &bi, S_new[i]); | 866 | buffer_info_init_bh(tb, &bi, S_new[i]); |
| 1241 | leaf_insert_into_buf(&bi, | 867 | leaf_insert_into_buf(&bi, item_pos - n + snum[i] - 1, |
| 1242 | item_pos - n + | 868 | ih, body, zeros_num); |
| 1243 | snum[i] - 1, ih, | ||
| 1244 | body, zeros_num); | ||
| 1245 | 869 | ||
| 1246 | zeros_num = tb->insert_size[0] = 0; | 870 | zeros_num = tb->insert_size[0] = 0; |
| 1247 | } | 871 | } |
| @@ -1268,150 +892,73 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1268 | 892 | ||
| 1269 | int entry_count; | 893 | int entry_count; |
| 1270 | 894 | ||
| 1271 | entry_count = | 895 | entry_count = ih_entry_count(aux_ih); |
| 1272 | ih_entry_count(aux_ih); | ||
| 1273 | 896 | ||
| 1274 | if (entry_count - sbytes[i] < | 897 | if (entry_count - sbytes[i] < pos_in_item && pos_in_item <= entry_count) { |
| 1275 | pos_in_item | ||
| 1276 | && pos_in_item <= | ||
| 1277 | entry_count) { | ||
| 1278 | /* new directory entry falls into S_new[i] */ | 898 | /* new directory entry falls into S_new[i] */ |
| 1279 | 899 | ||
| 1280 | RFALSE(!tb-> | 900 | RFALSE(!tb->insert_size[0], "PAP-12215: insert_size is already 0"); |
| 1281 | insert_size[0], | 901 | RFALSE(sbytes[i] - 1 >= entry_count, |
| 1282 | "PAP-12215: insert_size is already 0"); | ||
| 1283 | RFALSE(sbytes[i] - 1 >= | ||
| 1284 | entry_count, | ||
| 1285 | "PAP-12220: there are no so much entries (%d), only %d", | 902 | "PAP-12220: there are no so much entries (%d), only %d", |
| 1286 | sbytes[i] - 1, | 903 | sbytes[i] - 1, entry_count); |
| 1287 | entry_count); | ||
| 1288 | 904 | ||
| 1289 | /* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */ | 905 | /* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */ |
| 1290 | leaf_move_items | 906 | leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i] - 1, S_new[i]); |
| 1291 | (LEAF_FROM_S_TO_SNEW, | ||
| 1292 | tb, snum[i], | ||
| 1293 | sbytes[i] - 1, | ||
| 1294 | S_new[i]); | ||
| 1295 | /* Paste given directory entry to directory item */ | 907 | /* Paste given directory entry to directory item */ |
| 1296 | buffer_info_init_bh(tb, &bi, S_new[i]); | 908 | buffer_info_init_bh(tb, &bi, S_new[i]); |
| 1297 | leaf_paste_in_buffer | 909 | leaf_paste_in_buffer(&bi, 0, pos_in_item - entry_count + sbytes[i] - 1, |
| 1298 | (&bi, 0, | 910 | tb->insert_size[0], body, zeros_num); |
| 1299 | pos_in_item - | ||
| 1300 | entry_count + | ||
| 1301 | sbytes[i] - 1, | ||
| 1302 | tb->insert_size[0], | ||
| 1303 | body, zeros_num); | ||
| 1304 | /* paste new directory entry */ | 911 | /* paste new directory entry */ |
| 1305 | leaf_paste_entries(&bi, | 912 | leaf_paste_entries(&bi, 0, pos_in_item - entry_count + sbytes[i] - 1, 1, |
| 1306 | 0, | 913 | (struct reiserfs_de_head *) body, |
| 1307 | pos_in_item | 914 | body + DEH_SIZE, tb->insert_size[0]); |
| 1308 | - | ||
| 1309 | entry_count | ||
| 1310 | + | ||
| 1311 | sbytes | ||
| 1312 | [i] - | ||
| 1313 | 1, 1, | ||
| 1314 | (struct | ||
| 1315 | reiserfs_de_head | ||
| 1316 | *) | ||
| 1317 | body, | ||
| 1318 | body | ||
| 1319 | + | ||
| 1320 | DEH_SIZE, | ||
| 1321 | tb-> | ||
| 1322 | insert_size | ||
| 1323 | [0] | ||
| 1324 | ); | ||
| 1325 | tb->insert_size[0] = 0; | 915 | tb->insert_size[0] = 0; |
| 1326 | pos_in_item++; | 916 | pos_in_item++; |
| 1327 | } else { /* new directory entry doesn't fall into S_new[i] */ | 917 | } else { /* new directory entry doesn't fall into S_new[i] */ |
| 1328 | leaf_move_items | 918 | leaf_move_items(LEAF_FROM_S_TO_SNEW,tb, snum[i], sbytes[i], S_new[i]); |
| 1329 | (LEAF_FROM_S_TO_SNEW, | ||
| 1330 | tb, snum[i], | ||
| 1331 | sbytes[i], | ||
| 1332 | S_new[i]); | ||
| 1333 | } | 919 | } |
| 1334 | } else { /* regular object */ | 920 | } else { /* regular object */ |
| 1335 | 921 | ||
| 1336 | int n_shift, n_rem, | 922 | int n_shift, n_rem, r_zeros_number; |
| 1337 | r_zeros_number; | ||
| 1338 | const char *r_body; | 923 | const char *r_body; |
| 1339 | 924 | ||
| 1340 | RFALSE(pos_in_item != | 925 | RFALSE(pos_in_item != ih_item_len(B_N_PITEM_HEAD(tbS0, item_pos)) || tb->insert_size[0] <= 0, |
| 1341 | ih_item_len | ||
| 1342 | (B_N_PITEM_HEAD | ||
| 1343 | (tbS0, item_pos)) | ||
| 1344 | || tb->insert_size[0] <= | ||
| 1345 | 0, | ||
| 1346 | "PAP-12225: item too short or insert_size <= 0"); | 926 | "PAP-12225: item too short or insert_size <= 0"); |
| 1347 | 927 | ||
| 1348 | /* Calculate number of bytes which must be shifted from appended item */ | 928 | /* Calculate number of bytes which must be shifted from appended item */ |
| 1349 | n_shift = | 929 | n_shift = sbytes[i] - tb->insert_size[0]; |
| 1350 | sbytes[i] - | ||
| 1351 | tb->insert_size[0]; | ||
| 1352 | if (n_shift < 0) | 930 | if (n_shift < 0) |
| 1353 | n_shift = 0; | 931 | n_shift = 0; |
| 1354 | leaf_move_items | 932 | leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, snum[i], n_shift, S_new[i]); |
| 1355 | (LEAF_FROM_S_TO_SNEW, tb, | ||
| 1356 | snum[i], n_shift, | ||
| 1357 | S_new[i]); | ||
| 1358 | 933 | ||
| 1359 | /* Calculate number of bytes which must remain in body after append to S_new[i] */ | 934 | /* Calculate number of bytes which must remain in body after append to S_new[i] */ |
| 1360 | n_rem = | 935 | n_rem = tb->insert_size[0] - sbytes[i]; |
| 1361 | tb->insert_size[0] - | ||
| 1362 | sbytes[i]; | ||
| 1363 | if (n_rem < 0) | 936 | if (n_rem < 0) |
| 1364 | n_rem = 0; | 937 | n_rem = 0; |
| 1365 | /* Append part of body into S_new[0] */ | 938 | /* Append part of body into S_new[0] */ |
| 1366 | buffer_info_init_bh(tb, &bi, S_new[i]); | 939 | buffer_info_init_bh(tb, &bi, S_new[i]); |
| 1367 | if (n_rem > zeros_num) { | 940 | if (n_rem > zeros_num) { |
| 1368 | r_zeros_number = 0; | 941 | r_zeros_number = 0; |
| 1369 | r_body = | 942 | r_body = body + n_rem - zeros_num; |
| 1370 | body + n_rem - | ||
| 1371 | zeros_num; | ||
| 1372 | } else { | 943 | } else { |
| 1373 | r_body = body; | 944 | r_body = body; |
| 1374 | r_zeros_number = | 945 | r_zeros_number = zeros_num - n_rem; |
| 1375 | zeros_num - n_rem; | 946 | zeros_num -= r_zeros_number; |
| 1376 | zeros_num -= | ||
| 1377 | r_zeros_number; | ||
| 1378 | } | 947 | } |
| 1379 | 948 | ||
| 1380 | leaf_paste_in_buffer(&bi, 0, | 949 | leaf_paste_in_buffer(&bi, 0, n_shift, |
| 1381 | n_shift, | 950 | tb->insert_size[0] - n_rem, |
| 1382 | tb-> | 951 | r_body, r_zeros_number); |
| 1383 | insert_size | ||
| 1384 | [0] - | ||
| 1385 | n_rem, | ||
| 1386 | r_body, | ||
| 1387 | r_zeros_number); | ||
| 1388 | { | 952 | { |
| 1389 | struct item_head *tmp; | 953 | struct item_head *tmp; |
| 1390 | 954 | ||
| 1391 | tmp = | 955 | tmp = B_N_PITEM_HEAD(S_new[i], 0); |
| 1392 | B_N_PITEM_HEAD(S_new | ||
| 1393 | [i], | ||
| 1394 | 0); | ||
| 1395 | if (is_indirect_le_ih | 956 | if (is_indirect_le_ih |
| 1396 | (tmp)) { | 957 | (tmp)) { |
| 1397 | set_ih_free_space | 958 | set_ih_free_space(tmp, 0); |
| 1398 | (tmp, 0); | 959 | set_le_ih_k_offset(tmp, le_ih_k_offset(tmp) + (n_rem << (tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT))); |
| 1399 | set_le_ih_k_offset | ||
| 1400 | (tmp, | ||
| 1401 | le_ih_k_offset | ||
| 1402 | (tmp) + | ||
| 1403 | (n_rem << | ||
| 1404 | (tb-> | ||
| 1405 | tb_sb-> | ||
| 1406 | s_blocksize_bits | ||
| 1407 | - | ||
| 1408 | UNFM_P_SHIFT))); | ||
| 1409 | } else { | 960 | } else { |
| 1410 | set_le_ih_k_offset | 961 | set_le_ih_k_offset(tmp, le_ih_k_offset(tmp) + n_rem); |
| 1411 | (tmp, | ||
| 1412 | le_ih_k_offset | ||
| 1413 | (tmp) + | ||
| 1414 | n_rem); | ||
| 1415 | } | 962 | } |
| 1416 | } | 963 | } |
| 1417 | 964 | ||
| @@ -1426,8 +973,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1426 | struct item_head *pasted; | 973 | struct item_head *pasted; |
| 1427 | 974 | ||
| 1428 | #ifdef CONFIG_REISERFS_CHECK | 975 | #ifdef CONFIG_REISERFS_CHECK |
| 1429 | struct item_head *ih_check = | 976 | struct item_head *ih_check = B_N_PITEM_HEAD(tbS0, item_pos); |
| 1430 | B_N_PITEM_HEAD(tbS0, item_pos); | ||
| 1431 | 977 | ||
| 1432 | if (!is_direntry_le_ih(ih_check) | 978 | if (!is_direntry_le_ih(ih_check) |
| 1433 | && (pos_in_item != ih_item_len(ih_check) | 979 | && (pos_in_item != ih_item_len(ih_check) |
| @@ -1439,8 +985,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1439 | "to ih_item_len"); | 985 | "to ih_item_len"); |
| 1440 | #endif /* CONFIG_REISERFS_CHECK */ | 986 | #endif /* CONFIG_REISERFS_CHECK */ |
| 1441 | 987 | ||
| 1442 | leaf_mi = | 988 | leaf_mi = leaf_move_items(LEAF_FROM_S_TO_SNEW, |
| 1443 | leaf_move_items(LEAF_FROM_S_TO_SNEW, | ||
| 1444 | tb, snum[i], | 989 | tb, snum[i], |
| 1445 | sbytes[i], | 990 | sbytes[i], |
| 1446 | S_new[i]); | 991 | S_new[i]); |
| @@ -1452,30 +997,19 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1452 | /* paste into item */ | 997 | /* paste into item */ |
| 1453 | buffer_info_init_bh(tb, &bi, S_new[i]); | 998 | buffer_info_init_bh(tb, &bi, S_new[i]); |
| 1454 | leaf_paste_in_buffer(&bi, | 999 | leaf_paste_in_buffer(&bi, |
| 1455 | item_pos - n + | 1000 | item_pos - n + snum[i], |
| 1456 | snum[i], | ||
| 1457 | pos_in_item, | 1001 | pos_in_item, |
| 1458 | tb->insert_size[0], | 1002 | tb->insert_size[0], |
| 1459 | body, zeros_num); | 1003 | body, zeros_num); |
| 1460 | 1004 | ||
| 1461 | pasted = | 1005 | pasted = B_N_PITEM_HEAD(S_new[i], item_pos - n + snum[i]); |
| 1462 | B_N_PITEM_HEAD(S_new[i], | ||
| 1463 | item_pos - n + | ||
| 1464 | snum[i]); | ||
| 1465 | if (is_direntry_le_ih(pasted)) { | 1006 | if (is_direntry_le_ih(pasted)) { |
| 1466 | leaf_paste_entries(&bi, | 1007 | leaf_paste_entries(&bi, |
| 1467 | item_pos - | 1008 | item_pos - n + snum[i], |
| 1468 | n + snum[i], | 1009 | pos_in_item, 1, |
| 1469 | pos_in_item, | 1010 | (struct reiserfs_de_head *)body, |
| 1470 | 1, | 1011 | body + DEH_SIZE, |
| 1471 | (struct | 1012 | tb->insert_size[0] |
| 1472 | reiserfs_de_head | ||
| 1473 | *)body, | ||
| 1474 | body + | ||
| 1475 | DEH_SIZE, | ||
| 1476 | tb-> | ||
| 1477 | insert_size | ||
| 1478 | [0] | ||
| 1479 | ); | 1013 | ); |
| 1480 | } | 1014 | } |
| 1481 | 1015 | ||
| @@ -1495,11 +1029,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1495 | default: /* cases d and t */ | 1029 | default: /* cases d and t */ |
| 1496 | reiserfs_panic(tb->tb_sb, "PAP-12245", | 1030 | reiserfs_panic(tb->tb_sb, "PAP-12245", |
| 1497 | "blknum > 2: unexpected mode: %s(%d)", | 1031 | "blknum > 2: unexpected mode: %s(%d)", |
| 1498 | (flag == | 1032 | (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); |
| 1499 | M_DELETE) ? "DELETE" : ((flag == | ||
| 1500 | M_CUT) ? "CUT" | ||
| 1501 | : "UNKNOWN"), | ||
| 1502 | flag); | ||
| 1503 | } | 1033 | } |
| 1504 | 1034 | ||
| 1505 | memcpy(insert_key + i, B_N_PKEY(S_new[i], 0), KEY_SIZE); | 1035 | memcpy(insert_key + i, B_N_PKEY(S_new[i], 0), KEY_SIZE); |
| @@ -1524,9 +1054,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1524 | /* If we insert the first key change the delimiting key */ | 1054 | /* If we insert the first key change the delimiting key */ |
| 1525 | if (item_pos == 0) { | 1055 | if (item_pos == 0) { |
| 1526 | if (tb->CFL[0]) /* can be 0 in reiserfsck */ | 1056 | if (tb->CFL[0]) /* can be 0 in reiserfsck */ |
| 1527 | replace_key(tb, tb->CFL[0], tb->lkey[0], | 1057 | replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); |
| 1528 | tbS0, 0); | ||
| 1529 | |||
| 1530 | } | 1058 | } |
| 1531 | break; | 1059 | break; |
| 1532 | 1060 | ||
| @@ -1536,53 +1064,27 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1536 | pasted = B_N_PITEM_HEAD(tbS0, item_pos); | 1064 | pasted = B_N_PITEM_HEAD(tbS0, item_pos); |
| 1537 | /* when directory, may be new entry already pasted */ | 1065 | /* when directory, may be new entry already pasted */ |
| 1538 | if (is_direntry_le_ih(pasted)) { | 1066 | if (is_direntry_le_ih(pasted)) { |
| 1539 | if (pos_in_item >= 0 && | 1067 | if (pos_in_item >= 0 && pos_in_item <= ih_entry_count(pasted)) { |
| 1540 | pos_in_item <= | ||
| 1541 | ih_entry_count(pasted)) { | ||
| 1542 | 1068 | ||
| 1543 | RFALSE(!tb->insert_size[0], | 1069 | RFALSE(!tb->insert_size[0], |
| 1544 | "PAP-12260: insert_size is 0 already"); | 1070 | "PAP-12260: insert_size is 0 already"); |
| 1545 | 1071 | ||
| 1546 | /* prepare space */ | 1072 | /* prepare space */ |
| 1547 | buffer_info_init_tbS0(tb, &bi); | 1073 | buffer_info_init_tbS0(tb, &bi); |
| 1548 | leaf_paste_in_buffer(&bi, | 1074 | leaf_paste_in_buffer(&bi, item_pos, pos_in_item, |
| 1549 | item_pos, | 1075 | tb->insert_size[0], body, |
| 1550 | pos_in_item, | ||
| 1551 | tb-> | ||
| 1552 | insert_size | ||
| 1553 | [0], body, | ||
| 1554 | zeros_num); | 1076 | zeros_num); |
| 1555 | 1077 | ||
| 1556 | /* paste entry */ | 1078 | /* paste entry */ |
| 1557 | leaf_paste_entries(&bi, | 1079 | leaf_paste_entries(&bi, item_pos, pos_in_item, 1, |
| 1558 | item_pos, | 1080 | (struct reiserfs_de_head *)body, |
| 1559 | pos_in_item, | 1081 | body + DEH_SIZE, |
| 1560 | 1, | 1082 | tb->insert_size[0]); |
| 1561 | (struct | ||
| 1562 | reiserfs_de_head | ||
| 1563 | *)body, | ||
| 1564 | body + | ||
| 1565 | DEH_SIZE, | ||
| 1566 | tb-> | ||
| 1567 | insert_size | ||
| 1568 | [0] | ||
| 1569 | ); | ||
| 1570 | if (!item_pos && !pos_in_item) { | 1083 | if (!item_pos && !pos_in_item) { |
| 1571 | RFALSE(!tb->CFL[0] | 1084 | RFALSE(!tb->CFL[0] || !tb->L[0], |
| 1572 | || !tb->L[0], | ||
| 1573 | "PAP-12270: CFL[0]/L[0] must be specified"); | 1085 | "PAP-12270: CFL[0]/L[0] must be specified"); |
| 1574 | if (tb->CFL[0]) { | 1086 | if (tb->CFL[0]) |
| 1575 | replace_key(tb, | 1087 | replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); |
| 1576 | tb-> | ||
| 1577 | CFL | ||
| 1578 | [0], | ||
| 1579 | tb-> | ||
| 1580 | lkey | ||
| 1581 | [0], | ||
| 1582 | tbS0, | ||
| 1583 | 0); | ||
| 1584 | |||
| 1585 | } | ||
| 1586 | } | 1088 | } |
| 1587 | tb->insert_size[0] = 0; | 1089 | tb->insert_size[0] = 0; |
| 1588 | } | 1090 | } |
| @@ -1593,13 +1095,8 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1593 | "PAP-12275: insert size must not be %d", | 1095 | "PAP-12275: insert size must not be %d", |
| 1594 | tb->insert_size[0]); | 1096 | tb->insert_size[0]); |
| 1595 | buffer_info_init_tbS0(tb, &bi); | 1097 | buffer_info_init_tbS0(tb, &bi); |
| 1596 | leaf_paste_in_buffer(&bi, | 1098 | leaf_paste_in_buffer(&bi, item_pos, pos_in_item, |
| 1597 | item_pos, | 1099 | tb->insert_size[0], body, zeros_num); |
| 1598 | pos_in_item, | ||
| 1599 | tb-> | ||
| 1600 | insert_size | ||
| 1601 | [0], body, | ||
| 1602 | zeros_num); | ||
| 1603 | 1100 | ||
| 1604 | if (is_indirect_le_ih(pasted)) { | 1101 | if (is_indirect_le_ih(pasted)) { |
| 1605 | #if 0 | 1102 | #if 0 |
| @@ -1611,8 +1108,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1611 | tb-> | 1108 | tb-> |
| 1612 | insert_size[0]); | 1109 | insert_size[0]); |
| 1613 | #endif | 1110 | #endif |
| 1614 | set_ih_free_space | 1111 | set_ih_free_space(pasted, 0); |
| 1615 | (pasted, 0); | ||
| 1616 | } | 1112 | } |
| 1617 | tb->insert_size[0] = 0; | 1113 | tb->insert_size[0] = 0; |
| 1618 | } | 1114 | } |
| @@ -1620,8 +1116,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h | |||
| 1620 | else { | 1116 | else { |
| 1621 | if (tb->insert_size[0]) { | 1117 | if (tb->insert_size[0]) { |
| 1622 | print_cur_tb("12285"); | 1118 | print_cur_tb("12285"); |
| 1623 | reiserfs_panic(tb-> | 1119 | reiserfs_panic(tb->tb_sb, |
| 1624 | tb_sb, | ||
| 1625 | "PAP-12285", | 1120 | "PAP-12285", |
| 1626 | "insert_size " | 1121 | "insert_size " |
| 1627 | "must be 0 " | 1122 | "must be 0 " |
