Changeset 1626cd4 in mainline for uspace/lib/label/src/gpt.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/label/src/gpt.c

    r3faa03d r1626cd4  
    3737#include <byteorder.h>
    3838#include <errno.h>
     39#include <mem.h>
    3940#include <stdlib.h>
    4041
     
    4647static void gpt_close(label_t *);
    4748static int gpt_destroy(label_t *);
     49static int gpt_get_info(label_t *, label_info_t *);
    4850static label_part_t *gpt_part_first(label_t *);
    4951static label_part_t *gpt_part_next(label_part_t *);
     
    5254static int gpt_part_destroy(label_part_t *);
    5355
    54 static int gpt_pte_to_part(label_t *, gpt_entry_t *);
     56static int gpt_pte_to_part(label_t *, gpt_entry_t *, int);
    5557
    5658const uint8_t efi_signature[8] = {
     
    6466        .close = gpt_close,
    6567        .destroy = gpt_destroy,
     68        .get_info = gpt_get_info,
    6669        .part_first = gpt_part_first,
    6770        .part_next = gpt_part_next,
     
    8386        uint64_t ba;
    8487        uint32_t entry;
     88        uint64_t ba_min, ba_max;
    8589        int i;
    8690        int rc;
     
    126130        bcnt = (num_entries + esize - 1) / esize;
    127131        ba = uint64_t_le2host(gpt_hdr->entry_lba);
     132        ba_min = uint64_t_le2host(gpt_hdr->first_usable_lba);
     133        ba_max = uint64_t_le2host(gpt_hdr->last_usable_lba);
    128134
    129135        if (num_entries < 1) {
     
    133139
    134140        if (esize < sizeof(gpt_entry_t)) {
     141                rc = EINVAL;
     142                goto error;
     143        }
     144
     145        if (ba_max < ba_min) {
    135146                rc = EINVAL;
    136147                goto error;
     
    151162        for (entry = 0; entry < num_entries; entry++) {
    152163                eptr = (gpt_entry_t *)(etable + entry * esize);
    153                 rc = gpt_pte_to_part(label, eptr);
     164                rc = gpt_pte_to_part(label, eptr, entry + 1);
    154165                if (rc != EOK)
    155166                        goto error;
     
    163174        label->ops = &gpt_label_ops;
    164175        label->ltype = lt_gpt;
     176        label->ablock0 = ba_min;
     177        label->anblocks = ba_max - ba_min + 1;
    165178        *rlabel = label;
    166179        return EOK;
     
    187200}
    188201
     202static int gpt_get_info(label_t *label, label_info_t *linfo)
     203{
     204        memset(linfo, 0, sizeof(label_info_t));
     205        linfo->dcnt = dc_label;
     206        linfo->ltype = lt_gpt;
     207        linfo->ablock0 = label->ablock0;
     208        linfo->anblocks = label->anblocks;
     209        return EOK;
     210}
     211
    189212static label_part_t *gpt_part_first(label_t *label)
    190213{
     
    211234static void gpt_part_get_info(label_part_t *part, label_part_info_t *pinfo)
    212235{
     236        pinfo->index = part->index;
    213237        pinfo->block0 = part->block0;
    214238        pinfo->nblocks = part->nblocks;
     
    218242    label_part_t **rpart)
    219243{
    220         return EOK;
     244        return ENOTSUP;
    221245}
    222246
    223247static int gpt_part_destroy(label_part_t *part)
    224248{
    225         return EOK;
    226 }
    227 
    228 static int gpt_pte_to_part(label_t *label, gpt_entry_t *pte)
     249        return ENOTSUP;
     250}
     251
     252static int gpt_pte_to_part(label_t *label, gpt_entry_t *pte, int index)
    229253{
    230254        label_part_t *part;
     
    250274                return EINVAL;
    251275
     276        part->index = index;
    252277        part->block0 = b0;
    253278        part->nblocks = b1 - b0 + 1;
Note: See TracChangeset for help on using the changeset viewer.