Changeset 1626cd4 in mainline for uspace/lib/fdisk/src/fdisk.c


Ignore:
Timestamp:
2015-07-02T19:01:37Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6a0d4ce2
Parents:
3faa03d
Message:

Propagate label and partition block ranges and other info up through the stack.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/fdisk/src/fdisk.c

    r3faa03d r1626cd4  
    246246}
    247247
     248static 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;
     308error:
     309        free(part);
     310        return rc;
     311}
     312
     313
    248314int fdisk_dev_open(fdisk_t *fdisk, service_id_t sid, fdisk_dev_t **rdev)
    249315{
    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;
    251320
    252321        dev = calloc(1, sizeof(fdisk_dev_t));
     
    256325        dev->fdisk = fdisk;
    257326        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);
    259360        *rdev = dev;
    260361        return EOK;
     362error:
     363        fdisk_dev_close(dev);
     364        return rc;
    261365}
    262366
    263367void fdisk_dev_close(fdisk_dev_t *dev)
    264368{
     369        if (dev == NULL)
     370                return;
     371
     372        /* XXX Clean up partitions */
    265373        free(dev);
    266374}
     
    351459        link_t *link;
    352460
    353         link = list_first(&dev->parts);
     461        link = list_first(&dev->parts_ba);
    354462        if (link == NULL)
    355463                return NULL;
    356464
    357         return list_get_instance(link, fdisk_part_t, ldev);
     465        return list_get_instance(link, fdisk_part_t, ldev_ba);
    358466}
    359467
     
    362470        link_t *link;
    363471
    364         link = list_next(&part->ldev, &part->dev->parts);
     472        link = list_next(&part->ldev_ba, &part->dev->parts_ba);
    365473        if (link == NULL)
    366474                return NULL;
    367475
    368         return list_get_instance(link, fdisk_part_t, ldev);
     476        return list_get_instance(link, fdisk_part_t, ldev_ba);
    369477}
    370478
     
    399507        }
    400508
    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
    409519        return EOK;
    410520}
     
    418528                return EIO;
    419529
    420         list_remove(&part->ldev);
     530        list_remove(&part->ldev_ba);
     531        list_remove(&part->ldev_idx);
    421532        free(part);
    422533        return EOK;
Note: See TracChangeset for help on using the changeset viewer.