Changeset d1d355f in mainline for uspace/srv/bd/hr/util.c
- Timestamp:
- 2025-05-06T21:30:30Z (5 weeks ago)
- Children:
- c2f0160
- Parents:
- 40f56a4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/util.c
r40f56a4 rd1d355f 162 162 void hr_destroy_vol_struct(hr_volume_t *vol) 163 163 { 164 HR_DEBUG("%s()", __func__); 165 164 166 if (vol == NULL) 165 167 return; … … 173 175 hr_volume_t *hr_get_volume(service_id_t svc_id) 174 176 { 175 HR_DEBUG(" hr_get_volume(): (%" PRIun ")\n", svc_id);177 HR_DEBUG("%s()", __func__); 176 178 177 179 hr_volume_t *rvol = NULL; … … 189 191 } 190 192 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; 193 errno_t hr_remove_volume(hr_volume_t *vol) 194 { 195 HR_DEBUG("%s()", __func__); 196 196 197 197 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); 224 214 225 215 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; 227 228 } 228 229 … … 836 837 goto error; 837 838 838 fibril_rwlock_write_lock(&hr_volumes_lock);839 840 839 /* 841 840 * XXX: register it here … … 852 851 */ 853 852 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; 858 855 859 856 (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 860 857 858 fibril_rwlock_write_lock(&hr_volumes_lock); 861 859 list_append(&vol->lvolumes, &hr_volumes); 862 863 860 fibril_rwlock_write_unlock(&hr_volumes_lock); 861 862 HR_NOTE("assembled volume \"%s\"\n", vol->devname); 864 863 865 864 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.