Changeset 7fba146 in mainline for uspace/srv/bd/hr/raid1.c
- Timestamp:
- 2025-06-09T23:41:50Z (2 weeks ago)
- Children:
- 6791fbf
- Parents:
- 83ff12f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/raid1.c
r83ff12f r7fba146 56 56 #include "var.h" 57 57 58 static void hr_raid1_vol_state_eval_forced(hr_volume_t *); 58 59 static size_t hr_raid1_count_good_extents(hr_volume_t *, uint64_t, size_t, 59 60 uint64_t); … … 105 106 new_volume->hr_bds.sarg = new_volume; 106 107 107 /* force volume state update */ 108 hr_mark_vol_state_dirty(new_volume); 109 hr_raid1_vol_state_eval(new_volume); 108 hr_raid1_vol_state_eval_forced(new_volume); 110 109 111 110 fibril_rwlock_read_lock(&new_volume->states_lock); … … 155 154 bool exp = true; 156 155 157 /* TODO: could also wrap this */158 156 if (!atomic_compare_exchange_strong(&vol->state_dirty, &exp, false)) 159 157 return; 160 158 161 fibril_mutex_lock(&vol->md_lock); 162 163 vol->meta_ops->inc_counter(vol->in_mem_md); 164 /* XXX: save right away */ 165 166 fibril_mutex_unlock(&vol->md_lock); 159 vol->meta_ops->inc_counter(vol); 160 (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 161 162 hr_raid1_vol_state_eval_forced(vol); 163 } 164 165 void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent, 166 errno_t rc) 167 { 168 HR_DEBUG("%s()", __func__); 169 170 if (rc == EOK) 171 return; 172 173 assert(fibril_rwlock_is_locked(&vol->extents_lock)); 174 175 fibril_rwlock_write_lock(&vol->states_lock); 176 177 switch (rc) { 178 case ENOMEM: 179 hr_update_ext_state(vol, extent, HR_EXT_INVALID); 180 break; 181 case ENOENT: 182 hr_update_ext_state(vol, extent, HR_EXT_MISSING); 183 break; 184 default: 185 hr_update_ext_state(vol, extent, HR_EXT_FAILED); 186 } 187 188 hr_mark_vol_state_dirty(vol); 189 190 fibril_rwlock_write_unlock(&vol->states_lock); 191 } 192 193 static void hr_raid1_vol_state_eval_forced(hr_volume_t *vol) 194 { 195 HR_DEBUG("%s()", __func__); 167 196 168 197 fibril_rwlock_read_lock(&vol->extents_lock); … … 209 238 } 210 239 211 void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent,212 errno_t rc)213 {214 HR_DEBUG("%s()", __func__);215 216 if (rc == EOK)217 return;218 219 assert(fibril_rwlock_is_locked(&vol->extents_lock));220 221 fibril_rwlock_write_lock(&vol->states_lock);222 223 switch (rc) {224 case ENOMEM:225 hr_update_ext_state(vol, extent, HR_EXT_INVALID);226 break;227 case ENOENT:228 hr_update_ext_state(vol, extent, HR_EXT_MISSING);229 break;230 default:231 hr_update_ext_state(vol, extent, HR_EXT_FAILED);232 }233 234 hr_mark_vol_state_dirty(vol);235 236 fibril_rwlock_write_unlock(&vol->states_lock);237 }238 239 240 static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd) 240 241 { … … 328 329 if (vol_state == HR_VOL_FAULTY || vol_state == HR_VOL_NONE) 329 330 return EIO; 331 332 if (!vol->data_dirty && type == HR_BD_WRITE) { 333 vol->meta_ops->inc_counter(vol); 334 vol->data_dirty = true; 335 } 330 336 331 337 if (type == HR_BD_READ || type == HR_BD_WRITE) … … 543 549 fibril_rwlock_write_unlock(&vol->states_lock); 544 550 545 rc =vol->meta_ops->save(vol, WITH_STATE_CALLBACK);551 (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 546 552 547 553 end:
Note:
See TracChangeset
for help on using the changeset viewer.