Changeset f0360ec in mainline
- Timestamp:
- 2025-06-17T22:33:02Z (5 weeks ago)
- Children:
- f0cc1c64
- Parents:
- 3c518fc
- Location:
- uspace/srv/bd/hr
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/io.c
r3c518fc rf0360ec 48 48 #include "var.h" 49 49 50 static errno_t exec_io_op(hr_io_t *);51 52 50 /** Wrapper for block_write_direct(), never returns ENOMEM */ 53 51 errno_t hr_write_direct(service_id_t service_id, uint64_t ba, size_t cnt, … … 95 93 hr_io_t *io = arg; 96 94 97 errno_t rc = exec_io_op(io);98 99 /*100 * We don't have to invalidate extents who got ENOMEM 101 * on READ/SYNC. But when we get ENOMEM on a WRITE, we have102 * to invalidate it, because there could have been103 * other writes, there is no way to rollback.104 */105 if (rc != EOK && (rc != ENOMEM || io->type == HR_BD_WRITE))106 io->vol->hr_ops.ext_state_cb(io->vol, io->extent, rc);107 108 return rc;109 } 110 111 errno_t hr_io_worker_basic(void *arg) 112 { 113 hr_io_t *io = arg; 114 115 errno_t rc = exec_io_op(io);95 errno_t rc; 96 size_t e = io->extent; 97 hr_extent_t *extents = (hr_extent_t *)&io->vol->extents; 98 99 switch (io->type) { 100 case HR_BD_READ: 101 rc = hr_read_direct(extents[e].svc_id, io->ba, io->cnt, 102 io->data_read); 103 break; 104 case HR_BD_WRITE: 105 rc = hr_write_direct(extents[e].svc_id, io->ba, io->cnt, 106 io->data_write); 107 break; 108 default: 109 assert(0); 110 } 111 112 if (rc != EOK) 113 io->vol->hr_ops.ext_state_cb(io->vol, io->extent, rc); 116 114 117 115 return rc; … … 322 320 } 323 321 324 static errno_t exec_io_op(hr_io_t *io)325 {326 size_t ext_idx = io->extent;327 hr_extent_t *extents = (hr_extent_t *)&io->vol->extents;328 errno_t rc;329 330 const char *debug_type_str = NULL;331 switch (io->type) {332 case HR_BD_SYNC:333 debug_type_str = "SYNC";334 break;335 case HR_BD_READ:336 debug_type_str = "READ";337 break;338 case HR_BD_WRITE:339 debug_type_str = "WRITE";340 break;341 }342 343 HR_DEBUG("%s WORKER (%p) on extent: %zu, ba: %" PRIu64 ", "344 "cnt: %" PRIu64 "\n",345 debug_type_str, io, io->extent, io->ba, io->cnt);346 347 switch (io->type) {348 case HR_BD_SYNC:349 rc = block_sync_cache(extents[ext_idx].svc_id,350 io->ba, io->cnt);351 if (rc == ENOTSUP)352 rc = EOK;353 break;354 case HR_BD_READ:355 rc = block_read_direct(extents[ext_idx].svc_id, io->ba,356 io->cnt, io->data_read);357 break;358 case HR_BD_WRITE:359 rc = block_write_direct(extents[ext_idx].svc_id, io->ba,360 io->cnt, io->data_write);361 break;362 default:363 assert(0);364 }365 366 HR_DEBUG("WORKER (%p) rc: %s\n", io, str_error(rc));367 368 return rc;369 }370 371 322 /** @} 372 323 */ -
uspace/srv/bd/hr/io.h
r3c518fc rf0360ec 42 42 43 43 typedef struct hr_io { 44 hr_bd_op_type_t type; /* read/write /sync*/44 hr_bd_op_type_t type; /* read/write */ 45 45 uint64_t ba; 46 46 uint64_t cnt; … … 67 67 68 68 extern errno_t hr_io_worker(void *); 69 extern errno_t hr_io_worker_basic(void *);70 69 71 70 extern errno_t hr_io_raid5_basic_reader(void *); -
uspace/srv/bd/hr/raid0.c
r3c518fc rf0360ec 280 280 281 281 hr_fgroup_t *group = hr_fgroup_create(vol->fge, span); 282 if (group == NULL)283 return ENOMEM;284 282 285 283 while (left != 0) { … … 316 314 317 315 size_t bad; 318 rc = hr_fgroup_wait(group, NULL, &bad); 319 if (rc == ENOMEM && type == HR_BD_READ) 320 return ENOMEM; 316 (void)hr_fgroup_wait(group, NULL, &bad); 321 317 322 318 if (bad > 0) -
uspace/srv/bd/hr/raid1.c
r3c518fc rf0360ec 174 174 175 175 switch (rc) { 176 case ENOMEM:177 hr_update_ext_state(vol, extent, HR_EXT_INVALID);178 break;179 176 case ENOENT: 180 177 hr_update_ext_state(vol, extent, HR_EXT_MISSING); … … 372 369 } 373 370 374 rc = block_read_direct(vol->extents[i].svc_id, ba, cnt,371 rc = hr_read_direct(vol->extents[i].svc_id, ba, cnt, 375 372 data_read); 376 377 if (rc == ENOMEM && i + 1 == vol->extent_no)378 goto end;379 380 if (rc == ENOMEM)381 continue;382 383 373 if (rc != EOK) { 384 374 hr_raid1_ext_state_cb(vol, i, rc); … … 389 379 } 390 380 break; 391 case HR_BD_SYNC:392 381 case HR_BD_WRITE: 393 if (type == HR_BD_WRITE) { 394 rl = hr_range_lock_acquire(vol, ba, cnt); 395 if (rl == NULL) { 396 rc = ENOMEM; 397 goto end; 398 } 399 } 382 rl = hr_range_lock_acquire(vol, ba, cnt); 400 383 401 384 fibril_rwlock_read_lock(&vol->states_lock); … … 408 391 409 392 hr_fgroup_t *group = hr_fgroup_create(vol->fge, good); 410 if (group == NULL) {411 if (type == HR_BD_WRITE)412 hr_range_lock_release(rl);413 rc = ENOMEM;414 fibril_rwlock_read_unlock(&vol->states_lock);415 goto end;416 }417 393 418 394 for (i = 0; i < vol->extent_no; i++) { … … 446 422 (void)hr_fgroup_wait(group, &successful, NULL); 447 423 448 if (type == HR_BD_WRITE) 449 hr_range_lock_release(rl); 424 hr_range_lock_release(rl); 450 425 451 426 break; 452 427 default: 453 rc = EINVAL; 454 goto end; 428 assert(0); 455 429 } 456 430 … … 460 434 rc = EIO; 461 435 462 end:463 436 fibril_rwlock_read_unlock(&vol->extents_lock); 464 437 -
uspace/srv/bd/hr/raid5.c
r3c518fc rf0360ec 180 180 181 181 switch (rc) { 182 case ENOMEM:183 hr_update_ext_state(vol, extent, HR_EXT_INVALID);184 break;185 182 case ENOENT: 186 183 hr_update_ext_state(vol, extent, HR_EXT_MISSING); -
uspace/srv/bd/hr/util.c
r3c518fc rf0360ec 524 524 uint64_t cnt) 525 525 { 526 hr_range_lock_t *rl = malloc(sizeof(hr_range_lock_t)); 527 if (rl == NULL) 528 return NULL; 526 hr_range_lock_t *rl = malloc_waitok(sizeof(hr_range_lock_t)); 529 527 530 528 return hr_range_lock_acquire_internal(rl, vol, ba, cnt);
Note:
See TracChangeset
for help on using the changeset viewer.