Changeset e47a032 in mainline


Ignore:
Timestamp:
2024-10-28T20:02:39Z (7 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
9fc1d36d
Parents:
066fed9
Message:

hr: base for status handling

Location:
uspace
Files:
8 edited

Legend:

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

    r066fed9 re47a032  
    104104        for (i = 0; i < cfg->dev_no; i++) {
    105105                rc = loc_service_get_id(argv[optind], &cfg->devs[i], 0);
    106                 if (rc != EOK) {
    107                         printf("hrctl: error resolving device \"%s\"\n", argv[optind]);
     106                if (rc == ENOENT) {
     107                        printf("hrctl: no device \"%s\", marking as missing\n",
     108                            argv[optind]);
     109                        cfg->devs[i] = 0;
     110                } else if (rc != EOK) {
     111                        printf("hrctl: error resolving device \"%s\", aborting\n",
     112                            argv[optind]);
    108113                        return EINVAL;
    109114                }
     
    190195
    191196                rc = loc_service_get_id(extent_devname, &cfg->devs[i], 0);
    192                 if (rc != EOK) {
    193                         printf("hrctl: error resolving device \"%s\"\n",
     197                if (rc == ENOENT) {
     198                        printf("hrctl: no device \"%s\", marking as missing\n",
     199                            extent_devname);
     200                        cfg->devs[i] = 0;
     201                        rc = EOK;
     202                } else if (rc != EOK) {
     203                        printf("hrctl: error resolving device \"%s\", aborting\n",
    194204                            extent_devname);
    195205                        return EINVAL;
  • uspace/lib/device/include/hr.h

    r066fed9 re47a032  
    5454} hr_level_t;
    5555
     56typedef enum hr_vol_status {
     57        HR_VOL_ONLINE,  /* OK, OPTIMAL */
     58        HR_VOL_FAULTY
     59} hr_vol_status_t;
     60
     61typedef enum hr_ext_status {
     62        HR_EXT_ONLINE,  /* OK */
     63        HR_EXT_MISSING,
     64        HR_EXT_FAILED
     65} hr_ext_status_t;
     66
    5667typedef struct hr {
    5768        async_sess_t *sess;
     
    6778typedef struct hr_extent {
    6879        service_id_t svc_id;
    69         int status;
     80        hr_ext_status_t status;
    7081} hr_extent_t;
    7182
     
    7889        uint32_t strip_size;
    7990        size_t bsize;
     91        hr_vol_status_t status;
    8092} hr_vol_info_t;
    8193
     
    8799extern errno_t hr_print_status(void);
    88100
     101extern const char *hr_get_vol_status_msg(hr_vol_status_t);
     102extern const char *hr_get_ext_status_msg(hr_ext_status_t);
     103
    89104#endif
    90105
  • uspace/lib/device/src/hr.c

    r066fed9 re47a032  
    130130        printf("devname: %s\n", devname);
    131131
     132        printf("status: %s\n", hr_get_vol_status_msg(vol_info->status));
     133
    132134        printf("level: %d\n", vol_info->level);
    133135        if (vol_info->level == HR_LVL_0 || vol_info->level == HR_LVL_4) {
     
    150152        for (i = 0; i < vol_info->extent_no; i++) {
    151153                ext = &vol_info->extents[i];
    152                 rc = loc_service_get_name(ext->svc_id, &devname);
    153                 if (rc != EOK)
    154                         return rc;
     154                if (ext->status == HR_EXT_MISSING) {
     155                        devname = (char *) "MISSING-devname";
     156                } else {
     157                        rc = loc_service_get_name(ext->svc_id, &devname);
     158                        if (rc != EOK)
     159                                return rc;
     160                }
    155161                if (i == 0 && vol_info->level == HR_LVL_4)
    156                         printf("          P   %d        %zu       %s\n", ext->status, i, devname);
     162                        printf("          P   %s    %zu       %s\n", hr_get_ext_status_msg(ext->status), i, devname);
    157163                else if (vol_info->level == HR_LVL_4)
    158                         printf("              %d        %zu       %s\n", ext->status, i, devname);
     164                        printf("              %s    %zu       %s\n", hr_get_ext_status_msg(ext->status), i, devname);
    159165                else
    160                         printf("          %d        %zu       %s\n", ext->status, i, devname);
     166                        printf("          %s    %zu       %s\n", hr_get_ext_status_msg(ext->status), i, devname);
    161167        }
    162168        return EOK;
     
    262268}
    263269
     270const char *hr_get_vol_status_msg(hr_vol_status_t status)
     271{
     272        switch (status) {
     273        case HR_VOL_ONLINE:
     274                return "ONLINE";
     275        case HR_VOL_FAULTY:
     276                return "FAULTY";
     277        default:
     278                return "UNKNOWN";
     279        }
     280}
     281
     282const char *hr_get_ext_status_msg(hr_ext_status_t status)
     283{
     284        switch (status) {
     285        case HR_EXT_ONLINE:
     286                return "ONLINE";
     287        case HR_EXT_MISSING:
     288                return "MISSING";
     289        case HR_EXT_FAILED:
     290                return "FAILED";
     291        default:
     292                return "UNKNOWN";
     293        }
     294}
     295
    264296/** @}
    265297 */
  • uspace/srv/bd/hr/hr.c

    r066fed9 re47a032  
    134134        }
    135135
     136        /*
     137         * If there was a missing device provided
     138         * for creation of a new array, abort
     139         */
     140        if (!assemble) {
     141                for (i = 0; i < cfg->dev_no; i++) {
     142                        if (cfg->devs[i] == 0) {
     143                                free(cfg);
     144                                async_answer_0(icall, EINVAL);
     145                                return;
     146                        }
     147                }
     148        }
     149
    136150        new_volume = calloc(1, sizeof(hr_volume_t));
    137151        if (new_volume == NULL) {
     
    302316                info.strip_size = volume->strip_size;
    303317                info.bsize = volume->bsize;
     318                info.status = volume->status;
    304319
    305320                if (!async_data_read_receive(&call, &size)) {
  • uspace/srv/bd/hr/superblock.c

    r066fed9 re47a032  
    121121}
    122122
    123 
    124123errno_t hr_fill_vol_from_meta(hr_volume_t *vol)
    125124{
     
    134133
    135134        service_id_t cfg_svc_id_order[HR_MAXDEVS] = { 0 };
    136         for (size_t i = 0; i < vol->dev_no; i++)
     135        for (size_t i = 0; i < vol->dev_no; i++) {
    137136                cfg_svc_id_order[i] = vol->extents[i].svc_id;
    138 
    139 
    140         uint32_t md_order[HR_MAXDEVS] = { 0 };
     137                vol->extents[i].svc_id = 0;
     138                vol->extents[i].status = HR_EXT_MISSING;
     139        }
     140
     141        int32_t md_order[HR_MAXDEVS] = { 0 };
    141142        for (size_t i = 0; i < vol->dev_no; i++) {
     143                if (cfg_svc_id_order[i] == 0) {
     144                        md_order[i] = -1;
     145                        continue;
     146                }
    142147                rc = read_metadata(cfg_svc_id_order[i], metadata);
    143148                if (rc != EOK)
     
    149154        }
    150155
    151         for (size_t i = 0; i < vol->dev_no; i++)
    152                 for (size_t j = 0; j < vol->dev_no; j++)
    153                         if (i == md_order[j])
     156        for (size_t i = 0; i < vol->dev_no; i++) {
     157                for (size_t j = 0; j < vol->dev_no; j++) {
     158                        if (i == (uint32_t) md_order[j]) {
    154159                                vol->extents[i].svc_id = cfg_svc_id_order[j];
     160                                vol->extents[i].status = HR_EXT_ONLINE;
     161                        }
     162                }
     163        }
    155164
    156165        /*
  • uspace/srv/bd/hr/util.c

    r066fed9 re47a032  
    5656
    5757        for (i = 0; i < vol->dev_no; i++) {
     58                if (vol->extents[i].svc_id == 0) {
     59                        vol->extents[i].status = HR_EXT_MISSING;
     60                        continue;
     61                }
    5862                rc = block_init(vol->extents[i].svc_id);
     63                vol->extents[i].status = HR_EXT_ONLINE;
    5964                log_msg(LOG_DEFAULT, LVL_DEBUG,
    60                     "hr_init_devs(): initing (%" PRIun ")", vol->extents[i].svc_id);
     65                    "hr_init_devs(): initing (%" PRIun ")",
     66                    vol->extents[i].svc_id);
    6167                if (rc != EOK) {
    6268                        log_msg(LOG_DEFAULT, LVL_ERROR,
     
    7783
    7884        for (i = 0; i < vol->dev_no; i++)
    79                 block_fini(vol->extents[i].svc_id);
     85                if (vol->extents[i].status != HR_EXT_MISSING)
     86                        block_fini(vol->extents[i].svc_id);
    8087}
    8188
     
    127134
    128135        errno_t rc;
    129         size_t i, bsize, last_bsize;
    130         uint64_t nblocks, last_nblocks;
     136        size_t i, bsize;
     137        uint64_t nblocks;
     138        size_t last_bsize = 0;
     139        uint64_t last_nblocks = 0;
    131140        uint64_t total_blocks = 0;
    132141
    133142        for (i = 0; i < vol->dev_no; i++) {
     143                if (vol->extents[i].status == HR_EXT_MISSING)
     144                        continue;
    134145                rc = block_get_nblocks(vol->extents[i].svc_id, &nblocks);
    135146                if (rc != EOK)
    136147                        goto error;
    137                 if (i != 0 && nblocks != last_nblocks) {
     148                if (last_nblocks != 0 && nblocks != last_nblocks) {
    138149                        log_msg(LOG_DEFAULT, LVL_ERROR,
    139150                            "number of blocks differs");
     
    146157
    147158        for (i = 0; i < vol->dev_no; i++) {
     159                if (vol->extents[i].status == HR_EXT_MISSING)
     160                        continue;
    148161                rc = block_get_bsize(vol->extents[i].svc_id, &bsize);
    149162                if (rc != EOK)
    150163                        goto error;
    151                 if (i != 0 && bsize != last_bsize) {
     164                if (last_bsize != 0 && bsize != last_bsize) {
    152165                        log_msg(LOG_DEFAULT, LVL_ERROR, "block sizes differ");
    153166                        rc = EINVAL;
     
    177190}
    178191
     192void hr_update_ext_status(hr_volume_t *vol, uint64_t extent, hr_ext_status_t s)
     193{
     194        log_msg(LOG_DEFAULT, LVL_WARN,
     195            "vol %s, changing extent: %lu, to status: %s",
     196            vol->devname, extent, hr_get_ext_status_msg(s));
     197        vol->extents[extent].status = s;
     198}
     199
    179200/** @}
    180201 */
  • uspace/srv/bd/hr/util.h

    r066fed9 re47a032  
    4444extern void hr_fini_devs(hr_volume_t *);
    4545extern errno_t hr_register_volume(hr_volume_t *);
    46 errno_t hr_check_devs(hr_volume_t *, uint64_t *, size_t *);
    47 errno_t hr_check_ba_range(hr_volume_t *, size_t, uint64_t);
    48 void hr_add_ba_offset(hr_volume_t *, uint64_t *);
     46extern errno_t hr_check_devs(hr_volume_t *, uint64_t *, size_t *);
     47extern errno_t hr_check_ba_range(hr_volume_t *, size_t, uint64_t);
     48extern void hr_add_ba_offset(hr_volume_t *, uint64_t *);
     49extern void hr_update_ext_status(hr_volume_t *, uint64_t, hr_ext_status_t);
    4950
    5051#endif
  • uspace/srv/bd/hr/var.h

    r066fed9 re47a032  
    6767        size_t dev_no;
    6868        hr_level_t level;
     69        hr_vol_status_t status;
    6970} hr_volume_t;
    7071
Note: See TracChangeset for help on using the changeset viewer.