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


Ignore:
Timestamp:
2015-07-05T18:53:00Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bf7ddde
Parents:
99c23405
Message:

Persistent partition table creation and destruction.

File:
1 edited

Legend:

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

    r99c23405 r603c1d1f  
    142142        label->ops = &mbr_label_ops;
    143143        label->ltype = lt_mbr;
     144        label->svc_id = sid;
     145        label->block_size = bsize;
    144146        label->ablock0 = mbr_ablock0;
    145147        label->anblocks = nblocks - mbr_ablock0;
     
    155157static int mbr_create(service_id_t sid, label_t **rlabel)
    156158{
    157         return EOK;
     159        label_t *label = NULL;
     160        mbr_br_block_t *mbr = NULL;
     161        aoff64_t nblocks;
     162        size_t bsize;
     163        int i;
     164        int rc;
     165
     166        rc = block_get_bsize(sid, &bsize);
     167        if (rc != EOK) {
     168                rc = EIO;
     169                goto error;
     170        }
     171
     172        rc = block_get_nblocks(sid, &nblocks);
     173        if (rc != EOK) {
     174                rc = EIO;
     175                goto error;
     176        }
     177
     178        mbr = calloc(1, bsize);
     179        if (mbr == NULL) {
     180                rc = ENOMEM;
     181                goto error;
     182        }
     183
     184        label = calloc(1, sizeof(label_t));
     185        if (label == NULL)
     186                return ENOMEM;
     187
     188        list_initialize(&label->parts);
     189
     190        mbr->media_id = 0;
     191        mbr->pad0 = 0;
     192        for (i = 0; i < mbr_nprimary; i++)
     193                mbr_unused_pte(&mbr->pte[i]);
     194        mbr->signature = host2uint16_t_le(mbr_br_signature);
     195
     196        rc = block_write_direct(sid, mbr_ba, 1, mbr);
     197        if (rc != EOK) {
     198                rc = EIO;
     199                goto error;
     200        }
     201
     202        free(mbr);
     203        mbr = NULL;
     204
     205        label->ops = &mbr_label_ops;
     206        label->ltype = lt_mbr;
     207        label->block_size = bsize;
     208        label->svc_id = sid;
     209        label->ablock0 = mbr_ablock0;
     210        label->anblocks = nblocks - mbr_ablock0;
     211        label->pri_entries = mbr_nprimary;
     212
     213        *rlabel = label;
     214        return EOK;
     215error:
     216        free(mbr);
     217        free(label);
     218        return rc;
    158219}
    159220
    160221static void mbr_close(label_t *label)
    161222{
     223        label_part_t *part;
     224
     225        part = mbr_part_first(label);
     226        while (part != NULL) {
     227                list_remove(&part->llabel);
     228                free(part);
     229
     230                part = mbr_part_first(label);
     231        }
     232
    162233        free(label);
    163234}
     
    165236static int mbr_destroy(label_t *label)
    166237{
    167         return EOK;
     238        mbr_br_block_t *mbr = NULL;
     239        label_part_t *part;
     240        int rc;
     241
     242        part = mbr_part_first(label);
     243        if (part != NULL) {
     244                rc = ENOTEMPTY;
     245                goto error;
     246        }
     247
     248        mbr = calloc(1, label->block_size);
     249        if (mbr == NULL) {
     250                rc = ENOMEM;
     251                goto error;
     252        }
     253
     254        rc = block_write_direct(label->svc_id, mbr_ba, 1, mbr);
     255        if (rc != EOK) {
     256                rc = EIO;
     257                goto error;
     258        }
     259
     260        free(mbr);
     261        mbr = NULL;
     262
     263        free(label);
     264        return EOK;
     265error:
     266        free(mbr);
     267        return rc;
    168268}
    169269
     
    340440                return ENOMEM;
    341441
    342         rc = block_read_direct(label->svcid, mbr_ba, 1, br);
     442        rc = block_read_direct(label->svc_id, mbr_ba, 1, br);
    343443        if (rc != EOK) {
    344444                rc = EIO;
     
    348448        br->pte[index] = *pte;
    349449
    350         rc = block_write_direct(label->svcid, mbr_ba, 1, br);
     450        rc = block_write_direct(label->svc_id, mbr_ba, 1, br);
    351451        if (rc != EOK) {
    352452                rc = EIO;
Note: See TracChangeset for help on using the changeset viewer.