Changeset 603c1d1f in mainline for uspace/srv


Ignore:
Timestamp:
2015-07-05T18:53:00Z (10 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.

Location:
uspace/srv
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/part/guid_part/guid_part.c

    r99c23405 r603c1d1f  
    250250        }
    251251
    252         rc = block_read_direct(indev_sid, GPT_HDR_BA, 1, gpt_hdr);
     252        rc = block_read_direct(indev_sid, gpt_hdr_ba, 1, gpt_hdr);
    253253        if (rc != EOK) {
    254254                printf(NAME ": Failed reading GPT header block.\n");
  • uspace/srv/bd/vbd/disk.c

    r99c23405 r603c1d1f  
    223223        }
    224224
     225        log_msg(LOG_DEFAULT, LVL_NOTE, "block_init(%zu)", sid);
    225226        rc = block_init(EXCHANGE_SERIALIZE, sid, 2048);
    226227        if (rc != EOK) {
     
    272273error:
    273274        label_close(label);
    274         if (block_inited)
     275        if (block_inited) {
     276                log_msg(LOG_DEFAULT, LVL_NOTE, "block_fini(%zu)", sid);
    275277                block_fini(sid);
     278        }
    276279        if (disk != NULL)
    277280                free(disk->svc_name);
     
    293296        list_remove(&disk->ldisks);
    294297        label_close(disk->label);
     298        log_msg(LOG_DEFAULT, LVL_NOTE, "block_fini(%zu)", sid);
     299        block_fini(sid);
    295300        free(disk);
    296301        return EOK;
     
    353358        label_t *label;
    354359        vbds_disk_t *disk;
     360        bool block_inited = false;
     361        size_t block_size;
    355362        int rc;
    356363
    357364        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_create(%zu)", sid);
     365
     366        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_create(%zu) - chkdup", sid);
    358367
    359368        /* Check for duplicates */
     
    362371                return EEXISTS;
    363372
     373        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_create(%zu) - alloc", sid);
     374
    364375        disk = calloc(1, sizeof(vbds_disk_t));
    365376        if (disk == NULL)
    366377                return ENOMEM;
    367378
     379        rc = loc_service_get_name(sid, &disk->svc_name);
     380        if (rc != EOK) {
     381                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed getting disk service name.");
     382                rc = EIO;
     383                goto error;
     384        }
     385
     386        log_msg(LOG_DEFAULT, LVL_NOTE, "block_init(%zu)", sid);
     387        rc = block_init(EXCHANGE_SERIALIZE, sid, 2048);
     388        if (rc != EOK) {
     389                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed opening block device %s.",
     390                    disk->svc_name);
     391                rc = EIO;
     392                goto error;
     393        }
     394
     395        rc = block_get_bsize(sid, &block_size);
     396        if (rc != EOK) {
     397                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed getting block size of %s.",
     398                    disk->svc_name);
     399                rc = EIO;
     400                goto error;
     401        }
     402
     403        block_inited = true;
     404
     405        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_create(%zu) - label_create", sid);
     406
    368407        rc = label_create(sid, ltype, &label);
    369408        if (rc != EOK)
     
    372411        disk->svc_id = sid;
    373412        disk->label = label;
     413        disk->block_size = block_size;
     414        list_initialize(&disk->parts);
     415
    374416        list_append(&disk->ldisks, &vbds_disks);
     417
     418        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_create(%zu) - success", sid);
    375419        return EOK;
    376420error:
     421        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_create(%zu) - failure", sid);
     422        if (block_inited) {
     423                log_msg(LOG_DEFAULT, LVL_NOTE, "block_fini(%zu)", sid);
     424                block_fini(sid);
     425        }
     426        if (disk != NULL)
     427                free(disk->svc_name);
    377428        free(disk);
    378429        return rc;
     
    397448
    398449        list_remove(&disk->ldisks);
     450        log_msg(LOG_DEFAULT, LVL_NOTE, "block_fini(%zu)", sid);
     451        block_fini(sid);
    399452        free(disk);
    400453        return EOK;
  • uspace/srv/volsrv/disk.c

    r99c23405 r603c1d1f  
    257257}
    258258
     259int vol_disk_label_create(vol_disk_t *disk, label_type_t ltype)
     260{
     261        int rc;
     262
     263        rc = vbd_label_create(vbd, disk->svc_id, ltype);
     264        if (rc != EOK)
     265                return rc;
     266
     267        disk->dcnt = dc_label;
     268        disk->ltype = ltype;
     269
     270        return EOK;
     271}
     272
     273int vol_disk_empty(vol_disk_t *disk)
     274{
     275        int rc;
     276
     277        if (disk->dcnt == dc_label) {
     278                rc = vbd_label_delete(vbd, disk->svc_id);
     279                if (rc != EOK)
     280                        return rc;
     281        }
     282
     283        disk->dcnt = dc_empty;
     284
     285        return EOK;
     286}
     287
     288
    259289/** @}
    260290 */
  • uspace/srv/volsrv/disk.h

    r99c23405 r603c1d1f  
    4545extern int vol_disk_get_ids(service_id_t *, size_t, size_t *);
    4646extern int vol_disk_find_by_id(service_id_t, vol_disk_t **);
     47extern int vol_disk_label_create(vol_disk_t *, label_type_t);
     48extern int vol_disk_empty(vol_disk_t *);
    4749
    4850#endif
  • uspace/srv/volsrv/volsrv.c

    r99c23405 r603c1d1f  
    146146        }
    147147
    148         disk->dcnt = dc_label;
    149         disk->ltype = ltype;
     148        rc = vol_disk_label_create(disk, ltype);
     149        if (rc != EOK) {
     150                async_answer_0(iid, EIO);
     151                return;
     152        }
    150153
    151154        async_answer_0(iid, EOK);
     
    166169        }
    167170
    168         disk->dcnt = dc_empty;
     171        rc = vol_disk_empty(disk);
     172        if (rc != EOK) {
     173                async_answer_0(iid, EIO);
     174                return;
     175        }
    169176
    170177        async_answer_0(iid, EOK);
Note: See TracChangeset for help on using the changeset viewer.