Changeset 1626cd4 in mainline for uspace/lib/fdisk/src/fdisk.c
- Timestamp:
- 2015-07-02T19:01:37Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6a0d4ce2
- Parents:
- 3faa03d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fdisk/src/fdisk.c
r3faa03d r1626cd4 246 246 } 247 247 248 static int fdisk_part_add(fdisk_dev_t *dev, vbd_part_id_t partid, 249 fdisk_part_t **rpart) 250 { 251 fdisk_part_t *part, *p; 252 vbd_part_info_t pinfo; 253 link_t *link; 254 int rc; 255 256 part = calloc(1, sizeof(fdisk_part_t)); 257 if (part == NULL) 258 return ENOMEM; 259 260 rc = vbd_part_get_info(dev->fdisk->vbd, partid, &pinfo); 261 if (rc != EOK) { 262 rc = EIO; 263 goto error; 264 } 265 266 part->dev = dev; 267 part->index = pinfo.index; 268 part->block0 = pinfo.block0; 269 part->nblocks = pinfo.nblocks; 270 271 /* Insert to list by block address */ 272 link = list_first(&dev->parts_ba); 273 while (link != NULL) { 274 p = list_get_instance(link, fdisk_part_t, ldev_ba); 275 if (p->block0 > part->block0) { 276 list_insert_before(&part->ldev_ba, &p->ldev_ba); 277 break; 278 } 279 280 link = list_next(link, &dev->parts_ba); 281 } 282 283 if (link == NULL) 284 list_append(&part->ldev_ba, &dev->parts_ba); 285 286 /* Insert to list by index */ 287 link = list_first(&dev->parts_idx); 288 while (link != NULL) { 289 p = list_get_instance(link, fdisk_part_t, ldev_idx); 290 if (p->index > part->index) { 291 list_insert_before(&part->ldev_idx, &p->ldev_idx); 292 break; 293 } 294 295 link = list_next(link, &dev->parts_idx); 296 } 297 298 if (link == NULL) 299 list_append(&part->ldev_idx, &dev->parts_idx); 300 301 part->capacity.cunit = cu_byte; 302 part->capacity.value = part->nblocks * dev->dinfo.block_size; 303 part->part_id = partid; 304 305 if (rpart != NULL) 306 *rpart = part; 307 return EOK; 308 error: 309 free(part); 310 return rc; 311 } 312 313 248 314 int fdisk_dev_open(fdisk_t *fdisk, service_id_t sid, fdisk_dev_t **rdev) 249 315 { 250 fdisk_dev_t *dev; 316 fdisk_dev_t *dev = NULL; 317 service_id_t *psids = NULL; 318 size_t nparts, i; 319 int rc; 251 320 252 321 dev = calloc(1, sizeof(fdisk_dev_t)); … … 256 325 dev->fdisk = fdisk; 257 326 dev->sid = sid; 258 list_initialize(&dev->parts); 327 list_initialize(&dev->parts_idx); 328 list_initialize(&dev->parts_ba); 329 330 printf("get info\n"); 331 rc = vbd_disk_info(fdisk->vbd, sid, &dev->dinfo); 332 if (rc != EOK) { 333 printf("failed\n"); 334 rc = EIO; 335 goto error; 336 } 337 338 printf("block size: %zu\n", dev->dinfo.block_size); 339 printf("get partitions\n"); 340 rc = vbd_label_get_parts(fdisk->vbd, sid, &psids, &nparts); 341 if (rc != EOK) { 342 printf("failed\n"); 343 rc = EIO; 344 goto error; 345 } 346 printf("OK\n"); 347 348 printf("found %zu partitions.\n", nparts); 349 for (i = 0; i < nparts; i++) { 350 printf("add partition sid=%zu\n", psids[i]); 351 rc = fdisk_part_add(dev, psids[i], NULL); 352 if (rc != EOK) { 353 printf("failed\n"); 354 goto error; 355 } 356 printf("OK\n"); 357 } 358 359 free(psids); 259 360 *rdev = dev; 260 361 return EOK; 362 error: 363 fdisk_dev_close(dev); 364 return rc; 261 365 } 262 366 263 367 void fdisk_dev_close(fdisk_dev_t *dev) 264 368 { 369 if (dev == NULL) 370 return; 371 372 /* XXX Clean up partitions */ 265 373 free(dev); 266 374 } … … 351 459 link_t *link; 352 460 353 link = list_first(&dev->parts );461 link = list_first(&dev->parts_ba); 354 462 if (link == NULL) 355 463 return NULL; 356 464 357 return list_get_instance(link, fdisk_part_t, ldev );465 return list_get_instance(link, fdisk_part_t, ldev_ba); 358 466 } 359 467 … … 362 470 link_t *link; 363 471 364 link = list_next(&part->ldev , &part->dev->parts);472 link = list_next(&part->ldev_ba, &part->dev->parts_ba); 365 473 if (link == NULL) 366 474 return NULL; 367 475 368 return list_get_instance(link, fdisk_part_t, ldev );476 return list_get_instance(link, fdisk_part_t, ldev_ba); 369 477 } 370 478 … … 399 507 } 400 508 401 part->dev = dev; 402 list_append(&part->ldev, &dev->parts); 403 part->capacity = pspec->capacity; 404 part->fstype = pspec->fstype; 405 part->part_id = partid; 406 407 if (rpart != NULL) 408 *rpart = part; 509 rc = fdisk_part_add(dev, partid, rpart); 510 if (rc != EOK) { 511 /* Try rolling back */ 512 (void) vbd_part_delete(dev->fdisk->vbd, partid); 513 return EIO; 514 } 515 516 (*rpart)->fstype = pspec->fstype; 517 (*rpart)->capacity = pspec->capacity; 518 409 519 return EOK; 410 520 } … … 418 528 return EIO; 419 529 420 list_remove(&part->ldev); 530 list_remove(&part->ldev_ba); 531 list_remove(&part->ldev_idx); 421 532 free(part); 422 533 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.