Changeset f57ccb5 in mainline for uspace/lib/label


Ignore:
Timestamp:
2015-08-11T16:03:59Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0bde8523
Parents:
1b23e33
Message:

Set partition type based on selected filesystem type.

Location:
uspace/lib/label
Files:
7 edited

Legend:

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

    r1b23e33 rf57ccb5  
    5555extern int label_part_destroy(label_part_t *);
    5656extern void label_pspec_init(label_part_spec_t *);
     57extern int label_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
    5758
    5859#endif
  • uspace/lib/label/include/std/gpt.h

    r1b23e33 rf57ccb5  
    7777} __attribute__((packed)) gpt_entry_t;
    7878
     79/** Microsoft Basic Data Partition */
     80#define GPT_MS_BASIC_DATA "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"
     81/** Linux Filesystem Data */
     82#define GPT_LINUX_FS_DATA "0FC63DAF-8483-4772-8E79-3D69D8477DE4"
     83/** I could not find any definition of Minix GUID partition type.
     84 * This is a randomly generated UUID */
     85#define GPT_MINIX_FAKE "8308e350-4e2d-46c7-8e3b-24b07e8ac674"
     86
    7987#endif
    8088
  • uspace/lib/label/include/std/mbr.h

    r1b23e33 rf57ccb5  
    5757};
    5858
    59 enum ptype {
     59enum mbr_ptype {
    6060        /** Unused partition entry */
    61         mbr_pt_unused   = 0x00,
     61        mbr_pt_unused       = 0x00,
    6262        /** Extended partition */
    63         mbr_pt_extended = 0x05
     63        mbr_pt_extended     = 0x05,
     64        /** Extended partition with LBA */
     65        mbr_pt_extended_lba = 0x0f,
     66        /** FAT16 with LBA */
     67        mbr_pt_fat16_lba    = 0x0e,
     68        /** FAT32 with LBA */
     69        mbr_pt_fat32_lba    = 0x0c,
     70        /** IFS, HPFS, NTFS, exFAT */
     71        mbr_pt_ms_advanced  = 0x07,
     72        /** Minix */
     73        mbr_pt_minix        = 0x81,
     74        /** Linux */
     75        mbr_pt_linux        = 0x83
    6476};
    6577
  • uspace/lib/label/include/types/liblabel.h

    r1b23e33 rf57ccb5  
    6161        int (*part_create)(label_t *, label_part_spec_t *, label_part_t **);
    6262        int (*part_destroy)(label_part_t *);
     63        int (*suggest_ptype)(label_t *, label_pcnt_t, label_ptype_t *);
    6364} label_ops_t;
    6465
     
    106107        aoff64_t nblocks;
    107108        /** Partition type */
    108         uint64_t ptype;
     109        label_ptype_t ptype;
    109110        /** Partition UUID */
    110111        uuid_t part_uuid;
     
    124125        label_pkind_t pkind;
    125126        /** Partition type */
    126         uint64_t ptype;
     127        label_ptype_t ptype;
    127128};
    128129
  • uspace/lib/label/src/gpt.c

    r1b23e33 rf57ccb5  
    5555static int gpt_part_create(label_t *, label_part_spec_t *, label_part_t **);
    5656static int gpt_part_destroy(label_part_t *);
     57static int gpt_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
    5758
    5859static void gpt_unused_pte(gpt_entry_t *);
     
    8081        .part_get_info = gpt_part_get_info,
    8182        .part_create = gpt_part_create,
    82         .part_destroy = gpt_part_destroy
     83        .part_destroy = gpt_part_destroy,
     84        .suggest_ptype = gpt_suggest_ptype
    8385};
    8486
     
    547549        linfo->dcnt = dc_label;
    548550        linfo->ltype = lt_gpt;
    549         linfo->flags = 0;
     551        linfo->flags = lf_ptype_uuid; /* Partition type is in UUID format */
    550552        if (gpt_can_create_pri(label))
    551553                linfo->flags = linfo->flags | lf_can_create_pri;
     
    607609        /* GPT only has primary partitions */
    608610        if (pspec->pkind != lpk_primary) {
     611                rc = EINVAL;
     612                goto error;
     613        }
     614
     615        /* Partition type must be in UUID format */
     616        if (pspec->ptype.fmt != lptf_uuid) {
    609617                rc = EINVAL;
    610618                goto error;
     
    663671}
    664672
     673static int gpt_suggest_ptype(label_t *label, label_pcnt_t pcnt,
     674    label_ptype_t *ptype)
     675{
     676        const char *ptid;
     677        int rc;
     678
     679        ptid = NULL;
     680
     681        switch (pcnt) {
     682        case lpc_fat12_16:
     683        case lpc_exfat:
     684        case lpc_fat32:
     685                ptid = GPT_MS_BASIC_DATA;
     686                break;
     687        case lpc_ext4:
     688                ptid = GPT_LINUX_FS_DATA;
     689                break;
     690        case lpc_minix:
     691                ptid = GPT_MINIX_FAKE;
     692                break;
     693        }
     694
     695        if (ptid == NULL)
     696                return EINVAL;
     697
     698        ptype->fmt = lptf_uuid;
     699        rc = uuid_parse(ptid, &ptype->t.uuid, NULL);
     700        assert(rc == EOK);
     701
     702        return EOK;
     703}
     704
    665705static void gpt_unused_pte(gpt_entry_t *pte)
    666706{
     
    677717
    678718        memset(pte, 0, sizeof(gpt_entry_t));
    679         pte->part_type[0] = 0x12;
     719        uuid_encode(&part->ptype.t.uuid, pte->part_type);
    680720        uuid_encode(&part->part_uuid, pte->part_id);
    681721        pte->start_lba = host2uint64_t_le(part->block0);
     
    713753        part->block0 = b0;
    714754        part->nblocks = b1 - b0 + 1;
     755        part->ptype.fmt = lptf_uuid;
     756        uuid_decode(pte->part_type, &part->ptype.t.uuid);
    715757        uuid_decode(pte->part_id, &part->part_uuid);
    716758
  • uspace/lib/label/src/label.c

    r1b23e33 rf57ccb5  
    133133}
    134134
     135int label_suggest_ptype(label_t *label, label_pcnt_t pcnt,
     136    label_ptype_t *ptype)
     137{
     138        return label->ops->suggest_ptype(label, pcnt, ptype);
     139}
     140
    135141/** @}
    136142 */
  • uspace/lib/label/src/mbr.c

    r1b23e33 rf57ccb5  
    5454static int mbr_part_create(label_t *, label_part_spec_t *, label_part_t **);
    5555static int mbr_part_destroy(label_part_t *);
     56static int mbr_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
    5657
    5758static void mbr_unused_pte(mbr_pte_t *);
     
    7778        .part_get_info = mbr_part_get_info,
    7879        .part_create = mbr_part_create,
    79         .part_destroy = mbr_part_destroy
     80        .part_destroy = mbr_part_destroy,
     81        .suggest_ptype = mbr_suggest_ptype
    8082};
    8183
     
    485487
    486488        log_msg(LOG_DEFAULT, LVL_NOTE, "mbr_part_get_info: index=%d ptype=%d",
    487             (int)part->index, (int)part->ptype);
     489            (int)part->index, (int)part->ptype.t.num);
    488490        if (link_used(&part->llog))
    489491                pinfo->pkind = lpk_logical;
    490         else if (part->ptype == mbr_pt_extended)
     492        else if (part->ptype.t.num == mbr_pt_extended)
    491493                pinfo->pkind = lpk_extended;
    492494        else
     
    503505        int rc;
    504506
     507        if (pspec->ptype.fmt != lptf_num)
     508                return EINVAL;
     509
    505510        part = calloc(1, sizeof(label_part_t));
    506511        if (part == NULL)
     
    521526                break;
    522527        case lpk_extended:
    523                 part->ptype = mbr_pt_extended;
    524                 if (pspec->ptype != 0) {
     528                part->ptype.fmt = lptf_num;
     529                part->ptype.t.num = mbr_pt_extended;
     530                if (pspec->ptype.t.num != 0) {
    525531                        rc = EINVAL;
    526532                        goto error;
     
    705711}
    706712
     713static int mbr_suggest_ptype(label_t *label, label_pcnt_t pcnt,
     714    label_ptype_t *ptype)
     715{
     716        ptype->fmt = lptf_num;
     717        ptype->t.num = 0;
     718
     719        switch (pcnt) {
     720        case lpc_exfat:
     721                ptype->t.num = mbr_pt_ms_advanced;
     722                break;
     723        case lpc_ext4:
     724                ptype->t.num = mbr_pt_linux;
     725                break;
     726        case lpc_fat12_16:
     727                ptype->t.num = mbr_pt_fat16_lba;
     728                break;
     729        case lpc_fat32:
     730                ptype->t.num = mbr_pt_fat32_lba;
     731                break;
     732        case lpc_minix:
     733                ptype->t.num = mbr_pt_minix;
     734                break;
     735        }
     736
     737        if (ptype->t.num == 0)
     738                return EINVAL;
     739
     740        return EOK;
     741}
     742
     743
    707744static void mbr_unused_pte(mbr_pte_t *pte)
    708745{
     
    716753        if ((part->nblocks >> 32) != 0)
    717754                return EINVAL;
    718         if ((part->ptype >> 8) != 0)
     755        if ((part->ptype.t.num >> 8) != 0)
    719756                return EINVAL;
    720757
    721758        log_msg(LOG_DEFAULT, LVL_NOTE, "mbr_part_to_pte: a0=%" PRIu64
    722759            " len=%" PRIu64 " ptype=%d", part->block0, part->nblocks,
    723             (int)part->ptype);
     760            (int)part->ptype.t.num);
    724761        memset(pte, 0, sizeof(mbr_pte_t));
    725         pte->ptype = part->ptype;
     762        pte->ptype = part->ptype.t.num;
    726763        pte->first_lba = host2uint32_t_le(part->block0);
    727764        pte->length = host2uint32_t_le(part->nblocks);
     
    746783                return ENOMEM;
    747784
    748         part->ptype = pte->ptype;
     785        part->ptype.fmt = lptf_num;
     786        part->ptype.t.num = pte->ptype;
    749787        part->index = index;
    750788        part->block0 = block0;
     
    786824        nlparts = list_count(&label->log_parts);
    787825
    788         part->ptype = pte->ptype;
     826        part->ptype.fmt = lptf_num;
     827        part->ptype.t.num = pte->ptype;
    789828        part->index = mbr_nprimary + 1 + nlparts;
    790829        part->block0 = block0;
     
    816855        if (pthis != NULL) {
    817856                memset(pthis, 0, sizeof(mbr_pte_t));
    818                 pthis->ptype = part->ptype;
     857                pthis->ptype = part->ptype.t.num;
    819858                pthis->first_lba = host2uint32_t_le(part->hdr_blocks);
    820859                pthis->length = host2uint32_t_le(part->nblocks);
Note: See TracChangeset for help on using the changeset viewer.