Changeset 12cbf25e in mainline
- Timestamp:
- 2024-08-31T13:09:16Z (9 months ago)
- Children:
- a8b2d9e7
- Parents:
- da5c257
- Location:
- uspace/srv/bd/hr
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/raid1.c
rda5c257 r12cbf25e 34 34 */ 35 35 36 #include <async.h>37 36 #include <bd_srv.h> 38 37 #include <block.h> … … 146 145 hr_volume_t *vol = bd->srvs->sarg; 147 146 148 return block_get_bsize(vol->devs[0], rsize); 147 *rsize = vol->bsize; 148 return EOK; 149 149 } 150 150 … … 153 153 hr_volume_t *vol = bd->srvs->sarg; 154 154 155 return block_get_nblocks(vol->devs[0], rnb); 155 *rnb = vol->nblocks; 156 return EOK; 156 157 } 157 158 … … 160 161 assert(new_volume->level == hr_l_1); 161 162 162 errno_t rc; 163 if (new_volume->dev_no < 2) { 164 log_msg(LOG_DEFAULT, LVL_ERROR, 165 "RAID 1 array needs at least 2 devices"); 166 return EINVAL; 167 } 168 169 errno_t rc; 170 size_t i, bsize, last_bsize; 171 uint64_t nblocks, last_nblocks; 172 uint64_t total_blocks = 0; 163 173 164 174 rc = hr_init_devs(new_volume); … … 166 176 return rc; 167 177 178 for (i = 0; i < new_volume->dev_no; i++) { 179 rc = block_get_nblocks(new_volume->devs[i], &nblocks); 180 if (rc != EOK) 181 goto error; 182 if (i != 0 && nblocks != last_nblocks) { 183 log_msg(LOG_DEFAULT, LVL_ERROR, 184 "number of blocks differs"); 185 rc = EINVAL; 186 goto error; 187 } 188 total_blocks += nblocks; 189 last_nblocks = nblocks; 190 } 191 192 for (i = 0; i < new_volume->dev_no; i++) { 193 rc = block_get_bsize(new_volume->devs[i], &bsize); 194 if (rc != EOK) 195 goto error; 196 if (i != 0 && bsize != last_bsize) { 197 log_msg(LOG_DEFAULT, LVL_ERROR, "block sizes differ"); 198 rc = EINVAL; 199 goto error; 200 } 201 last_bsize = bsize; 202 } 203 168 204 bd_srvs_init(&new_volume->hr_bds); 169 205 new_volume->hr_bds.ops = &hr_raid1_bd_ops; 170 206 new_volume->hr_bds.sarg = new_volume; 207 new_volume->nblocks = total_blocks / new_volume->dev_no; 208 new_volume->bsize = bsize; 171 209 172 210 rc = hr_register_volume(new_volume); 173 if (rc != EOK) { 174 hr_fini_devs(new_volume); 175 return rc; 176 } 177 178 return EOK; 211 if (rc != EOK) 212 goto error; 213 214 return EOK; 215 error: 216 hr_fini_devs(new_volume); 217 return rc; 179 218 } 180 219 -
uspace/srv/bd/hr/var.h
rda5c257 r12cbf25e 55 55 char *devname; 56 56 service_id_t *devs; 57 uint64_t nblocks; 58 size_t bsize; 57 59 service_id_t svc_id; 58 60 size_t dev_no;
Note:
See TracChangeset
for help on using the changeset viewer.