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