Changeset 9d1685b in mainline


Ignore:
Timestamp:
2025-06-17T14:14:09Z (6 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
a3486f2
Parents:
b22ea202
Message:

hr: ENOMEM safe wrappers for block_direct_* ops

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

Legend:

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

    rb22ea202 r9d1685b  
    327327                        fibril_mutex_lock(&group->lock);
    328328                        group->finished_fail++;
    329                         if (rc == ENOMEM)
    330                                 group->final_errno = ENOMEM;
     329                        if (rc == EAGAIN)
     330                                group->final_errno = EAGAIN;
    331331                        fibril_mutex_unlock(&group->lock);
    332332                }
  • uspace/srv/bd/hr/io.c

    rb22ea202 r9d1685b  
    4646
    4747static errno_t exec_io_op(hr_io_t *);
     48
     49/** Wrapper for block_write_direct(), never returns ENOMEM */
     50errno_t hr_write_direct(service_id_t service_id, uint64_t ba, size_t cnt,
     51    const void *data)
     52{
     53        errno_t rc;
     54        while ((rc = block_write_direct(service_id, ba, cnt, data)) == ENOMEM)
     55                fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
     56
     57        if (rc == EAGAIN)
     58                rc = EIO;
     59
     60        return rc;
     61}
     62
     63/** Wrapper for block_read_direct(), never returns ENOMEM */
     64errno_t hr_read_direct(service_id_t service_id, uint64_t ba, size_t cnt,
     65    void *data)
     66{
     67        errno_t rc;
     68        while ((rc = block_read_direct(service_id, ba, cnt, data)) == ENOMEM)
     69                fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
     70
     71        if (rc == EAGAIN)
     72                rc = EIO;
     73
     74        return rc;
     75}
     76
     77/** Wrapper for block_sync_cache(), never returns ENOMEM */
     78errno_t hr_sync_cache(service_id_t service_id, uint64_t ba, size_t cnt)
     79{
     80        errno_t rc;
     81        while ((rc = block_sync_cache(service_id, ba, cnt)) == ENOMEM)
     82                fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
     83
     84        if (rc == EAGAIN)
     85                rc = EIO;
     86
     87        return rc;
     88}
    4889
    4990errno_t hr_io_worker(void *arg)
  • uspace/srv/bd/hr/io.h

    rb22ea202 r9d1685b  
    5252errno_t hr_io_worker_basic(void *);
    5353
     54extern errno_t hr_write_direct(service_id_t, uint64_t, size_t, const void *);
     55extern errno_t hr_read_direct(service_id_t, uint64_t, size_t, void *);
     56extern errno_t hr_sync_cache(service_id_t, uint64_t, size_t);
     57
    5458#endif
    5559
Note: See TracChangeset for help on using the changeset viewer.