Changeset 733564a in mainline for uspace/srv/bd/hr/raid5.c
- Timestamp:
- 2024-11-15T16:44:25Z (8 months ago)
- Children:
- b235c67
- Parents:
- 5d96f427
- git-author:
- Miroslav Cimerman <mc@…> (2024-11-15 16:27:17)
- git-committer:
- Miroslav Cimerman <mc@…> (2024-11-15 16:44:25)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/raid5.c
r5d96f427 r733564a 55 55 extern loc_srv_t *hr_srv; 56 56 57 static errno_t hr_raid5_vol_usable(hr_volume_t *); 58 static ssize_t hr_raid5_get_bad_ext(hr_volume_t *); 59 static errno_t hr_raid5_update_vol_status(hr_volume_t *); 60 static void xor(void *, const void *, size_t); 61 static errno_t hr_raid5_read_degraded(hr_volume_t *, uint64_t, uint64_t, 62 void *, size_t); 63 static errno_t hr_raid5_write(hr_volume_t *, uint64_t, uint64_t, aoff64_t, 64 const void *, size_t); 65 static errno_t hr_raid5_write_parity(hr_volume_t *, uint64_t, uint64_t, 66 uint64_t, const void *, size_t); 67 static errno_t hr_raid5_bd_op(hr_bd_op_type_t, bd_srv_t *, aoff64_t, size_t, 68 void *, const void *, size_t); 69 70 /* bdops */ 57 71 static errno_t hr_raid5_bd_open(bd_srvs_t *, bd_srv_t *); 58 72 static errno_t hr_raid5_bd_close(bd_srv_t *); … … 65 79 static errno_t hr_raid5_bd_get_num_blocks(bd_srv_t *, aoff64_t *); 66 80 67 static errno_t hr_raid5_write_parity(hr_volume_t *, uint64_t, uint64_t,68 uint64_t, const void *, size_t);69 70 81 static bd_ops_t hr_raid5_bd_ops = { 71 82 .open = hr_raid5_bd_open, … … 77 88 .get_num_blocks = hr_raid5_bd_get_num_blocks 78 89 }; 90 91 errno_t hr_raid5_create(hr_volume_t *new_volume) 92 { 93 errno_t rc; 94 95 assert(new_volume->level == HR_LVL_5); 96 97 if (new_volume->dev_no < 3) { 98 ERR_PRINTF("RAID 5 array needs at least 3 devices"); 99 return EINVAL; 100 } 101 102 rc = hr_raid5_update_vol_status(new_volume); 103 if (rc != EOK) 104 return rc; 105 106 bd_srvs_init(&new_volume->hr_bds); 107 new_volume->hr_bds.ops = &hr_raid5_bd_ops; 108 new_volume->hr_bds.sarg = new_volume; 109 110 rc = hr_register_volume(new_volume); 111 112 return rc; 113 } 114 115 errno_t hr_raid5_init(hr_volume_t *vol) 116 { 117 errno_t rc; 118 size_t bsize; 119 uint64_t total_blkno; 120 121 assert(vol->level == HR_LVL_5); 122 123 rc = hr_check_devs(vol, &total_blkno, &bsize); 124 if (rc != EOK) 125 return rc; 126 127 vol->nblocks = total_blkno; 128 vol->bsize = bsize; 129 vol->data_offset = HR_DATA_OFF; 130 vol->data_blkno = vol->nblocks - (vol->data_offset * vol->dev_no) - 131 (vol->nblocks / vol->dev_no); 132 vol->strip_size = HR_STRIP_SIZE; 133 134 return EOK; 135 } 136 137 static errno_t hr_raid5_bd_open(bd_srvs_t *bds, bd_srv_t *bd) 138 { 139 DPRINTF("hr_bd_open()\n"); 140 return EOK; 141 } 142 143 static errno_t hr_raid5_bd_close(bd_srv_t *bd) 144 { 145 DPRINTF("hr_bd_close()\n"); 146 return EOK; 147 } 148 149 static errno_t hr_raid5_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 150 { 151 return hr_raid5_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0); 152 } 153 154 static errno_t hr_raid5_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 155 void *buf, size_t size) 156 { 157 return hr_raid5_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size); 158 } 159 160 static errno_t hr_raid5_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 161 const void *data, size_t size) 162 { 163 return hr_raid5_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size); 164 } 165 166 static errno_t hr_raid5_bd_get_block_size(bd_srv_t *bd, size_t *rsize) 167 { 168 hr_volume_t *vol = bd->srvs->sarg; 169 170 *rsize = vol->bsize; 171 return EOK; 172 } 173 174 static errno_t hr_raid5_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb) 175 { 176 hr_volume_t *vol = bd->srvs->sarg; 177 178 *rnb = vol->data_blkno; 179 return EOK; 180 } 79 181 80 182 static errno_t hr_raid5_vol_usable(hr_volume_t *vol) … … 317 419 free(buf); 318 420 return rc; 319 }320 321 static errno_t hr_raid5_bd_open(bd_srvs_t *bds, bd_srv_t *bd)322 {323 DPRINTF("hr_bd_open()\n");324 return EOK;325 }326 327 static errno_t hr_raid5_bd_close(bd_srv_t *bd)328 {329 DPRINTF("hr_bd_close()\n");330 return EOK;331 421 } 332 422 … … 461 551 } 462 552 463 static errno_t hr_raid5_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)464 {465 return hr_raid5_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);466 }467 468 static errno_t hr_raid5_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,469 void *buf, size_t size)470 {471 return hr_raid5_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);472 }473 474 static errno_t hr_raid5_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,475 const void *data, size_t size)476 {477 return hr_raid5_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);478 }479 480 static errno_t hr_raid5_bd_get_block_size(bd_srv_t *bd, size_t *rsize)481 {482 hr_volume_t *vol = bd->srvs->sarg;483 484 *rsize = vol->bsize;485 return EOK;486 }487 488 static errno_t hr_raid5_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)489 {490 hr_volume_t *vol = bd->srvs->sarg;491 492 *rnb = vol->data_blkno;493 return EOK;494 }495 496 errno_t hr_raid5_create(hr_volume_t *new_volume)497 {498 errno_t rc;499 500 assert(new_volume->level == HR_LVL_5);501 502 if (new_volume->dev_no < 3) {503 ERR_PRINTF("RAID 5 array needs at least 3 devices");504 return EINVAL;505 }506 507 rc = hr_raid5_update_vol_status(new_volume);508 if (rc != EOK)509 return rc;510 511 bd_srvs_init(&new_volume->hr_bds);512 new_volume->hr_bds.ops = &hr_raid5_bd_ops;513 new_volume->hr_bds.sarg = new_volume;514 515 rc = hr_register_volume(new_volume);516 517 return rc;518 }519 520 errno_t hr_raid5_init(hr_volume_t *vol)521 {522 errno_t rc;523 size_t bsize;524 uint64_t total_blkno;525 526 assert(vol->level == HR_LVL_5);527 528 rc = hr_check_devs(vol, &total_blkno, &bsize);529 if (rc != EOK)530 return rc;531 532 vol->nblocks = total_blkno;533 vol->bsize = bsize;534 vol->data_offset = HR_DATA_OFF;535 vol->data_blkno = vol->nblocks - (vol->data_offset * vol->dev_no) -536 (vol->nblocks / vol->dev_no);537 vol->strip_size = HR_STRIP_SIZE;538 539 return EOK;540 }541 542 553 /** @} 543 554 */
Note:
See TracChangeset
for help on using the changeset viewer.