Changeset 99c23405 in mainline for uspace/lib/label/src/mbr.c


Ignore:
Timestamp:
2015-07-04T15:18:06Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
603c1d1f
Parents:
6bc542b
Message:

Persistent partition table modification when creating or deleting partition.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/label/src/mbr.c

    r6bc542b r99c23405  
    5454static int mbr_part_destroy(label_part_t *);
    5555
     56static void mbr_unused_pte(mbr_pte_t *);
     57static int mbr_part_to_pte(label_part_t *, mbr_pte_t *);
    5658static int mbr_pte_to_part(label_t *, mbr_pte_t *, int);
     59static int mbr_pte_update(label_t *, mbr_pte_t *, int);
    5760
    5861label_ops_t mbr_label_ops = {
     
    141144        label->ablock0 = mbr_ablock0;
    142145        label->anblocks = nblocks - mbr_ablock0;
     146        label->pri_entries = mbr_nprimary;
    143147        *rlabel = label;
    144148        return EOK;
     
    207211{
    208212        label_part_t *part;
     213        mbr_pte_t pte;
     214        int rc;
    209215
    210216        part = calloc(1, sizeof(label_part_t));
     
    212218                return ENOMEM;
    213219
     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;
    214230        part->index = pspec->index;
    215231        part->block0 = pspec->block0;
    216232        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);
    219248
    220249        *rpart = part;
    221250        return EOK;
     251error:
     252        free(part);
     253        return rc;
    222254}
    223255
    224256static int mbr_part_destroy(label_part_t *part)
    225257{
    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
     274static void mbr_unused_pte(mbr_pte_t *pte)
     275{
     276        memset(pte, 0, sizeof(mbr_pte_t));
     277}
     278
     279static 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;
    227293}
    228294
     
    260326}
    261327
     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 */
     333static 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;
     358error:
     359        free(br);
     360        return rc;
     361}
     362
    262363/** @}
    263364 */
Note: See TracChangeset for help on using the changeset viewer.