| 374 | | /* |
| 375 | | create a dataspace to hold directory entries; if we have a |
| 376 | | meta handle range, use that one of those ranges (being |
| 377 | | careful to make sure the range has enough space for an |
| 378 | | allocation) to allocate a dataspace to hold directory |
| 379 | | entries. if we don't have a meta handle range, use |
| 380 | | TROVE_HANDLE_NULL which tells the allocator to use any |
| 381 | | handle available |
| 382 | | */ |
| 383 | | cur_extent.first = cur_extent.last = TROVE_HANDLE_NULL; |
| 384 | | if (meta_handle_ranges) |
| 385 | | { |
| 386 | | get_handle_extent_from_ranges( |
| 387 | | meta_handle_ranges, &cur_extent, s_used_handles, 1); |
| 388 | | |
| 389 | | if ((cur_extent.first == TROVE_HANDLE_NULL) && |
| 390 | | (cur_extent.last == TROVE_HANDLE_NULL)) |
| 391 | | { |
| 392 | | gossip_err("No valid meta handle ranges available! " |
| 393 | | "Using a default\n"); |
| 394 | | } |
| 395 | | else |
| 396 | | { |
| 397 | | mkspace_print( |
| 398 | | verbose, "info: using meta handle range %llu-%llu for " |
| 399 | | "root dirent dspace\n", llu(cur_extent.first), |
| 400 | | llu(cur_extent.last)); |
| 401 | | } |
| 402 | | } |
| 403 | | |
| 404 | | extent_array.extent_count = 1; |
| 405 | | extent_array.extent_array = &cur_extent; |
| 406 | | |
| 407 | | ret = trove_dspace_create( |
| 408 | | coll_id, &extent_array, &root_dirdata_handle, |
| 409 | | PVFS_TYPE_DIRDATA, NULL, TROVE_SYNC, NULL, |
| 410 | | trove_context, &op_id, NULL); |
| 411 | | |
| 412 | | while (ret == 0) |
| 413 | | { |
| 414 | | ret = trove_dspace_test( |
| 415 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 416 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 417 | | } |
| 418 | | |
| 419 | | if ((ret != 1) && (state != 0)) |
| 420 | | { |
| 421 | | gossip_err("dspace create (for dirent storage) failed.\n"); |
| 422 | | return -1; |
| 423 | | } |
| 424 | | |
| 425 | | mkspace_print(verbose, "info: created dspace for dirents " |
| 426 | | "with handle %llu\n", llu(root_dirdata_handle)); |
| 427 | | s_used_handles[1] = root_dirdata_handle; |
| 428 | | |
| 429 | | /* set root dirdata dspace attributes */ |
| 430 | | memset(&attr, 0, sizeof(TROVE_ds_attributes_s)); |
| 431 | | attr.uid = getuid(); |
| 432 | | attr.gid = getgid(); |
| 433 | | attr.mode = 0777; |
| 434 | | attr.type = PVFS_TYPE_DIRDATA; |
| 435 | | attr.atime = attr.ctime = PINT_util_get_current_time(); |
| 436 | | attr.mtime = PINT_util_mktime_version(attr.ctime); |
| 437 | | |
| 438 | | ret = trove_dspace_setattr( |
| 439 | | coll_id, root_dirdata_handle, &attr, TROVE_SYNC, NULL, |
| 440 | | trove_context, &op_id, NULL); |
| 441 | | |
| 442 | | while (ret == 0) |
| 443 | | { |
| 444 | | ret = trove_dspace_test( |
| 445 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 446 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 447 | | } |
| 448 | | |
| 449 | | if (ret < 0) |
| 450 | | { |
| 451 | | gossip_err("error: dspace setattr for root dirdata handle " |
| 452 | | "attributes failed; aborting!\n"); |
| 453 | | return -1; |
| 454 | | } |
| 455 | | |
| 456 | | |
| 457 | | key.buffer = DIRECTORY_ENTRY_KEYSTR; |
| 458 | | key.buffer_sz = DIRECTORY_ENTRY_KEYLEN; |
| 459 | | val.buffer = &root_dirdata_handle; |
| 460 | | val.buffer_sz = sizeof(TROVE_handle); |
| 461 | | |
| 462 | | ret = trove_keyval_write( |
| 463 | | coll_id, new_root_handle, &key, &val, |
| 464 | | TROVE_SYNC, 0, NULL, |
| 465 | | trove_context, &op_id, NULL); |
| 466 | | |
| 467 | | while (ret == 0) |
| 468 | | { |
| 469 | | ret = trove_dspace_test( |
| 470 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 471 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 472 | | } |
| 473 | | |
| 474 | | if (ret < 0) |
| 475 | | { |
| 476 | | gossip_err("error: keyval write for handle used to store " |
| 477 | | "dirents failed; aborting!\n"); |
| 478 | | return -1; |
| 479 | | } |
| 480 | | |
| 481 | | mkspace_print( |
| 482 | | verbose, "info: wrote attributes for root directory.\n"); |
| 483 | | |
| 484 | | |
| 485 | | /* !!! set dist-dir-struct keyvals for root handle and its dirdata handle */ |
| 486 | | /* init meta handle dist_dir_struct, num_servers=1, server_no = -1, pre_dsg_num_server=1 */ |
| 487 | | /* should be reusable when init lost+found */ |
| 488 | | ret = PINT_init_dist_dir_state(&meta_dist_dir_attr, |
| 489 | | &dist_dir_bitmap, 1, 0, 1); |
| 490 | | assert(ret == 0); |
| 491 | | |
| 492 | | /* gossip dist_dir_attr and dist_dir_bitmap */ |
| 493 | | mkspace_print(verbose, "info: init dist_dir_attr for root handle %llu: \n" |
| 494 | | "with tree_height=%d, num_servers=%d, bitmap_size=%d, " |
| 495 | | "split_size=%d, server_no=%d and branch_level=%d\n", |
| 496 | | llu(new_root_handle), |
| 497 | | meta_dist_dir_attr.tree_height, |
| 498 | | meta_dist_dir_attr.num_servers, |
| 499 | | meta_dist_dir_attr.bitmap_size, |
| 500 | | meta_dist_dir_attr.split_size, |
| 501 | | meta_dist_dir_attr.server_no, |
| 502 | | meta_dist_dir_attr.branch_level); |
| 503 | | mkspace_print(verbose, "info: init dist_dir_bitmap as:\n"); |
| 504 | | for(i = meta_dist_dir_attr.bitmap_size - 1; |
| 505 | | i >= 0 ; i--) |
| 506 | | { |
| 507 | | c = (unsigned char *)(dist_dir_bitmap + i); |
| 508 | | mkspace_print(verbose, |
| 509 | | " i=%d : %02x %02x %02x %02x\n", |
| 510 | | i, c[3], c[2], c[1], c[0]); |
| 511 | | } |
| 512 | | mkspace_print(verbose, "\n"); |
| 513 | | |
| 514 | | /* init dirdata_dist_dir_attr */ |
| 515 | | PINT_dist_dir_attr_copyto(dirdata_dist_dir_attr, meta_dist_dir_attr); |
| 516 | | PINT_dist_dir_set_serverno(0, &dirdata_dist_dir_attr, dist_dir_bitmap); |
| 517 | | |
| 518 | | mkspace_print(verbose, "info: init dist_dir_attr for root dirdata handle %llu: \n" |
| 519 | | "with tree_height=%d, num_servers=%d, bitmap_size=%d, " |
| 520 | | "split_size=%d, server_no=%d and branch_level=%d\n", |
| 521 | | llu(root_dirdata_handle), |
| 522 | | dirdata_dist_dir_attr.tree_height, |
| 523 | | dirdata_dist_dir_attr.num_servers, |
| 524 | | dirdata_dist_dir_attr.bitmap_size, |
| 525 | | dirdata_dist_dir_attr.split_size, |
| 526 | | dirdata_dist_dir_attr.server_no, |
| 527 | | dirdata_dist_dir_attr.branch_level); |
| 528 | | |
| 529 | | keyval_count = 3; |
| 530 | | |
| 531 | | key_a = malloc(sizeof(TROVE_keyval_s) * keyval_count); |
| 532 | | if(!key_a) |
| 533 | | { |
| 534 | | gossip_err("keyval space create (for root and lost+found storage) failed.\n"); |
| 535 | | return -1; |
| 536 | | } |
| 537 | | memset(key_a, 0, sizeof(TROVE_keyval_s) * keyval_count); |
| 538 | | |
| 539 | | val_a = malloc(sizeof(TROVE_keyval_s) * keyval_count); |
| 540 | | if(!val_a) |
| 541 | | { |
| 542 | | free(key_a); |
| 543 | | gossip_err("keyval space create (for root and lost+found storage) failed.\n"); |
| 544 | | return -1; |
| 545 | | } |
| 546 | | memset(val_a, 0, sizeof(TROVE_keyval_s) * keyval_count); |
| 547 | | |
| 548 | | /* set keyval for root meta handle */ |
| 549 | | key_a[0].buffer = DIST_DIR_ATTR_KEYSTR; |
| 550 | | key_a[0].buffer_sz = DIST_DIR_ATTR_KEYLEN; |
| 551 | | |
| 552 | | val_a[0].buffer = &meta_dist_dir_attr; |
| 553 | | val_a[0].buffer_sz = |
| 554 | | sizeof(meta_dist_dir_attr); |
| 555 | | |
| 556 | | key_a[1].buffer = DIST_DIRDATA_BITMAP_KEYSTR; |
| 557 | | key_a[1].buffer_sz = DIST_DIRDATA_BITMAP_KEYLEN; |
| 558 | | |
| 559 | | val_a[1].buffer_sz = |
| 560 | | meta_dist_dir_attr.bitmap_size * /* bitmap_size = 1 */ |
| 561 | | sizeof(PVFS_dist_dir_bitmap_basetype); |
| 562 | | val_a[1].buffer = dist_dir_bitmap; |
| 563 | | |
| 564 | | key_a[2].buffer = DIST_DIRDATA_HANDLES_KEYSTR; |
| 565 | | key_a[2].buffer_sz = DIST_DIRDATA_HANDLES_KEYLEN; |
| 566 | | |
| 567 | | val_a[2].buffer = &root_dirdata_handle; /* only one dirdata server */ |
| 568 | | val_a[2].buffer_sz = meta_dist_dir_attr.num_servers * |
| 569 | | sizeof(root_dirdata_handle); |
| 570 | | |
| 571 | | mkspace_print(verbose, |
| 572 | | " info: writing dist-dir-struct keyvals for root handle: %llu " |
| 573 | | " with server_no=%d and branch_level=%d \n", |
| 574 | | llu(new_root_handle), |
| 575 | | meta_dist_dir_attr.server_no, |
| 576 | | meta_dist_dir_attr.branch_level); |
| 577 | | |
| 578 | | /* write to root meta handle keyval space */ |
| 579 | | ret = trove_keyval_write_list( |
| 580 | | coll_id, new_root_handle, key_a, val_a, keyval_count, |
| 581 | | TROVE_SYNC, 0, NULL, |
| 582 | | trove_context, &op_id, NULL); |
| 583 | | |
| 584 | | while (ret == 0) |
| 585 | | { |
| 586 | | ret = trove_dspace_test( |
| 587 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 588 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 589 | | } |
| 590 | | |
| 591 | | if (ret < 0) |
| 592 | | { |
| 593 | | gossip_err("error: keyval write for handle used to store " |
| 594 | | "dirents failed; aborting!\n"); |
| 595 | | return -1; |
| 596 | | } |
| 597 | | |
| 598 | | /* adjust dist_dir_attr val_a */ |
| 599 | | val_a[0].buffer = &dirdata_dist_dir_attr; |
| 600 | | |
| 601 | | mkspace_print(verbose, |
| 602 | | " info: writing dist-dir-struct keyvals for root dirdata handle: %llu " |
| 603 | | " with server_no=%d and branch_level=%d \n", |
| 604 | | llu(root_dirdata_handle), |
| 605 | | dirdata_dist_dir_attr.server_no, |
| 606 | | dirdata_dist_dir_attr.branch_level); |
| 607 | | |
| 608 | | /* write to root dirdata handle keyval space */ |
| 609 | | ret = trove_keyval_write_list( |
| 610 | | coll_id, root_dirdata_handle, key_a, val_a, keyval_count, |
| 611 | | TROVE_SYNC, 0, NULL, |
| 612 | | trove_context, &op_id, NULL); |
| 613 | | |
| 614 | | while (ret == 0) |
| 615 | | { |
| 616 | | ret = trove_dspace_test( |
| 617 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 618 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 619 | | } |
| 620 | | |
| 621 | | if (ret < 0) |
| 622 | | { |
| 623 | | gossip_err("error: dist-dir-struct keyval write for root dirdata handle " |
| 624 | | "failed; aborting!\n"); |
| 625 | | return -1; |
| 626 | | } |
| 627 | | |
| 628 | | mkspace_print( |
| 629 | | verbose, "info: wrote attributes for root directory.\n"); |
| 630 | | |
| 631 | | |
| 632 | | /**************************************************** |
| 633 | | at this point we need to create and initialize the |
| 634 | | lost+found directory as well |
| 635 | | *****************************************************/ |
| 636 | | cur_extent.first = cur_extent.last = TROVE_HANDLE_NULL; |
| 637 | | if (meta_handle_ranges) |
| 638 | | { |
| 639 | | get_handle_extent_from_ranges( |
| 640 | | meta_handle_ranges, &cur_extent, s_used_handles, 2); |
| 641 | | |
| 642 | | if ((cur_extent.first == TROVE_HANDLE_NULL) && |
| 643 | | (cur_extent.last == TROVE_HANDLE_NULL)) |
| 644 | | { |
| 645 | | gossip_err("No valid meta handle ranges available! " |
| 646 | | "Using a default\n"); |
| 647 | | } |
| 648 | | else |
| 649 | | { |
| 650 | | mkspace_print( |
| 651 | | verbose, "info: using meta handle range %llu-%llu for " |
| 652 | | "lost+found directory dspace\n", llu(cur_extent.first), |
| 653 | | llu(cur_extent.last)); |
| 654 | | } |
| 655 | | } |
| 656 | | extent_array.extent_count = 1; |
| 657 | | extent_array.extent_array = &cur_extent; |
| 658 | | |
| 659 | | ret = trove_dspace_create( |
| 660 | | coll_id, &extent_array, &lost_and_found_handle, |
| 661 | | PVFS_TYPE_DIRECTORY, NULL, TROVE_SYNC, NULL, |
| 662 | | trove_context, &op_id, NULL); |
| 663 | | |
| 664 | | while (ret == 0) |
| 665 | | { |
| 666 | | ret = trove_dspace_test( |
| 667 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 668 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 669 | | } |
| 670 | | |
| 671 | | if ((ret != 1) && (state != 0)) |
| 672 | | { |
| 673 | | mkspace_print(verbose, |
| 674 | | "dspace create (for lost+found dir) failed.\n"); |
| 675 | | return -1; |
| 676 | | } |
| 677 | | |
| 678 | | mkspace_print(verbose,"info: created lost+found directory " |
| 679 | | "with handle %llu.\n", llu(lost_and_found_handle)); |
| 680 | | s_used_handles[2] = lost_and_found_handle; |
| 681 | | |
| 682 | | /* set lost+found directory dspace attributes */ |
| 683 | | memset(&attr, 0, sizeof(TROVE_ds_attributes_s)); |
| 684 | | attr.uid = getuid(); |
| 685 | | attr.gid = getgid(); |
| 686 | | attr.mode = 0777; |
| 687 | | attr.type = PVFS_TYPE_DIRECTORY; |
| 688 | | attr.atime = attr.ctime = PINT_util_get_current_time(); |
| 689 | | attr.mtime = PINT_util_mktime_version(attr.ctime); |
| 690 | | |
| 691 | | ret = trove_dspace_setattr( |
| 692 | | coll_id, lost_and_found_handle, &attr, TROVE_SYNC, NULL, |
| 693 | | trove_context, &op_id, NULL); |
| 694 | | |
| 695 | | while (ret == 0) |
| 696 | | { |
| 697 | | ret = trove_dspace_test( |
| 698 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 699 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 700 | | } |
| 701 | | |
| 702 | | if (ret < 0) |
| 703 | | { |
| 704 | | gossip_err("error: dspace setattr for lost+found handle " |
| 705 | | "attributes failed; aborting!\n"); |
| 706 | | return -1; |
| 707 | | } |
| 708 | | |
| 709 | | /* create a dataspace to hold directory entries */ |
| 710 | | cur_extent.first = cur_extent.last = TROVE_HANDLE_NULL; |
| 711 | | if (meta_handle_ranges) |
| 712 | | { |
| 713 | | get_handle_extent_from_ranges( |
| 714 | | meta_handle_ranges, &cur_extent, s_used_handles, 3); |
| 715 | | |
| 716 | | if ((cur_extent.first == TROVE_HANDLE_NULL) && |
| 717 | | (cur_extent.last == TROVE_HANDLE_NULL)) |
| 718 | | { |
| 719 | | gossip_err("No valid meta handle ranges available! " |
| 720 | | "Using a default\n"); |
| 721 | | } |
| 722 | | else |
| 723 | | { |
| 724 | | mkspace_print( |
| 725 | | verbose, "info: using meta handle range %llu-%llu for " |
| 726 | | "lost+found dirent dspace\n", llu(cur_extent.first), |
| 727 | | llu(cur_extent.last)); |
| 728 | | } |
| 729 | | } |
| 730 | | extent_array.extent_count = 1; |
| 731 | | extent_array.extent_array = &cur_extent; |
| 732 | | |
| 733 | | ret = trove_dspace_create( |
| 734 | | coll_id, &extent_array, &lost_and_found_dirdata_handle, |
| 735 | | PVFS_TYPE_DIRDATA, NULL, TROVE_SYNC, NULL, |
| 736 | | trove_context, &op_id, NULL); |
| 737 | | |
| 738 | | while (ret == 0) |
| 739 | | { |
| 740 | | ret = trove_dspace_test( |
| 741 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 742 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 743 | | } |
| 744 | | |
| 745 | | if ((ret != 1) && (state != 0)) |
| 746 | | { |
| 747 | | gossip_err("dspace create (for dirent storage) failed.\n"); |
| 748 | | return -1; |
| 749 | | } |
| 750 | | |
| 751 | | mkspace_print( |
| 752 | | verbose, "info: created dspace for dirents " |
| 753 | | "with handle %llu\n", llu(lost_and_found_dirdata_handle)); |
| 754 | | s_used_handles[3] = lost_and_found_dirdata_handle; |
| 755 | | |
| 756 | | /* set lost+found dirdata dspace attributes */ |
| 757 | | memset(&attr, 0, sizeof(TROVE_ds_attributes_s)); |
| 758 | | attr.uid = getuid(); |
| 759 | | attr.gid = getgid(); |
| 760 | | attr.mode = 0777; |
| 761 | | attr.type = PVFS_TYPE_DIRDATA; |
| 762 | | attr.atime = attr.ctime = PINT_util_get_current_time(); |
| 763 | | attr.mtime = PINT_util_mktime_version(attr.ctime); |
| 764 | | |
| 765 | | ret = trove_dspace_setattr( |
| 766 | | coll_id, lost_and_found_dirdata_handle, &attr, TROVE_SYNC, NULL, |
| 767 | | trove_context, &op_id, NULL); |
| 768 | | |
| 769 | | while (ret == 0) |
| 770 | | { |
| 771 | | ret = trove_dspace_test( |
| 772 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 773 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 774 | | } |
| 775 | | |
| 776 | | if (ret < 0) |
| 777 | | { |
| 778 | | gossip_err("error: dspace setattr for lost+found handle " |
| 779 | | "attributes failed; aborting!\n"); |
| 780 | | return -1; |
| 781 | | } |
| 782 | | |
| 783 | | key.buffer = DIRECTORY_ENTRY_KEYSTR; |
| 784 | | key.buffer_sz = DIRECTORY_ENTRY_KEYLEN; |
| 785 | | val.buffer = &lost_and_found_dirdata_handle; |
| 786 | | val.buffer_sz = sizeof(TROVE_handle); |
| 787 | | |
| 788 | | ret = trove_keyval_write( |
| 789 | | coll_id, lost_and_found_handle, &key, &val, |
| 790 | | TROVE_SYNC, |
| 791 | | 0, NULL, trove_context, &op_id, NULL); |
| 792 | | |
| 793 | | while (ret == 0) |
| 794 | | { |
| 795 | | ret = trove_dspace_test( |
| 796 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 797 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 798 | | } |
| 799 | | |
| 800 | | if (ret < 0) |
| 801 | | { |
| 802 | | gossip_err("error: keyval write for handle used to store " |
| 803 | | "dirents failed; aborting!\n"); |
| 804 | | return -1; |
| 805 | | } |
| 806 | | |
| 807 | | mkspace_print(verbose, "info: wrote attributes for " |
| 808 | | "lost+found directory.\n"); |
| 809 | | |
| 810 | | |
| 811 | | /* set dist-dir-struct keyvals for lost+find handle and its dirdata handle |
| 812 | | * use 1 dirdata server now, just as root handle |
| 813 | | * */ |
| 814 | | |
| 815 | | /* adjust keyval values, others should be the same as the root handle */ |
| 816 | | val_a[0].buffer = &meta_dist_dir_attr; |
| 817 | | val_a[2].buffer = &lost_and_found_dirdata_handle; |
| 818 | | /* bitmap should be the same as the root handle for now */ |
| 819 | | |
| 820 | | mkspace_print(verbose, |
| 821 | | " info: writing dist-dir-struct keyvals for lost+found handle: %llu " |
| 822 | | " with server_no=%d and branch_level=%d \n", |
| 823 | | llu(lost_and_found_handle), |
| 824 | | meta_dist_dir_attr.server_no, |
| 825 | | meta_dist_dir_attr.branch_level); |
| 826 | | |
| 827 | | /* write to lost+found meta handle keyval space */ |
| 828 | | ret = trove_keyval_write_list( |
| 829 | | coll_id, lost_and_found_handle, key_a, val_a, keyval_count, |
| 830 | | TROVE_SYNC, 0, NULL, |
| 831 | | trove_context, &op_id, NULL); |
| 832 | | |
| 833 | | while (ret == 0) |
| 834 | | { |
| 835 | | ret = trove_dspace_test( |
| 836 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 837 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 838 | | } |
| 839 | | |
| 840 | | if (ret < 0) |
| 841 | | { |
| 842 | | gossip_err("error: keyval write for handle used to store " |
| 843 | | "dirents failed; aborting!\n"); |
| 844 | | return -1; |
| 845 | | } |
| 846 | | |
| 847 | | |
| 848 | | /* adjust dist_dir_attr val */ |
| 849 | | val_a[0].buffer = &dirdata_dist_dir_attr; |
| 850 | | |
| 851 | | mkspace_print(verbose, |
| 852 | | " info: writing dist-dir-struct keyvals for lost+found dirdata handle: %llu " |
| 853 | | " with server_no=%d and branch_level=%d \n", |
| 854 | | llu(lost_and_found_dirdata_handle), |
| 855 | | dirdata_dist_dir_attr.server_no, |
| 856 | | dirdata_dist_dir_attr.branch_level); |
| 857 | | |
| 858 | | /* write to lost+found dirdata handle keyval space */ |
| 859 | | ret = trove_keyval_write_list( |
| 860 | | coll_id, lost_and_found_dirdata_handle, key_a, val_a, keyval_count, |
| 861 | | TROVE_SYNC, 0, NULL, |
| 862 | | trove_context, &op_id, NULL); |
| 863 | | |
| 864 | | while (ret == 0) |
| 865 | | { |
| 866 | | ret = trove_dspace_test( |
| 867 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 868 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 869 | | } |
| 870 | | |
| 871 | | if (ret < 0) |
| 872 | | { |
| 873 | | gossip_err("error: dist-dir-struct keyval write for lost+found dirdata handle " |
| 874 | | "failed; aborting!\n"); |
| 875 | | return -1; |
| 876 | | } |
| 877 | | |
| 878 | | mkspace_print(verbose, "info: wrote attributes for " |
| 879 | | "lost+found directory.\n"); |
| 880 | | |
| 881 | | |
| 882 | | /* |
| 883 | | finally, crdirent the lost+found directory into the root |
| 884 | | directory by writing the appropriate keyval info into the |
| 885 | | root dirdata handle space |
| 886 | | */ |
| 887 | | key.buffer = lost_and_found_string; |
| 888 | | key.buffer_sz = strlen(lost_and_found_string) + 1; |
| 889 | | val.buffer = &lost_and_found_handle; |
| 890 | | val.buffer_sz = sizeof(TROVE_handle); |
| 891 | | |
| 892 | | ret = trove_keyval_write( |
| 893 | | coll_id, root_dirdata_handle, &key, &val, |
| 894 | | TROVE_SYNC | TROVE_NOOVERWRITE | TROVE_KEYVAL_HANDLE_COUNT | TROVE_KEYVAL_DIRECTORY_ENTRY, |
| 895 | | 0, |
| 896 | | NULL, trove_context, &op_id, NULL); |
| 897 | | |
| 898 | | while (ret == 0) |
| 899 | | { |
| 900 | | ret = trove_dspace_test( |
| 901 | | coll_id, op_id, trove_context, &count, NULL, NULL, |
| 902 | | &state, TROVE_DEFAULT_TEST_TIMEOUT); |
| 903 | | } |
| 904 | | |
| 905 | | if (ret < 0) |
| 906 | | { |
| 907 | | gossip_err("error: keyval write for handle used to store " |
| 908 | | "dirents failed; aborting!\n"); |
| 909 | | return -1; |
| 910 | | } |
| 911 | | |
| 912 | | mkspace_print(verbose, "info: adding lost+found directory to " |
| 913 | | "the root directory.\n"); |
| | 368 | |
| | 369 | /* The creation of dirdata objects for the root directory is |
| | 370 | * moved to pvfs2_server.c to setup distributed directory struct. |
| | 371 | * lost+found directory is also created there. |
| | 372 | */ |
| | 373 | |