Changeset 99c23405 in mainline for uspace/lib/label/src/mbr.c
- Timestamp:
- 2015-07-04T15:18:06Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 603c1d1f
- Parents:
- 6bc542b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/label/src/mbr.c
r6bc542b r99c23405 54 54 static int mbr_part_destroy(label_part_t *); 55 55 56 static void mbr_unused_pte(mbr_pte_t *); 57 static int mbr_part_to_pte(label_part_t *, mbr_pte_t *); 56 58 static int mbr_pte_to_part(label_t *, mbr_pte_t *, int); 59 static int mbr_pte_update(label_t *, mbr_pte_t *, int); 57 60 58 61 label_ops_t mbr_label_ops = { … … 141 144 label->ablock0 = mbr_ablock0; 142 145 label->anblocks = nblocks - mbr_ablock0; 146 label->pri_entries = mbr_nprimary; 143 147 *rlabel = label; 144 148 return EOK; … … 207 211 { 208 212 label_part_t *part; 213 mbr_pte_t pte; 214 int rc; 209 215 210 216 part = calloc(1, sizeof(label_part_t)); … … 212 218 return ENOMEM; 213 219 220 /* XXX Verify index, block0, nblocks */ 221 222 if (pspec->index < 1 || pspec->index > label->pri_entries) { 223 rc = EINVAL; 224 goto error; 225 } 226 227 /* XXX Check if index is used */ 228 229 part->label = label; 214 230 part->index = pspec->index; 215 231 part->block0 = pspec->block0; 216 232 part->nblocks = pspec->nblocks; 217 218 part->label = label; 233 part->ptype = pspec->ptype; 234 235 rc = mbr_part_to_pte(part, &pte); 236 if (rc != EOK) { 237 rc = EINVAL; 238 goto error; 239 } 240 241 rc = mbr_pte_update(label, &pte, pspec->index - 1); 242 if (rc != EOK) { 243 rc = EIO; 244 goto error; 245 } 246 247 list_append(&part->llabel, &label->parts); 219 248 220 249 *rpart = part; 221 250 return EOK; 251 error: 252 free(part); 253 return rc; 222 254 } 223 255 224 256 static int mbr_part_destroy(label_part_t *part) 225 257 { 226 return ENOTSUP; 258 mbr_pte_t pte; 259 int rc; 260 261 /* Prepare unused partition table entry */ 262 mbr_unused_pte(&pte); 263 264 /* Modify partition table */ 265 rc = mbr_pte_update(part->label, &pte, part->index - 1); 266 if (rc != EOK) 267 return EIO; 268 269 list_remove(&part->llabel); 270 free(part); 271 return EOK; 272 } 273 274 static void mbr_unused_pte(mbr_pte_t *pte) 275 { 276 memset(pte, 0, sizeof(mbr_pte_t)); 277 } 278 279 static int mbr_part_to_pte(label_part_t *part, mbr_pte_t *pte) 280 { 281 if ((part->block0 >> 32) != 0) 282 return EINVAL; 283 if ((part->nblocks >> 32) != 0) 284 return EINVAL; 285 if ((part->ptype >> 8) != 0) 286 return EINVAL; 287 288 memset(pte, 0, sizeof(mbr_pte_t)); 289 pte->ptype = part->ptype; 290 pte->first_lba = host2uint32_t_le(part->block0); 291 pte->length = host2uint32_t_le(part->nblocks); 292 return EOK; 227 293 } 228 294 … … 260 326 } 261 327 328 /** Update partition table entry at specified index. 329 * 330 * Replace partition entry at index @a index with the contents of 331 * @a pte. 332 */ 333 static int mbr_pte_update(label_t *label, mbr_pte_t *pte, int index) 334 { 335 mbr_br_block_t *br; 336 int rc; 337 338 br = calloc(1, label->block_size); 339 if (br == NULL) 340 return ENOMEM; 341 342 rc = block_read_direct(label->svcid, mbr_ba, 1, br); 343 if (rc != EOK) { 344 rc = EIO; 345 goto error; 346 } 347 348 br->pte[index] = *pte; 349 350 rc = block_write_direct(label->svcid, mbr_ba, 1, br); 351 if (rc != EOK) { 352 rc = EIO; 353 goto error; 354 } 355 356 free(br); 357 return EOK; 358 error: 359 free(br); 360 return rc; 361 } 362 262 363 /** @} 263 364 */
Note:
See TracChangeset
for help on using the changeset viewer.