Changeset d1d355f in mainline for uspace/srv/bd/hr/util.c


Ignore:
Timestamp:
2025-05-06T21:30:30Z (5 weeks ago)
Author:
Miroslav Cimerman <mc@…>
Children:
c2f0160
Parents:
40f56a4
Message:

hr: refactor hrctl and some hr IPC methods

File:
1 edited

Legend:

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

    r40f56a4 rd1d355f  
    162162void hr_destroy_vol_struct(hr_volume_t *vol)
    163163{
     164        HR_DEBUG("%s()", __func__);
     165
    164166        if (vol == NULL)
    165167                return;
     
    173175hr_volume_t *hr_get_volume(service_id_t svc_id)
    174176{
    175         HR_DEBUG("hr_get_volume(): (%" PRIun ")\n", svc_id);
     177        HR_DEBUG("%s()", __func__);
    176178
    177179        hr_volume_t *rvol = NULL;
     
    189191}
    190192
    191 errno_t hr_remove_volume(service_id_t svc_id)
    192 {
    193         HR_DEBUG("hr_remove_volume(): (%" PRIun ")\n", svc_id);
    194 
    195         errno_t rc;
     193errno_t hr_remove_volume(hr_volume_t *vol)
     194{
     195        HR_DEBUG("%s()", __func__);
    196196
    197197        fibril_rwlock_write_lock(&hr_volumes_lock);
    198         list_foreach(hr_volumes, lvolumes, hr_volume_t, vol) {
    199                 if (vol->svc_id == svc_id) {
    200                         int open_cnt = atomic_load_explicit(&vol->open_cnt,
    201                             memory_order_relaxed);
    202                         /*
    203                          * The "atomicity" of this if condition is provided
    204                          * by the write lock - no new bd connection can
    205                          * come, because we need to get the bd_srvs_t from
    206                          * volume, which we get from the list.
    207                          * (see hr_client_conn() in hr.c)
    208                          */
    209                         if (open_cnt > 0) {
    210                                 fibril_rwlock_write_unlock(&hr_volumes_lock);
    211                                 return EBUSY;
    212                         }
    213                         list_remove(&vol->lvolumes);
    214                         fibril_rwlock_write_unlock(&hr_volumes_lock);
    215 
    216                         vol->meta_ops->save(vol, NO_STATE_CALLBACK);
    217 
    218                         hr_destroy_vol_struct(vol);
    219 
    220                         rc = loc_service_unregister(hr_srv, svc_id);
    221                         return rc;
    222                 }
    223         }
     198
     199        int open_cnt = atomic_load_explicit(&vol->open_cnt,
     200            memory_order_relaxed);
     201        /*
     202         * The atomicity of this if condition (and this whole
     203         * operation) is provided by the write lock - no new
     204         * bd connection can come, because we need to get the
     205         * bd_srvs_t from the volume, which we get from the list.
     206         * (see hr_client_conn() in hr.c)
     207         */
     208        if (open_cnt > 0) {
     209                fibril_rwlock_write_unlock(&hr_volumes_lock);
     210                return EBUSY;
     211        }
     212
     213        list_remove(&vol->lvolumes);
    224214
    225215        fibril_rwlock_write_unlock(&hr_volumes_lock);
    226         return ENOENT;
     216
     217        /* save metadata, but we don't care about states anymore */
     218        (void)vol->meta_ops->save(vol, NO_STATE_CALLBACK);
     219
     220        service_id_t svc_id = vol->svc_id;
     221
     222        HR_NOTE("deactivating volume \"%s\"\n", vol->devname);
     223
     224        hr_destroy_vol_struct(vol);
     225
     226        errno_t rc = loc_service_unregister(hr_srv, svc_id);
     227        return rc;
    227228}
    228229
     
    836837                goto error;
    837838
    838         fibril_rwlock_write_lock(&hr_volumes_lock);
    839 
    840839        /*
    841840         * XXX: register it here
     
    852851         */
    853852        rc = hr_register_volume(vol);
    854         if (rc != EOK) {
    855                 fibril_rwlock_write_unlock(&hr_volumes_lock);
    856                 goto error;
    857         }
     853        if (rc != EOK)
     854                goto error;
    858855
    859856        (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK);
    860857
     858        fibril_rwlock_write_lock(&hr_volumes_lock);
    861859        list_append(&vol->lvolumes, &hr_volumes);
    862 
    863860        fibril_rwlock_write_unlock(&hr_volumes_lock);
     861
     862        HR_NOTE("assembled volume \"%s\"\n", vol->devname);
    864863
    865864        return EOK;
Note: See TracChangeset for help on using the changeset viewer.