Changeset 1626cd4 in mainline for uspace/lib/label


Ignore:
Timestamp:
2015-07-02T19:01:37Z (10 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.

Location:
uspace/lib/label
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/label/include/std/mbr.h

    r3faa03d r1626cd4  
    3838#include <stdint.h>
    3939
    40 /** Block address of Master Boot Record. */
    41 #define MBR_BA  0
     40enum {
     41        /** Block address of Master Boot Record. */
     42        mbr_ba = 0,
    4243
    43 enum {
     44        /** First block allowed for allocation */
     45        mbr_ablock0 = 18,
     46
    4447        /** Number of primary partition records */
    4548        mbr_nprimary = 4,
  • uspace/lib/label/include/types/liblabel.h

    r3faa03d r1626cd4  
    4343
    4444typedef struct label label_t;
     45typedef struct label_info label_info_t;
    4546typedef struct label_part label_part_t;
    4647typedef struct label_part_info label_part_info_t;
     
    5354        void (*close)(label_t *);
    5455        int (*destroy)(label_t *);
     56        int (*get_info)(label_t *, label_info_t *);
    5557        label_part_t *(*part_first)(label_t *);
    5658        label_part_t *(*part_next)(label_part_t *);
     
    6062} label_ops_t;
    6163
    62 typedef struct {
     64struct label_info {
    6365        /** Disk contents */
    6466        label_disk_cnt_t dcnt;
    6567        /** Label type */
    6668        label_type_t ltype;
    67 } label_info_t;
     69        /** First block that can be allocated */
     70        aoff64_t ablock0;
     71        /** Number of blocks that can be allocated */
     72        aoff64_t anblocks;
     73};
    6874
    6975struct label_part_info {
     76        /** Partition index */
     77        int index;
    7078        /** Address of first block */
    7179        aoff64_t block0;
     
    8088        /** Link to label_t.parts */
    8189        link_t llabel;
     90        /** Index */
     91        int index;
     92        /** First block */
    8293        aoff64_t block0;
     94        /** Number of blocks */
    8395        aoff64_t nblocks;
    8496};
     
    96108        /** Partitions */
    97109        list_t parts; /* of label_part_t */
     110        /** First block that can be allocated */
     111        aoff64_t ablock0;
     112        /** Number of blocks that can be allocated */
     113        aoff64_t anblocks;
    98114};
    99115
  • 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;
  • uspace/lib/label/src/label.c

    r3faa03d r1626cd4  
    9797int label_get_info(label_t *label, label_info_t *linfo)
    9898{
    99         memset(linfo, 0, sizeof(label_info_t));
    100         linfo->dcnt = dc_label;
    101         linfo->ltype = label->ltype;
    102         return EOK;
     99        return label->ops->get_info(label, linfo);
    103100}
    104101
  • uspace/lib/label/src/mbr.c

    r3faa03d r1626cd4  
    3737#include <byteorder.h>
    3838#include <errno.h>
     39#include <mem.h>
    3940#include <stdlib.h>
    4041
     
    4647static void mbr_close(label_t *);
    4748static int mbr_destroy(label_t *);
     49static int mbr_get_info(label_t *, label_info_t *);
    4850static label_part_t *mbr_part_first(label_t *);
    4951static label_part_t *mbr_part_next(label_part_t *);
     
    5254static int mbr_part_destroy(label_part_t *);
    5355
    54 static int mbr_pte_to_part(label_t *, mbr_pte_t *);
     56static int mbr_pte_to_part(label_t *, mbr_pte_t *, int);
    5557
    5658label_ops_t mbr_label_ops = {
     
    5961        .close = mbr_close,
    6062        .destroy = mbr_destroy,
     63        .get_info = mbr_get_info,
    6164        .part_first = mbr_part_first,
    6265        .part_next = mbr_part_next,
     
    7376        uint16_t sgn;
    7477        size_t bsize;
     78        aoff64_t nblocks;
    7579        uint32_t entry;
    7680        int rc;
     
    8286        }
    8387
     88        rc = block_get_nblocks(sid, &nblocks);
     89        if (rc != EOK) {
     90                rc = EIO;
     91                goto error;
     92        }
     93
    8494        if (bsize < 512 || (bsize % 512) != 0) {
     95                rc = EINVAL;
     96                goto error;
     97        }
     98
     99        if (nblocks < mbr_ablock0) {
    85100                rc = EINVAL;
    86101                goto error;
     
    93108        }
    94109
    95         rc = block_read_direct(sid, MBR_BA, 1, mbr);
     110        rc = block_read_direct(sid, mbr_ba, 1, mbr);
    96111        if (rc != EOK) {
    97112                rc = EIO;
     
    114129        for (entry = 0; entry < mbr_nprimary; entry++) {
    115130                eptr = &mbr->pte[entry];
    116                 rc = mbr_pte_to_part(label, eptr);
     131                rc = mbr_pte_to_part(label, eptr, entry + 1);
    117132                if (rc != EOK)
    118133                        goto error;
     
    124139        label->ops = &mbr_label_ops;
    125140        label->ltype = lt_mbr;
     141        label->ablock0 = mbr_ablock0;
     142        label->anblocks = nblocks - mbr_ablock0;
    126143        *rlabel = label;
    127144        return EOK;
     
    147164}
    148165
     166static int mbr_get_info(label_t *label, label_info_t *linfo)
     167{
     168        memset(linfo, 0, sizeof(label_info_t));
     169        linfo->dcnt = dc_label;
     170        linfo->ltype = lt_mbr;
     171        linfo->ablock0 = label->ablock0;
     172        linfo->anblocks = label->anblocks;
     173        return EOK;
     174}
     175
    149176static label_part_t *mbr_part_first(label_t *label)
    150177{
     
    171198static void mbr_part_get_info(label_part_t *part, label_part_info_t *pinfo)
    172199{
     200        pinfo->index = part->index;
    173201        pinfo->block0 = part->block0;
    174202        pinfo->nblocks = part->nblocks;
     
    178206    label_part_t **rpart)
    179207{
    180         return EOK;
     208        return ENOTSUP;
    181209}
    182210
    183211static int mbr_part_destroy(label_part_t *part)
    184212{
    185         return EOK;
    186 }
    187 
    188 static int mbr_pte_to_part(label_t *label, mbr_pte_t *pte)
     213        return ENOTSUP;
     214}
     215
     216static int mbr_pte_to_part(label_t *label, mbr_pte_t *pte, int index)
    189217{
    190218        label_part_t *part;
     
    204232                return ENOMEM;
    205233
     234        part->index = index;
    206235        part->block0 = block0;
    207236        part->nblocks = nblocks;
Note: See TracChangeset for help on using the changeset viewer.