Changeset edebb4a1 in mainline for uspace/lib/fdisk/src/fdisk.c
- Timestamp:
- 2015-10-14T22:30:12Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ea0ff6b
- Parents:
- 4b6635a7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fdisk/src/fdisk.c
r4b6635a7 redebb4a1 58 58 }; 59 59 60 static int fdisk_dev_add_parts(fdisk_dev_t *); 61 static void fdisk_dev_remove_parts(fdisk_dev_t *); 60 62 static int fdisk_part_spec_prepare(fdisk_dev_t *, fdisk_part_spec_t *, 61 63 vbd_part_spec_t *); … … 256 258 } 257 259 260 /** Add partition to our inventory. */ 258 261 static int fdisk_part_add(fdisk_dev_t *dev, vbd_part_id_t partid, 259 262 fdisk_part_t **rpart) … … 268 271 return ENOMEM; 269 272 273 printf("vbd_part_get_info(%zu)\n", partid); 270 274 rc = vbd_part_get_info(dev->fdisk->vbd, partid, &pinfo); 271 275 if (rc != EOK) { … … 274 278 } 275 279 280 printf("vol_part_add(%zu)...\n", pinfo.svc_id); 281 /* 282 * Normally vol service discovers the partition asynchronously. 283 * Here we need to make sure the partition is already known to it. 284 */ 285 rc = vol_part_add(dev->fdisk->vol, pinfo.svc_id); 286 printf("vol_part_add->rc = %d\n", rc); 287 if (rc != EOK && rc != EEXIST) { 288 rc = EIO; 289 goto error; 290 } 291 292 printf("vol_part_info(%zu)\n", pinfo.svc_id); 276 293 rc = vol_part_info(dev->fdisk->vol, pinfo.svc_id, &vpinfo); 294 printf("vol_part_info->rc = %d\n", rc); 277 295 if (rc != EOK) { 278 296 rc = EIO; … … 316 334 } 317 335 336 /** Remove partition from our inventory. */ 337 static void fdisk_part_remove(fdisk_part_t *part) 338 { 339 list_remove(&part->lparts); 340 if (link_used(&part->lpri_ba)) 341 list_remove(&part->lpri_ba); 342 if (link_used(&part->lpri_idx)) 343 list_remove(&part->lpri_idx); 344 if (link_used(&part->llog_ba)) 345 list_remove(&part->llog_ba); 346 free(part); 347 } 348 318 349 static void fdisk_pri_part_insert_lists(fdisk_dev_t *dev, fdisk_part_t *part) 319 350 { … … 373 404 } 374 405 375 int fdisk_dev_open(fdisk_t *fdisk, service_id_t sid, fdisk_dev_t **rdev) 376 { 377 vbd_disk_info_t vinfo; 378 fdisk_dev_t *dev = NULL; 406 static int fdisk_dev_add_parts(fdisk_dev_t *dev) 407 { 379 408 service_id_t *psids = NULL; 380 409 size_t nparts, i; 381 410 int rc; 382 383 dev = calloc(1, sizeof(fdisk_dev_t));384 if (dev == NULL)385 return ENOMEM;386 387 dev->fdisk = fdisk;388 dev->sid = sid;389 list_initialize(&dev->parts);390 list_initialize(&dev->pri_idx);391 list_initialize(&dev->pri_ba);392 list_initialize(&dev->log_ba);393 394 rc = vbd_disk_info(fdisk->vbd, sid, &vinfo);395 if (rc != EOK) {396 rc = EIO;397 goto error;398 }399 411 400 412 printf("get label info\n"); … … 408 420 printf("block size: %zu\n", dev->dinfo.block_size); 409 421 printf("get partitions\n"); 410 rc = vbd_label_get_parts( fdisk->vbd,sid, &psids, &nparts);422 rc = vbd_label_get_parts(dev->fdisk->vbd, dev->sid, &psids, &nparts); 411 423 if (rc != EOK) { 412 424 printf("failed\n"); … … 428 440 429 441 free(psids); 442 return EOK; 443 error: 444 fdisk_dev_remove_parts(dev); 445 return rc; 446 } 447 448 static void fdisk_dev_remove_parts(fdisk_dev_t *dev) 449 { 450 fdisk_part_t *part; 451 452 part = fdisk_part_first(dev); 453 while (part != NULL) { 454 fdisk_part_remove(part); 455 part = fdisk_part_first(dev); 456 } 457 } 458 459 int fdisk_dev_open(fdisk_t *fdisk, service_id_t sid, fdisk_dev_t **rdev) 460 { 461 vbd_disk_info_t vinfo; 462 fdisk_dev_t *dev = NULL; 463 service_id_t *psids = NULL; 464 size_t nparts, i; 465 int rc; 466 467 dev = calloc(1, sizeof(fdisk_dev_t)); 468 if (dev == NULL) 469 return ENOMEM; 470 471 dev->fdisk = fdisk; 472 dev->sid = sid; 473 list_initialize(&dev->parts); 474 list_initialize(&dev->pri_idx); 475 list_initialize(&dev->pri_ba); 476 list_initialize(&dev->log_ba); 477 478 rc = vbd_disk_info(fdisk->vbd, sid, &vinfo); 479 if (rc != EOK) { 480 rc = EIO; 481 goto error; 482 } 483 484 printf("get label info\n"); 485 rc = fdisk_update_dev_info(dev); 486 if (rc != EOK) { 487 printf("failed\n"); 488 rc = EIO; 489 goto error; 490 } 491 492 printf("block size: %zu\n", dev->dinfo.block_size); 493 printf("get partitions\n"); 494 rc = vbd_label_get_parts(fdisk->vbd, sid, &psids, &nparts); 495 if (rc != EOK) { 496 printf("failed\n"); 497 rc = EIO; 498 goto error; 499 } 500 printf("OK\n"); 501 502 printf("found %zu partitions.\n", nparts); 503 for (i = 0; i < nparts; i++) { 504 printf("add partition sid=%zu\n", psids[i]); 505 rc = fdisk_part_add(dev, psids[i], NULL); 506 if (rc != EOK) { 507 printf("failed\n"); 508 goto error; 509 } 510 printf("OK\n"); 511 } 512 513 free(psids); 430 514 *rdev = dev; 431 515 return EOK; … … 440 524 return; 441 525 442 /* XXX Clean up partitions */526 fdisk_dev_remove_parts(dev); 443 527 free(dev); 444 528 } … … 504 588 { 505 589 int rc; 590 591 /* Remove dummy partition */ 592 fdisk_dev_remove_parts(dev); 506 593 507 594 rc = vbd_label_create(dev->fdisk->vbd, dev->sid, ltype); … … 533 620 return EIO; 534 621 622 rc = fdisk_dev_add_parts(dev); 623 if (rc != EOK) 624 return rc; 625 535 626 return EOK; 536 627 } … … 617 708 return EIO; 618 709 619 list_remove(&part->lparts); 620 if (link_used(&part->lpri_ba)) 621 list_remove(&part->lpri_ba); 622 if (link_used(&part->lpri_idx)) 623 list_remove(&part->lpri_idx); 624 if (link_used(&part->llog_ba)) 625 list_remove(&part->llog_ba); 626 free(part); 710 fdisk_part_remove(part); 627 711 return EOK; 628 712 }
Note:
See TracChangeset
for help on using the changeset viewer.