Changeset 733564a in mainline for uspace/srv/bd/hr/raid1.c
- Timestamp:
- 2024-11-15T16:44:25Z (6 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/raid1.c
r5d96f427 r733564a 53 53 extern loc_srv_t *hr_srv; 54 54 55 static errno_t hr_raid1_check_vol_status(hr_volume_t *); 56 static errno_t hr_raid1_update_vol_status(hr_volume_t *); 57 static void handle_extent_error(hr_volume_t *, size_t, errno_t); 58 static errno_t hr_raid1_bd_op(hr_bd_op_type_t, bd_srv_t *, aoff64_t, size_t, 59 void *, const void *, size_t); 60 61 /* bdops */ 55 62 static errno_t hr_raid1_bd_open(bd_srvs_t *, bd_srv_t *); 56 63 static errno_t hr_raid1_bd_close(bd_srv_t *); … … 73 80 }; 74 81 82 errno_t hr_raid1_create(hr_volume_t *new_volume) 83 { 84 errno_t rc; 85 86 assert(new_volume->level == HR_LVL_1); 87 88 if (new_volume->dev_no < 2) { 89 ERR_PRINTF("RAID 1 array needs at least 2 devices\n"); 90 return EINVAL; 91 } 92 93 rc = hr_raid1_update_vol_status(new_volume); 94 if (rc != EOK) 95 return rc; 96 97 bd_srvs_init(&new_volume->hr_bds); 98 new_volume->hr_bds.ops = &hr_raid1_bd_ops; 99 new_volume->hr_bds.sarg = new_volume; 100 101 rc = hr_register_volume(new_volume); 102 103 return rc; 104 } 105 106 errno_t hr_raid1_init(hr_volume_t *vol) 107 { 108 errno_t rc; 109 size_t bsize; 110 uint64_t total_blkno; 111 112 assert(vol->level == HR_LVL_1); 113 114 rc = hr_check_devs(vol, &total_blkno, &bsize); 115 if (rc != EOK) 116 return rc; 117 118 vol->nblocks = total_blkno / vol->dev_no; 119 vol->bsize = bsize; 120 vol->data_offset = HR_DATA_OFF; 121 vol->data_blkno = vol->nblocks - vol->data_offset; 122 vol->strip_size = 0; 123 124 return EOK; 125 } 126 127 static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd) 128 { 129 DPRINTF("hr_bd_open()\n"); 130 return EOK; 131 } 132 133 static errno_t hr_raid1_bd_close(bd_srv_t *bd) 134 { 135 DPRINTF("hr_bd_close()\n"); 136 return EOK; 137 } 138 139 static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 140 { 141 return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0); 142 } 143 144 static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 145 void *buf, size_t size) 146 { 147 return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size); 148 } 149 150 static errno_t hr_raid1_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 151 const void *data, size_t size) 152 { 153 return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size); 154 } 155 156 static errno_t hr_raid1_bd_get_block_size(bd_srv_t *bd, size_t *rsize) 157 { 158 hr_volume_t *vol = bd->srvs->sarg; 159 160 *rsize = vol->bsize; 161 return EOK; 162 } 163 164 static errno_t hr_raid1_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb) 165 { 166 hr_volume_t *vol = bd->srvs->sarg; 167 168 *rnb = vol->data_blkno; 169 return EOK; 170 } 171 75 172 static errno_t hr_raid1_check_vol_status(hr_volume_t *vol) 76 173 { … … 118 215 return EOK; 119 216 } 120 }121 122 static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd)123 {124 DPRINTF("hr_bd_open()\n");125 return EOK;126 }127 128 static errno_t hr_raid1_bd_close(bd_srv_t *bd)129 {130 DPRINTF("hr_bd_close()\n");131 return EOK;132 217 } 133 218 … … 217 302 } 218 303 219 static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)220 {221 return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);222 }223 224 static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,225 void *buf, size_t size)226 {227 return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);228 }229 230 static errno_t hr_raid1_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,231 const void *data, size_t size)232 {233 return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);234 }235 236 static errno_t hr_raid1_bd_get_block_size(bd_srv_t *bd, size_t *rsize)237 {238 hr_volume_t *vol = bd->srvs->sarg;239 240 *rsize = vol->bsize;241 return EOK;242 }243 244 static errno_t hr_raid1_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)245 {246 hr_volume_t *vol = bd->srvs->sarg;247 248 *rnb = vol->data_blkno;249 return EOK;250 }251 252 errno_t hr_raid1_create(hr_volume_t *new_volume)253 {254 errno_t rc;255 256 assert(new_volume->level == HR_LVL_1);257 258 if (new_volume->dev_no < 2) {259 ERR_PRINTF("RAID 1 array needs at least 2 devices\n");260 return EINVAL;261 }262 263 rc = hr_raid1_update_vol_status(new_volume);264 if (rc != EOK)265 return rc;266 267 bd_srvs_init(&new_volume->hr_bds);268 new_volume->hr_bds.ops = &hr_raid1_bd_ops;269 new_volume->hr_bds.sarg = new_volume;270 271 rc = hr_register_volume(new_volume);272 273 return rc;274 }275 276 errno_t hr_raid1_init(hr_volume_t *vol)277 {278 errno_t rc;279 size_t bsize;280 uint64_t total_blkno;281 282 assert(vol->level == HR_LVL_1);283 284 rc = hr_check_devs(vol, &total_blkno, &bsize);285 if (rc != EOK)286 return rc;287 288 vol->nblocks = total_blkno / vol->dev_no;289 vol->bsize = bsize;290 vol->data_offset = HR_DATA_OFF;291 vol->data_blkno = vol->nblocks - vol->data_offset;292 vol->strip_size = 0;293 294 return EOK;295 }296 297 304 /** @} 298 305 */
Note:
See TracChangeset
for help on using the changeset viewer.