Changeset b0f1366 in mainline for uspace/app


Ignore:
Timestamp:
2024-09-06T11:37:54Z (19 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
9c1cf34c
Parents:
ee83e9c
Message:

hr: write persistent metadata, assemble array from metadata

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/hrctl/hrctl.c

    ree83e9c rb0f1366  
    5353    "\n"
    5454    "Options:\n"
    55     "  -h, --help              display this help and exit\n"
    56     "  -C, --config-file=path  create an array from file,\n"
    57     "                          sample file at: " HRCTL_SAMPLE_CONFIG_PATH "\n"
    58     "  -s, --status            display status of active arrays\n"
    59     "  -a, --assemble=NAME     assemble an existing array\n"
    60     "  -c, --create=NAME       create new array\n"
    61     "  -n                      non-zero number of devices\n"
    62     "  -l, --level=LEVEL       set the RAID level,\n"
    63     "                          valid values: 0, 1, 5, linear\n"
    64     "  -0                      striping\n"
    65     "  -1                      mirroring\n"
    66     "  -5                      distributed parity\n"
    67     "  -L                      linear concatenation\n"
     55    "  -h, --help                display this help and exit\n"
     56    "  -C, --create-file=path    create an array from file,\n"
     57    "                            sample file at: " HRCTL_SAMPLE_CONFIG_PATH "\n"
     58    "  -A, --assemble-file=path  create an array from file\n"
     59    "  -s, --status              display status of active arrays\n"
     60    "  -c, --create=NAME         create new array\n"
     61    "  -a, --assemble=NAME       assemble an existing array\n"
     62    "  -n                        non-zero number of devices\n"
     63    "  -l, --level=LEVEL         set the RAID level,\n"
     64    "                            valid values: 0, 1, 5, linear\n"
     65    "  -0                        striping\n"
     66    "  -1                        mirroring\n"
     67    "  -5                        distributed parity\n"
     68    "  -L                        linear concatenation\n"
    6869    "\n"
    6970    "Example usage:\n"
     
    8384        { "create", required_argument, 0, 'c' },
    8485        { "level", required_argument, 0, 'l' },
    85         { "config-file", required_argument, 0, 'C' },
     86        { "create-file", required_argument, 0, 'C' },
     87        { "assemble-file", required_argument, 0, 'A' },
    8688        { 0, 0, 0, 0 }
    8789};
     
    154156
    155157        level_str = sif_node_get_attr(narray, "level");
    156         if (level_str == NULL) {
    157                 rc = EIO;
    158                 goto error;
    159         }
    160         cfg->level = strtol(level_str, NULL, 10);
     158        if (level_str == NULL)
     159                cfg->level = hr_l_empty;
     160        else if (str_cmp(level_str, "linear") == 0)
     161                cfg->level = hr_l_linear;
     162        else
     163                cfg->level = strtol(level_str, NULL, 10);
    161164
    162165        dev_no_str = sif_node_get_attr(narray, "n");
     
    228231
    229232        while (c != -1) {
    230                 c = getopt_long(argc, argv, "hsC:c:a:l:015Ln:",
     233                c = getopt_long(argc, argv, "hsC:c:A:a:l:015Ln:",
    231234                    long_options, NULL);
    232235                switch (c) {
     
    239242                                return 1;
    240243                        return 0;
    241                 case 'a':
    242                         if (str_size(optarg) > sizeof(cfg->devname) - 1) {
    243                                 printf("hrctl: device name too long\n");
    244                                 return 1;
    245                         }
    246                         str_cpy(cfg->devname, sizeof(cfg->devname), optarg);
    247                         assemble = true;
    248                         break;
    249244                case 'C':
    250245                        /* only support 1 array inside config for now XXX */
     
    264259                        create = true;
    265260                        break;
     261                case 'A':
     262                        rc = load_config(optarg, cfg);
     263                        if (rc != EOK) {
     264                                printf("hrctl: failed to load config\n");
     265                                return 1;
     266                        }
     267                        assemble = true;
     268                        goto skip;
     269                case 'a':
     270                        if (str_size(optarg) > sizeof(cfg->devname) - 1) {
     271                                printf("hrctl: device name too long\n");
     272                                return 1;
     273                        }
     274                        str_cpy(cfg->devname, sizeof(cfg->devname), optarg);
     275                        assemble = true;
     276                        break;
    266277                case 'l':
    267278                        if (cfg->level != hr_l_empty)
     
    296307                        if ((int) cfg->dev_no + optind != argc)
    297308                                goto bad;
    298                         if (cfg->dev_no > HR_MAXDEVS) {
    299                                 printf("hrctl: too many devices\n");
    300                                 return 1;
    301                         }
    302309                        rc = fill_config_devs(argc, argv, optind, cfg);
    303310                        if (rc != EOK)
     
    308315
    309316skip:
    310         if ((create && assemble) ||
    311             (!create && !assemble) ||
    312             (create && cfg->level == hr_l_empty) ||
    313             (assemble && cfg->level != hr_l_empty) ||
    314             (cfg->dev_no == 0)) {
     317        if ((create && assemble) || (!create && !assemble))
    315318                goto bad;
     319
     320        if (create && cfg->level == hr_l_empty) {
     321                printf("hrctl: invalid level, exiting\n");
     322                return 1;
     323        }
     324
     325        if (cfg->dev_no > HR_MAXDEVS) {
     326                printf("hrctl: too many devices, exiting\n");
     327                return 1;
     328        }
     329
     330        if (cfg->dev_no == 0) {
     331                printf("hrctl: invalid number of devices, exiting\n");
     332                return 1;
    316333        }
    317334
     
    327344                printf("hrctl: hr_create() rc: %s\n", str_error(rc));
    328345        } else if (assemble) {
    329                 printf("hrctl: assemble not implemented yet\n");
     346                rc = hr_assemble(hr, cfg);
     347                printf("hrctl: hr_assemble() rc: %s\n", str_error(rc));
    330348        }
    331349
Note: See TracChangeset for help on using the changeset viewer.