Changeset 800d188 in mainline
- Timestamp:
- 2025-04-15T07:00:31Z (2 months ago)
- Children:
- 29e7cc7
- Parents:
- ca7fa5b
- git-author:
- Miroslav Cimerman <mc@…> (2025-04-15 06:55:25)
- git-committer:
- Miroslav Cimerman <mc@…> (2025-04-15 07:00:31)
- Location:
- uspace/srv/bd/hr
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/hr.c
rca7fa5b r800d188 146 146 goto error; 147 147 148 rc = hr_metadata_save(new_volume);149 if (rc != EOK)150 goto error;151 152 148 rc = new_volume->hr_ops.create(new_volume); 149 if (rc != EOK) 150 goto error; 151 152 rc = hr_metadata_save(new_volume, WITH_STATE_CALLBACK); 153 153 if (rc != EOK) 154 154 goto error; -
uspace/srv/bd/hr/io.c
rca7fa5b r800d188 45 45 #include "var.h" 46 46 47 static errno_t exec_io_op(hr_io_t *); 48 47 49 errno_t hr_io_worker(void *arg) 48 50 { 49 51 hr_io_t *io = arg; 52 53 errno_t rc = exec_io_op(io); 54 55 /* 56 * We don't have to invalidate extents who got ENOMEM 57 * on READ/SYNC. But when we get ENOMEM on a WRITE, we have 58 * to invalidate it, because there could have been 59 * other writes, there is no way to rollback. 60 */ 61 if (rc != EOK && (rc != ENOMEM || io->type == HR_BD_WRITE)) 62 io->vol->state_callback(io->vol, io->extent, rc); 63 64 return rc; 65 } 66 67 errno_t hr_io_worker_basic(void *arg) 68 { 69 hr_io_t *io = arg; 70 71 errno_t rc = exec_io_op(io); 72 73 return rc; 74 } 75 76 static errno_t exec_io_op(hr_io_t *io) 77 { 78 size_t ext_idx = io->extent; 50 79 hr_extent_t *extents = (hr_extent_t *)&io->vol->extents; 51 size_t ext_idx = io->extent;52 80 errno_t rc; 53 81 … … 90 118 HR_DEBUG("WORKER (%p) rc: %s\n", io, str_error(rc)); 91 119 92 /*93 * We don't have to invalidate extents who got ENOMEM94 * on READ/SYNC. But when we get ENOMEM on a WRITE, we have95 * to invalidate it, because there could have been96 * other writes, there is no way to rollback.97 */98 if (rc != EOK && (rc != ENOMEM || io->type == HR_BD_WRITE))99 io->state_callback(io->vol, io->extent, rc);100 101 120 return rc; 102 121 } -
uspace/srv/bd/hr/io.h
rca7fa5b r800d188 47 47 const void *data_write; 48 48 hr_volume_t *vol; 49 void (*state_callback)(hr_volume_t *, size_t, errno_t);50 49 } hr_io_t; 51 50 52 51 errno_t hr_io_worker(void *); 52 errno_t hr_io_worker_basic(void *); 53 53 54 54 #endif -
uspace/srv/bd/hr/raid0.c
rca7fa5b r800d188 54 54 55 55 static void hr_raid0_update_vol_status(hr_volume_t *); 56 static void raid0_state_callback(hr_volume_t *, size_t, errno_t);56 static void hr_raid0_state_callback(hr_volume_t *, size_t, errno_t); 57 57 static errno_t hr_raid0_bd_op(hr_bd_op_type_t, bd_srv_t *, aoff64_t, size_t, 58 58 void *, const void *, size_t); … … 100 100 new_volume->hr_bds.sarg = new_volume; 101 101 102 new_volume->state_callback = hr_raid0_state_callback; 103 102 104 return EOK; 103 105 } … … 196 198 static void hr_raid0_update_vol_status(hr_volume_t *vol) 197 199 { 200 fibril_mutex_lock(&vol->md_lock); 201 202 /* XXX: will be wrapped in md specific fcn ptrs */ 203 vol->in_mem_md->counter++; 204 205 fibril_mutex_unlock(&vol->md_lock); 206 198 207 fibril_rwlock_read_lock(&vol->states_lock); 199 208 … … 221 230 } 222 231 223 static void raid0_state_callback(hr_volume_t *vol, size_t extent, errno_t rc)232 static void hr_raid0_state_callback(hr_volume_t *vol, size_t extent, errno_t rc) 224 233 { 225 234 if (rc == EOK) … … 272 281 io->type = type; 273 282 io->vol = vol; 274 io->state_callback = raid0_state_callback;275 283 276 284 hr_fgroup_submit(group, hr_io_worker, io); … … 326 334 io->type = type; 327 335 io->vol = vol; 328 io->state_callback = raid0_state_callback;329 336 330 337 hr_fgroup_submit(group, hr_io_worker, io); -
uspace/srv/bd/hr/raid1.c
rca7fa5b r800d188 105 105 new_volume->hr_bds.sarg = new_volume; 106 106 107 new_volume->state_callback = hr_raid1_ext_state_callback; 108 107 109 /* force volume state update */ 108 110 hr_mark_vol_state_dirty(new_volume); … … 222 224 if (!atomic_compare_exchange_strong(&vol->state_dirty, &exp, false)) 223 225 return; 226 227 fibril_mutex_lock(&vol->md_lock); 228 229 /* XXX: will be wrapped in md specific fcn ptrs */ 230 vol->in_mem_md->counter++; 231 232 fibril_mutex_unlock(&vol->md_lock); 224 233 225 234 fibril_rwlock_read_lock(&vol->extents_lock); … … 247 256 248 257 if (old_state != HR_VOL_REBUILD) { 258 /* XXX: allow REBUILD on INVALID extents */ 249 259 if (vol->hotspare_no > 0) { 250 260 fid_t fib = fibril_create(hr_raid1_rebuild, … … 427 437 io->type = type; 428 438 io->vol = vol; 429 io->state_callback = hr_raid1_ext_state_callback;430 439 431 440 hr_fgroup_submit(group, hr_io_worker, io); … … 541 550 fibril_rwlock_write_unlock(&vol->states_lock); 542 551 543 rc = hr_metadata_save(vol );552 rc = hr_metadata_save(vol, WITH_STATE_CALLBACK); 544 553 545 554 end: … … 576 585 fibril_mutex_lock(&vol->hotspare_lock); 577 586 587 /* XXX: allow REBUILD on INVALID extents */ 578 588 if (vol->hotspare_no == 0) { 579 589 HR_WARN("hr_raid1_rebuild(): no free hotspares on \"%s\", " -
uspace/srv/bd/hr/raid5.c
rca7fa5b r800d188 845 845 hr_update_ext_status(vol, bad, HR_EXT_ONLINE); 846 846 847 rc = hr_metadata_save(vol );847 rc = hr_metadata_save(vol, WITH_STATE_CALLBACK); 848 848 849 849 end: -
uspace/srv/bd/hr/superblock.c
rca7fa5b r800d188 88 88 89 89 /* 90 * TODO: think about thread safety, if hr_metadata_save() can91 * be called from multiple threads, and if, maybe will need92 * md_lock... or whatever, but dont want to stall I/Os...93 */ 94 errno_t hr_metadata_save(hr_volume_t *vol )90 * XXX: finish this fcn documentation 91 * 92 * Returns ENOMEM else EOK 93 */ 94 errno_t hr_metadata_save(hr_volume_t *vol, bool with_state_callback) 95 95 { 96 96 HR_DEBUG("%s()", __func__); … … 102 102 return ENOMEM; 103 103 104 fibril_rwlock_read_lock(&vol->extents_lock); 105 106 fibril_mutex_lock(&vol->md_lock); 107 104 108 for (size_t i = 0; i < vol->extent_no; i++) { 105 109 hr_extent_t *ext = &vol->extents[i]; 110 111 fibril_rwlock_read_lock(&vol->states_lock); 106 112 107 113 /* TODO: special case for REBUILD */ … … 109 115 continue; 110 116 117 fibril_rwlock_read_unlock(&vol->states_lock); 118 111 119 vol->in_mem_md->index = i; 112 120 hr_encode_metadata_to_block(vol->in_mem_md, md_block); 113 121 rc = hr_write_metadata_block(ext->svc_id, md_block); 114 /* 115 * XXX: here maybe call vol status event or the state 116 * callback inside, same with read_block... 117 * 118 * also think about using FGE here... maybe a bit more 119 * code, but faster and gratis state callback :-) 120 */ 121 if (rc != EOK) 122 goto error; 122 if (with_state_callback && rc != EOK) 123 vol->state_callback(vol, i, rc); 123 124 } 124 125 125 error: 126 fibril_mutex_unlock(&vol->md_lock); 127 128 fibril_rwlock_read_unlock(&vol->extents_lock); 129 130 if (with_state_callback) 131 vol->hr_ops.status_event(vol); 132 126 133 free(md_block); 127 return rc;134 return EOK; 128 135 } 129 136 … … 161 168 162 169 rc = block_write_direct(dev, blkno - 1, HR_META_SIZE, block); 163 /*164 * XXX: here maybe call vol status event or the state callback...165 *166 * but need to pass vol pointer167 */168 170 169 171 return rc; -
uspace/srv/bd/hr/superblock.h
rca7fa5b r800d188 80 80 81 81 extern errno_t hr_metadata_init(hr_volume_t *, hr_metadata_t *); 82 extern errno_t hr_metadata_save(hr_volume_t * );82 extern errno_t hr_metadata_save(hr_volume_t *, bool); 83 83 extern errno_t hr_write_metadata_block(service_id_t, const void *); 84 84 extern errno_t hr_get_metadata_block(service_id_t, void **); -
uspace/srv/bd/hr/util.c
rca7fa5b r800d188 145 145 fibril_mutex_initialize(&vol->lock); /* XXX: will remove this */ 146 146 147 fibril_mutex_initialize(&vol->md_lock); 148 147 149 fibril_rwlock_initialize(&vol->extents_lock); 148 150 fibril_rwlock_initialize(&vol->states_lock); … … 219 221 fibril_rwlock_write_unlock(&hr_volumes_lock); 220 222 223 hr_metadata_save(vol, NO_STATE_CALLBACK); 224 221 225 hr_destroy_vol_struct(vol); 222 226 … … 843 847 vol->in_mem_md->counter++; 844 848 845 hr_metadata_save(vol);846 847 849 rc = vol->hr_ops.create(vol); 848 850 if (rc != EOK) 849 851 goto error; 852 853 hr_metadata_save(vol, WITH_STATE_CALLBACK); 850 854 851 855 fibril_rwlock_write_lock(&hr_volumes_lock); -
uspace/srv/bd/hr/var.h
rca7fa5b r800d188 83 83 84 84 hr_metadata_t *in_mem_md; 85 fibril_mutex_t md_lock; /* lock protecting in_mem_md */ 85 86 86 87 /* invariants */ … … 111 112 _Atomic int open_cnt; /* open/close() counter */ 112 113 hr_vol_status_t status; /* volume status */ 114 void (*state_callback)(hr_volume_t *, size_t, errno_t); 113 115 } hr_volume_t; 114 116 … … 118 120 HR_BD_WRITE 119 121 } hr_bd_op_type_t; 122 123 /* macros for hr_metadata_save() */ 124 #define WITH_STATE_CALLBACK true 125 #define NO_STATE_CALLBACK false 120 126 121 127 typedef struct hr_range_lock {
Note:
See TracChangeset
for help on using the changeset viewer.