Changeset 95ca19d in mainline
- Timestamp:
- 2025-06-30T09:31:21Z (3 weeks ago)
- Children:
- 059885c
- Parents:
- 640250b
- Location:
- uspace
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hrctl/hrctl.c
r640250b r95ca19d 55 55 static int create_from_argv(hr_t *, int, char **, uint8_t); 56 56 static int handle_create(hr_t *, int, char **); 57 static int assemble_from_config(hr_t *, const char * );58 static int assemble_from_argv(hr_t *, int, char ** );57 static int assemble_from_config(hr_t *, const char *, uint8_t); 58 static int assemble_from_argv(hr_t *, int, char **, uint8_t); 59 59 static int handle_assemble(hr_t *, int, char **); 60 60 static int handle_disassemble(hr_t *, int, char **); … … 70 70 " -h, --help Display this message and exit.\n" 71 71 "\n" 72 " -c, --create [--no _meta]Create a volume, options:\n"72 " -c, --create [--no-meta] [--read-only] Create a volume, options:\n" 73 73 " name {-l , --level level} device... manual device specification, or\n" 74 74 " -f configuration.sif create from configuration file.\n" 75 75 "\n" 76 76 " -a, --assemble Assemble volume(s), options:\n" 77 " [ device...]manual device specification, or\n"78 " [ -f configuration.sif]assemble from configuration file, or\n"77 " [[--read-only] device...] manual device specification, or\n" 78 " [[--read-only] -f configuration.sif] assemble from configuration file, or\n" 79 79 " no option is automatic assembly.\n" 80 80 "\n" … … 108 108 "\n" 109 109 "Notes:\n" 110 " Add --no _meta after --create to disable storing on-disk metadata.\n"110 " Add --no-meta after --create to disable storing on-disk metadata.\n" 111 111 " Simulating an extent failure with -m volume -f index is dangerous. It marks\n" 112 112 " metadata as dirty in other healthy extents, and zeroes out the superblock\n" … … 445 445 } 446 446 447 static bool try_to_get_additional_flags(int argc, char **argv, 448 uint8_t test_flags, uint8_t *flags) 449 { 450 if (test_flags & HR_VOL_FLAG_NOOP_META) { 451 if (str_cmp(argv[optind], "--no-meta") == 0) { 452 *flags |= HR_VOL_FLAG_NOOP_META; 453 optind++; 454 return true; 455 } 456 } 457 458 if (test_flags & HR_VOL_FLAG_READ_ONLY) { 459 if (str_cmp(argv[optind], "--read-only") == 0) { 460 *flags |= HR_VOL_FLAG_READ_ONLY; 461 optind++; 462 return true; 463 } 464 } 465 466 return false; 467 } 468 447 469 static int handle_create(hr_t *hr, int argc, char **argv) 448 470 { 449 471 int rc; 450 uint8_t v ol_flags = 0;472 uint8_t vflags = 0; 451 473 452 474 if (optind >= argc) { … … 455 477 } 456 478 457 if (str_cmp(argv[optind], "--no_meta") == 0) { 458 vol_flags |= HR_VOL_FLAG_NOOP_META; 459 optind++; 460 } 479 uint8_t test_flags = HR_VOL_FLAG_NOOP_META | HR_VOL_FLAG_READ_ONLY; 480 while (try_to_get_additional_flags(argc, argv, test_flags, &vflags)) 481 ; 461 482 462 483 if (str_cmp(argv[optind], "-f") == 0) { … … 474 495 } 475 496 476 rc = create_from_config(hr, config_path, v ol_flags);497 rc = create_from_config(hr, config_path, vflags); 477 498 } else { 478 rc = create_from_argv(hr, argc, argv, v ol_flags);499 rc = create_from_argv(hr, argc, argv, vflags); 479 500 } 480 501 … … 482 503 } 483 504 484 static int assemble_from_config(hr_t *hr, const char *config_path) 505 static int assemble_from_config(hr_t *hr, const char *config_path, 506 uint8_t vflags) 485 507 { 486 508 hr_config_t *vol_configs = NULL; … … 496 518 for (size_t i = 0; i < vol_count; i++) { 497 519 size_t tmpcnt = 0; 520 vol_configs[i].vol_flags = vflags; 498 521 (void)hr_assemble(hr, &vol_configs[i], &tmpcnt); 499 522 cnt += tmpcnt; … … 506 529 } 507 530 508 static int assemble_from_argv(hr_t *hr, int argc, char **argv )531 static int assemble_from_argv(hr_t *hr, int argc, char **argv, uint8_t vflags) 509 532 { 510 533 hr_config_t *vol_config = calloc(1, sizeof(hr_config_t)); … … 513 536 return ENOMEM; 514 537 } 538 539 vol_config->vol_flags = vflags; 515 540 516 541 errno_t rc = fill_config_devs(argc, argv, vol_config); … … 551 576 } 552 577 578 uint8_t vflags = 0; 579 uint8_t test_flags = HR_VOL_FLAG_NOOP_META | HR_VOL_FLAG_READ_ONLY; 580 while (try_to_get_additional_flags(argc, argv, test_flags, &vflags)) 581 ; 582 583 if (test_flags & HR_VOL_FLAG_NOOP_META) 584 printf(NAME ": assembling, --no-meta flag will be ignored\n"); 585 553 586 if (str_cmp(argv[optind], "-f") == 0) { 554 587 if (++optind >= argc) { … … 563 596 } 564 597 565 rc = assemble_from_config(hr, config_path );598 rc = assemble_from_config(hr, config_path, vflags); 566 599 } else { 567 rc = assemble_from_argv(hr, argc, argv );600 rc = assemble_from_argv(hr, argc, argv, vflags); 568 601 } 569 602 … … 658 691 printf("| metadata type: %s\n", 659 692 hr_get_metadata_type_str(info->meta_type)); 693 694 printf("| vflags: "); 695 for (size_t v = 0; v < HR_VOL_FLAG_COUNT; v++) { 696 if (info->vflags & (1 << v)) { 697 printf("%s ", 698 hr_get_vol_flag_str(info->vflags & (1 << v))); 699 } 700 } 701 printf("\n"); 702 660 703 printf("| level: %s\n", hr_get_level_str(info->level)); 661 704 if (info->layout != HR_LAYOUT_NONE) -
uspace/lib/device/include/hr.h
r640250b r95ca19d 92 92 } hr_metadata_type_t; 93 93 94 #define HR_VOL_FLAG_COUNT 2 94 95 typedef enum hr_vol_flag { 95 HR_VOL_FLAG_NOOP_META = 0x01 96 HR_VOL_FLAG_NOOP_META = 0x01, 97 HR_VOL_FLAG_READ_ONLY = 0x02 96 98 } hr_vol_flag_t; 97 99 … … 133 135 hr_layout_t layout; 134 136 hr_metadata_type_t meta_type; 135 /* TODO: add rebuild pos */137 uint8_t vflags; 136 138 } hr_vol_info_t; 137 139 … … 152 154 extern const char *hr_get_level_str(hr_level_t); 153 155 extern const char *hr_get_metadata_type_str(hr_metadata_type_t); 156 extern const char *hr_get_vol_flag_str(hr_vol_flag_t); 154 157 155 158 #endif -
uspace/lib/device/src/hr.c
r640250b r95ca19d 561 561 } 562 562 563 const char *hr_get_vol_flag_str(hr_vol_flag_t flag) 564 { 565 switch (flag) { 566 case HR_VOL_FLAG_NOOP_META: 567 return "--no-meta"; 568 case HR_VOL_FLAG_READ_ONLY: 569 return "--read-only"; 570 default: 571 return "Invalid flag"; 572 } 573 } 574 563 575 /** @} 564 576 */ -
uspace/srv/bd/hr/hr.c
r640250b r95ca19d 137 137 meta_type = HR_METADATA_NATIVE; 138 138 139 printf("creating with type %d\n", meta_type);140 rc = hr_create_vol_struct(&vol, cfg->level, cfg->devname, meta_type);139 rc = hr_create_vol_struct(&vol, cfg->level, cfg->devname, meta_type, 140 cfg->vol_flags); 141 141 if (rc != EOK) { 142 142 free(cfg); … … 531 531 info.meta_type = vol->meta_ops->get_type(); 532 532 memcpy(info.devname, vol->devname, HR_DEVNAME_LEN); 533 info.vflags = vol->vflags; 533 534 534 535 if (!async_data_read_receive(&call, &size)) { -
uspace/srv/bd/hr/raid0.c
r640250b r95ca19d 256 256 return EINVAL; 257 257 258 if (vol->vflags & HR_VOL_FLAG_READ_ONLY && type == HR_BD_WRITE) 259 return ENOTSUP; 260 258 261 fibril_rwlock_read_lock(&vol->states_lock); 259 262 if (vol->state != HR_VOL_OPTIMAL) { -
uspace/srv/bd/hr/raid1.c
r640250b r95ca19d 278 278 hr_volume_t *vol = bd->srvs->sarg; 279 279 280 if (vol->vflags & HR_VOL_FLAG_READ_ONLY) 281 return ENOTSUP; 282 280 283 return hr_raid1_bd_op(HR_BD_WRITE, vol, ba, cnt, NULL, data, size); 281 284 } … … 455 458 errno_t rc; 456 459 460 if (vol->vflags & HR_VOL_FLAG_READ_ONLY) 461 return ENOTSUP; 457 462 if (!(vol->meta_ops->get_flags() & HR_METADATA_ALLOW_REBUILD)) 458 463 return ENOTSUP; -
uspace/srv/bd/hr/raid5.c
r640250b r95ca19d 384 384 return EINVAL; 385 385 386 if (vol->vflags & HR_VOL_FLAG_READ_ONLY) 387 return ENOTSUP; 388 386 389 fibril_rwlock_read_lock(&vol->states_lock); 387 390 hr_vol_state_t vol_state = vol->state; … … 717 720 void *buf = NULL, *xorbuf = NULL; 718 721 722 if (vol->vflags & HR_VOL_FLAG_READ_ONLY) 723 return ENOTSUP; 719 724 if (!(vol->meta_ops->get_flags() & HR_METADATA_ALLOW_REBUILD)) 720 725 return ENOTSUP; -
uspace/srv/bd/hr/util.c
r640250b r95ca19d 65 65 service_id_t, hr_metadata_type_t, void *); 66 66 static errno_t hr_util_assemble_from_matching_list(list_t *, 67 hr_metadata_type_t );67 hr_metadata_type_t, uint8_t); 68 68 static errno_t hr_fill_svcs_list_from_cfg(hr_config_t *, list_t *); 69 69 static errno_t hr_swap_hs(hr_volume_t *, size_t, size_t); … … 102 102 103 103 errno_t hr_create_vol_struct(hr_volume_t **rvol, hr_level_t level, 104 const char *devname, hr_metadata_type_t metadata_type )104 const char *devname, hr_metadata_type_t metadata_type, uint8_t vflags) 105 105 { 106 106 HR_DEBUG("%s()", __func__); … … 114 114 str_cpy(vol->devname, HR_DEVNAME_LEN, devname); 115 115 vol->level = level; 116 117 vol->vflags = vflags; 116 118 117 119 vol->meta_ops = hr_get_meta_type_ops(metadata_type); … … 831 833 832 834 static errno_t hr_util_assemble_from_matching_list(list_t *list, 833 hr_metadata_type_t type )835 hr_metadata_type_t type, uint8_t vflags) 834 836 { 835 837 HR_DEBUG("%s()", __func__); … … 847 849 848 850 hr_volume_t *vol; 849 rc = hr_create_vol_struct(&vol, level, devname, type );851 rc = hr_create_vol_struct(&vol, level, devname, type, vflags); 850 852 if (rc != EOK) 851 853 return rc; … … 913 915 errno_t rc; 914 916 list_t dev_id_list; 917 uint8_t vflags = 0; 915 918 916 919 list_initialize(&dev_id_list); 917 920 918 if (cfg == NULL) 921 if (cfg == NULL) { 919 922 rc = hr_fill_disk_part_svcs_list(&dev_id_list); 920 else923 } else { 921 924 rc = hr_fill_svcs_list_from_cfg(cfg, &dev_id_list); 925 vflags = cfg->vol_flags; 926 } 922 927 923 928 if (rc != EOK) … … 986 991 987 992 rc = hr_util_assemble_from_matching_list(&matching_svcs_list, 988 type );993 type, vflags); 989 994 switch (rc) { 990 995 case EOK: -
uspace/srv/bd/hr/util.h
r640250b r95ca19d 84 84 85 85 extern errno_t hr_create_vol_struct(hr_volume_t **, hr_level_t, const char *, 86 hr_metadata_type_t );86 hr_metadata_type_t, uint8_t); 87 87 extern void hr_destroy_vol_struct(hr_volume_t *); 88 88 extern errno_t hr_get_volume_svcs(size_t *, service_id_t **); -
uspace/srv/bd/hr/var.h
r640250b r95ca19d 118 118 _Atomic int open_cnt; /* open/close() counter */ 119 119 hr_vol_state_t state; /* volume state */ 120 uint8_t vflags; 120 121 } hr_volume_t; 121 122
Note:
See TracChangeset
for help on using the changeset viewer.