Changeset f0360ec in mainline


Ignore:
Timestamp:
2025-06-17T22:33:02Z (5 weeks ago)
Author:
Miroslav Cimerman <mc@…>
Children:
f0cc1c64
Parents:
3c518fc
Message:

hr: RAID 0, 1: use ENOMEM safe primitives

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

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/io.c

    r3c518fc rf0360ec  
    4848#include "var.h"
    4949
    50 static errno_t exec_io_op(hr_io_t *);
    51 
    5250/** Wrapper for block_write_direct(), never returns ENOMEM */
    5351errno_t hr_write_direct(service_id_t service_id, uint64_t ba, size_t cnt,
     
    9593        hr_io_t *io = arg;
    9694
    97         errno_t rc = exec_io_op(io);
    98 
    99         /*
    100          * We don't have to invalidate extents who got ENOMEM
    101          * on READ/SYNC. But when we get ENOMEM on a WRITE, we have
    102          * to invalidate it, because there could have been
    103          * other writes, there is no way to rollback.
    104          */
    105         if (rc != EOK && (rc != ENOMEM || io->type == HR_BD_WRITE))
    106                 io->vol->hr_ops.ext_state_cb(io->vol, io->extent, rc);
    107 
    108         return rc;
    109 }
    110 
    111 errno_t hr_io_worker_basic(void *arg)
    112 {
    113         hr_io_t *io = arg;
    114 
    115         errno_t rc = exec_io_op(io);
     95        errno_t rc;
     96        size_t e = io->extent;
     97        hr_extent_t *extents = (hr_extent_t *)&io->vol->extents;
     98
     99        switch (io->type) {
     100        case HR_BD_READ:
     101                rc = hr_read_direct(extents[e].svc_id, io->ba, io->cnt,
     102                    io->data_read);
     103                break;
     104        case HR_BD_WRITE:
     105                rc = hr_write_direct(extents[e].svc_id, io->ba, io->cnt,
     106                    io->data_write);
     107                break;
     108        default:
     109                assert(0);
     110        }
     111
     112        if (rc != EOK)
     113                io->vol->hr_ops.ext_state_cb(io->vol, io->extent, rc);
    116114
    117115        return rc;
     
    322320}
    323321
    324 static errno_t exec_io_op(hr_io_t *io)
    325 {
    326         size_t ext_idx = io->extent;
    327         hr_extent_t *extents = (hr_extent_t *)&io->vol->extents;
    328         errno_t rc;
    329 
    330         const char *debug_type_str = NULL;
    331         switch (io->type) {
    332         case HR_BD_SYNC:
    333                 debug_type_str = "SYNC";
    334                 break;
    335         case HR_BD_READ:
    336                 debug_type_str = "READ";
    337                 break;
    338         case HR_BD_WRITE:
    339                 debug_type_str = "WRITE";
    340                 break;
    341         }
    342 
    343         HR_DEBUG("%s WORKER (%p) on extent: %zu, ba: %" PRIu64 ", "
    344             "cnt: %" PRIu64 "\n",
    345             debug_type_str, io, io->extent, io->ba, io->cnt);
    346 
    347         switch (io->type) {
    348         case HR_BD_SYNC:
    349                 rc = block_sync_cache(extents[ext_idx].svc_id,
    350                     io->ba, io->cnt);
    351                 if (rc == ENOTSUP)
    352                         rc = EOK;
    353                 break;
    354         case HR_BD_READ:
    355                 rc = block_read_direct(extents[ext_idx].svc_id, io->ba,
    356                     io->cnt, io->data_read);
    357                 break;
    358         case HR_BD_WRITE:
    359                 rc = block_write_direct(extents[ext_idx].svc_id, io->ba,
    360                     io->cnt, io->data_write);
    361                 break;
    362         default:
    363                 assert(0);
    364         }
    365 
    366         HR_DEBUG("WORKER (%p) rc: %s\n", io, str_error(rc));
    367 
    368         return rc;
    369 }
    370 
    371322/** @}
    372323 */
  • uspace/srv/bd/hr/io.h

    r3c518fc rf0360ec  
    4242
    4343typedef struct hr_io {
    44         hr_bd_op_type_t type; /* read/write/sync */
     44        hr_bd_op_type_t type; /* read/write */
    4545        uint64_t ba;
    4646        uint64_t cnt;
     
    6767
    6868extern errno_t hr_io_worker(void *);
    69 extern errno_t hr_io_worker_basic(void *);
    7069
    7170extern errno_t hr_io_raid5_basic_reader(void *);
  • uspace/srv/bd/hr/raid0.c

    r3c518fc rf0360ec  
    280280
    281281        hr_fgroup_t *group = hr_fgroup_create(vol->fge, span);
    282         if (group == NULL)
    283                 return ENOMEM;
    284282
    285283        while (left != 0) {
     
    316314
    317315        size_t bad;
    318         rc = hr_fgroup_wait(group, NULL, &bad);
    319         if (rc == ENOMEM && type == HR_BD_READ)
    320                 return ENOMEM;
     316        (void)hr_fgroup_wait(group, NULL, &bad);
    321317
    322318        if (bad > 0)
  • uspace/srv/bd/hr/raid1.c

    r3c518fc rf0360ec  
    174174
    175175        switch (rc) {
    176         case ENOMEM:
    177                 hr_update_ext_state(vol, extent, HR_EXT_INVALID);
    178                 break;
    179176        case ENOENT:
    180177                hr_update_ext_state(vol, extent, HR_EXT_MISSING);
     
    372369                        }
    373370
    374                         rc = block_read_direct(vol->extents[i].svc_id, ba, cnt,
     371                        rc = hr_read_direct(vol->extents[i].svc_id, ba, cnt,
    375372                            data_read);
    376 
    377                         if (rc == ENOMEM && i + 1 == vol->extent_no)
    378                                 goto end;
    379 
    380                         if (rc == ENOMEM)
    381                                 continue;
    382 
    383373                        if (rc != EOK) {
    384374                                hr_raid1_ext_state_cb(vol, i, rc);
     
    389379                }
    390380                break;
    391         case HR_BD_SYNC:
    392381        case HR_BD_WRITE:
    393                 if (type == HR_BD_WRITE) {
    394                         rl = hr_range_lock_acquire(vol, ba, cnt);
    395                         if (rl == NULL) {
    396                                 rc = ENOMEM;
    397                                 goto end;
    398                         }
    399                 }
     382                rl = hr_range_lock_acquire(vol, ba, cnt);
    400383
    401384                fibril_rwlock_read_lock(&vol->states_lock);
     
    408391
    409392                hr_fgroup_t *group = hr_fgroup_create(vol->fge, good);
    410                 if (group == NULL) {
    411                         if (type == HR_BD_WRITE)
    412                                 hr_range_lock_release(rl);
    413                         rc = ENOMEM;
    414                         fibril_rwlock_read_unlock(&vol->states_lock);
    415                         goto end;
    416                 }
    417393
    418394                for (i = 0; i < vol->extent_no; i++) {
     
    446422                (void)hr_fgroup_wait(group, &successful, NULL);
    447423
    448                 if (type == HR_BD_WRITE)
    449                         hr_range_lock_release(rl);
     424                hr_range_lock_release(rl);
    450425
    451426                break;
    452427        default:
    453                 rc = EINVAL;
    454                 goto end;
     428                assert(0);
    455429        }
    456430
     
    460434                rc = EIO;
    461435
    462 end:
    463436        fibril_rwlock_read_unlock(&vol->extents_lock);
    464437
  • uspace/srv/bd/hr/raid5.c

    r3c518fc rf0360ec  
    180180
    181181        switch (rc) {
    182         case ENOMEM:
    183                 hr_update_ext_state(vol, extent, HR_EXT_INVALID);
    184                 break;
    185182        case ENOENT:
    186183                hr_update_ext_state(vol, extent, HR_EXT_MISSING);
  • uspace/srv/bd/hr/util.c

    r3c518fc rf0360ec  
    524524    uint64_t cnt)
    525525{
    526         hr_range_lock_t *rl = malloc(sizeof(hr_range_lock_t));
    527         if (rl == NULL)
    528                 return NULL;
     526        hr_range_lock_t *rl = malloc_waitok(sizeof(hr_range_lock_t));
    529527
    530528        return hr_range_lock_acquire_internal(rl, vol, ba, cnt);
Note: See TracChangeset for help on using the changeset viewer.