Changeset edebb4a1 in mainline for uspace/lib/fdisk/src/fdisk.c


Ignore:
Timestamp:
2015-10-14T22:30:12Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ea0ff6b
Parents:
4b6635a7
Message:

Handle dummy partition addition/removal during label destruction/creation. Handle dummy label properly in fdisk.

File:
1 edited

Legend:

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

    r4b6635a7 redebb4a1  
    5858};
    5959
     60static int fdisk_dev_add_parts(fdisk_dev_t *);
     61static void fdisk_dev_remove_parts(fdisk_dev_t *);
    6062static int fdisk_part_spec_prepare(fdisk_dev_t *, fdisk_part_spec_t *,
    6163    vbd_part_spec_t *);
     
    256258}
    257259
     260/** Add partition to our inventory. */
    258261static int fdisk_part_add(fdisk_dev_t *dev, vbd_part_id_t partid,
    259262    fdisk_part_t **rpart)
     
    268271                return ENOMEM;
    269272
     273        printf("vbd_part_get_info(%zu)\n", partid);
    270274        rc = vbd_part_get_info(dev->fdisk->vbd, partid, &pinfo);
    271275        if (rc != EOK) {
     
    274278        }
    275279
     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);
    276293        rc = vol_part_info(dev->fdisk->vol, pinfo.svc_id, &vpinfo);
     294        printf("vol_part_info->rc = %d\n", rc);
    277295        if (rc != EOK) {
    278296                rc = EIO;
     
    316334}
    317335
     336/** Remove partition from our inventory. */
     337static 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
    318349static void fdisk_pri_part_insert_lists(fdisk_dev_t *dev, fdisk_part_t *part)
    319350{
     
    373404}
    374405
    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;
     406static int fdisk_dev_add_parts(fdisk_dev_t *dev)
     407{
    379408        service_id_t *psids = NULL;
    380409        size_t nparts, i;
    381410        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         }
    399411
    400412        printf("get label info\n");
     
    408420        printf("block size: %zu\n", dev->dinfo.block_size);
    409421        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);
    411423        if (rc != EOK) {
    412424                printf("failed\n");
     
    428440
    429441        free(psids);
     442        return EOK;
     443error:
     444        fdisk_dev_remove_parts(dev);
     445        return rc;
     446}
     447
     448static 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
     459int 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);
    430514        *rdev = dev;
    431515        return EOK;
     
    440524                return;
    441525
    442         /* XXX Clean up partitions */
     526        fdisk_dev_remove_parts(dev);
    443527        free(dev);
    444528}
     
    504588{
    505589        int rc;
     590
     591        /* Remove dummy partition */
     592        fdisk_dev_remove_parts(dev);
    506593
    507594        rc = vbd_label_create(dev->fdisk->vbd, dev->sid, ltype);
     
    533620                return EIO;
    534621
     622        rc = fdisk_dev_add_parts(dev);
     623        if (rc != EOK)
     624                return rc;
     625
    535626        return EOK;
    536627}
     
    617708                return EIO;
    618709
    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);
    627711        return EOK;
    628712}
Note: See TracChangeset for help on using the changeset viewer.