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


Ignore:
Timestamp:
2015-07-18T12:55:12Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c43db5f
Parents:
70815a24
Message:

Most of extended (but not logical) partition support.

File:
1 edited

Legend:

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

    r70815a24 rb7a4d06  
    122122
    123123        list_initialize(&label->parts);
     124        list_initialize(&label->pri_parts);
     125        list_initialize(&label->log_parts);
    124126
    125127        /* Verify boot record signature */
     
    130132        }
    131133
     134        label->ext_part_idx = -1;
    132135        for (entry = 0; entry < mbr_nprimary; entry++) {
    133136                eptr = &mbr->pte[entry];
     
    187190
    188191        list_initialize(&label->parts);
     192        list_initialize(&label->pri_parts);
     193        list_initialize(&label->log_parts);
    189194
    190195        mbr->media_id = 0;
     
    210215        label->anblocks = nblocks - mbr_ablock0;
    211216        label->pri_entries = mbr_nprimary;
     217        label->ext_part_idx = -1;
    212218
    213219        *rlabel = label;
     
    225231        part = mbr_part_first(label);
    226232        while (part != NULL) {
    227                 list_remove(&part->llabel);
     233                list_remove(&part->lparts);
     234                if (link_used(&part->lpri))
     235                        list_remove(&part->lpri);
     236                if (link_used(&part->llog))
     237                        list_remove(&part->llog);
    228238                free(part);
    229239
     
    273283        linfo->dcnt = dc_label;
    274284        linfo->ltype = lt_mbr;
     285
     286        /* We support extended partitions */
     287        linfo->flags = lf_ext_supp;
     288
     289        /** Can create primary if there is a free slot */
     290        if (list_count(&label->pri_parts) < mbr_nprimary)
     291                linfo->flags |= lf_can_create_pri;
     292        /* Can create extended if there is a free slot and no extended */
     293        if ((linfo->flags & lf_can_create_pri) != 0 && label->ext_part_idx < 0)
     294                linfo->flags |= lf_can_create_ext;
     295        /* Can create logical if there is an extended partition */
     296        if (label->ext_part_idx >= 0)
     297                linfo->flags |= lf_can_create_log;
     298
    275299        linfo->ablock0 = label->ablock0;
    276300        linfo->anblocks = label->anblocks;
     301
    277302        return EOK;
    278303}
     
    286311                return NULL;
    287312
    288         return list_get_instance(link, label_part_t, llabel);
     313        return list_get_instance(link, label_part_t, lparts);
    289314}
    290315
     
    293318        link_t *link;
    294319
    295         link = list_next(&part->llabel, &part->label->parts);
     320        link = list_next(&part->lparts, &part->label->parts);
    296321        if (link == NULL)
    297322                return NULL;
    298323
    299         return list_get_instance(link, label_part_t, llabel);
    300 }
    301 
     324        return list_get_instance(link, label_part_t, lparts);
     325}
     326
     327#include <io/log.h>
    302328static void mbr_part_get_info(label_part_t *part, label_part_info_t *pinfo)
    303329{
     
    305331        pinfo->block0 = part->block0;
    306332        pinfo->nblocks = part->nblocks;
     333
     334        log_msg(LOG_DEFAULT, LVL_NOTE, "mbr_part_get_info: index=%d ptype=%d",
     335            (int)part->index, (int)part->ptype);
     336        if (link_used(&part->llog))
     337                pinfo->pkind = lpk_logical;
     338        else if (part->ptype == mbr_pt_extended)
     339                pinfo->pkind = lpk_extended;
     340        else
     341                pinfo->pkind = lpk_primary;
    307342}
    308343
     
    318353                return ENOMEM;
    319354
    320         /* XXX Verify index, block0, nblocks */
    321 
    322         if (pspec->index < 1 || pspec->index > label->pri_entries) {
    323                 rc = EINVAL;
    324                 goto error;
    325         }
    326355
    327356        /* XXX Check if index is used */
     
    331360        part->block0 = pspec->block0;
    332361        part->nblocks = pspec->nblocks;
    333         part->ptype = pspec->ptype;
    334 
    335         rc = mbr_part_to_pte(part, &pte);
    336         if (rc != EOK) {
    337                 rc = EINVAL;
    338                 goto error;
    339         }
    340 
    341         rc = mbr_pte_update(label, &pte, pspec->index - 1);
    342         if (rc != EOK) {
    343                 rc = EIO;
    344                 goto error;
    345         }
    346 
    347         list_append(&part->llabel, &label->parts);
     362
     363        switch (pspec->pkind) {
     364        case lpk_primary:
     365                part->ptype = pspec->ptype;
     366                break;
     367        case lpk_extended:
     368                part->ptype = mbr_pt_extended;
     369                if (pspec->ptype != 0) {
     370                        rc = EINVAL;
     371                        goto error;
     372                }
     373                if (label->ext_part_idx >= 0) {
     374                        rc = EEXISTS;
     375                        goto error;
     376                }
     377                break;
     378        case lpk_logical:
     379                part->ptype = pspec->ptype;
     380                if (pspec->index != 0) {
     381                        rc = EINVAL;
     382                        goto error;
     383                }
     384                break;
     385        }
     386
     387        if (pspec->pkind != lpk_logical) {
     388                /* Primary or extended partition */
     389                /* XXX Verify index, block0, nblocks */
     390
     391                if (pspec->index < 1 || pspec->index > label->pri_entries) {
     392                        rc = EINVAL;
     393                        goto error;
     394                }
     395
     396                rc = mbr_part_to_pte(part, &pte);
     397                if (rc != EOK) {
     398                        rc = EINVAL;
     399                        goto error;
     400                }
     401
     402                rc = mbr_pte_update(label, &pte, pspec->index - 1);
     403                if (rc != EOK) {
     404                        rc = EIO;
     405                        goto error;
     406                }
     407
     408                list_append(&part->lparts, &label->parts);
     409                list_append(&part->lpri, &label->pri_parts);
     410
     411                if (pspec->pkind == lpk_extended)
     412                        label->ext_part_idx = pspec->index - 1;
     413        } else {
     414                /* Logical partition */
     415                rc = ENOTSUP;
     416                goto error;
     417        }
    348418
    349419        *rpart = part;
     
    367437                return EIO;
    368438
    369         list_remove(&part->llabel);
     439        /* If it was the extended partition, clear ext. part. index */
     440        if (part->index - 1 == part->label->ext_part_idx)
     441                part->label->ext_part_idx = -1;
     442
     443        list_remove(&part->lparts);
     444        if (link_used(&part->lpri))
     445                list_remove(&part->lpri);
     446        if (link_used(&part->llog))
     447                list_remove(&part->llog);
    370448        free(part);
    371449        return EOK;
     
    386464                return EINVAL;
    387465
     466        log_msg(LOG_DEFAULT, LVL_NOTE, "mbr_part_to_pte: a0=%" PRIu64
     467            " len=%" PRIu64 " ptype=%d", part->block0, part->nblocks,
     468            (int)part->ptype);
    388469        memset(pte, 0, sizeof(mbr_pte_t));
    389470        pte->ptype = part->ptype;
     
    403484
    404485        /* See UEFI specification 2.0 section 5.2.1 Legacy Master Boot Record */
    405         if (pte->ptype == mbr_pt_unused || pte->ptype == mbr_pt_extended ||
    406             nblocks == 0)
     486        if (pte->ptype == mbr_pt_unused || nblocks == 0)
    407487                return EOK;
    408488
     
    411491                return ENOMEM;
    412492
     493        part->ptype = pte->ptype;
    413494        part->index = index;
    414495        part->block0 = block0;
     
    422503
    423504        part->label = label;
    424         list_append(&part->llabel, &label->parts);
     505        list_append(&part->lparts, &label->parts);
     506        list_append(&part->lpri, &label->pri_parts);
     507
     508        if (pte->ptype == mbr_pt_extended)
     509                label->ext_part_idx = index - 1;
    425510        return EOK;
    426511}
Note: See TracChangeset for help on using the changeset viewer.