Changeset e47a032 in mainline for uspace/srv/bd


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

hr: base for status handling

Location:
uspace/srv/bd/hr
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • 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.