Changeset 95c675b in mainline for uspace/srv/bd/vbd/disk.c


Ignore:
Timestamp:
2017-10-17T13:11:35Z (8 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
60af4cdb
Parents:
dbf32b1 (diff), a416d070 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/vbd/disk.c

    rdbf32b1 r95c675b  
    3939#include <errno.h>
    4040#include <io/log.h>
     41#include <label/empty.h>
     42#include <label/label.h>
    4143#include <loc.h>
    4244#include <stdio.h>
     
    7577static vbd_part_id_t vbds_part_id = 1;
    7678
     79static int vbds_label_get_bsize(void *, size_t *);
     80static int vbds_label_get_nblocks(void *, aoff64_t *);
     81static int vbds_label_read(void *, aoff64_t, size_t, void *);
     82static int vbds_label_write(void *, aoff64_t, size_t, const void *);
     83
     84/** Block device operations provided by VBD */
    7785static bd_ops_t vbds_bd_ops = {
    7886        .open = vbds_bd_open,
     
    8391        .get_block_size = vbds_bd_get_block_size,
    8492        .get_num_blocks = vbds_bd_get_num_blocks
     93};
     94
     95/** Provide disk access to liblabel */
     96static label_bd_ops_t vbds_label_bd_ops = {
     97        .get_bsize = vbds_label_get_bsize,
     98        .get_nblocks = vbds_label_get_nblocks,
     99        .read = vbds_label_read,
     100        .write = vbds_label_write
    85101};
    86102
     
    450466{
    451467        label_t *label = NULL;
     468        label_bd_t lbd;
    452469        vbds_disk_t *disk = NULL;
    453470        bool block_inited = false;
     
    467484                return ENOMEM;
    468485
     486        /* Must be set before calling label_open */
     487        disk->svc_id = sid;
     488
    469489        rc = loc_service_get_name(sid, &disk->svc_name);
    470490        if (rc != EOK) {
     
    501521        block_inited = true;
    502522
    503         rc = label_open(sid, &label);
     523        lbd.ops = &vbds_label_bd_ops;
     524        lbd.arg = (void *) disk;
     525
     526        rc = label_open(&lbd, &label);
    504527        if (rc != EOK) {
    505528                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed to open label in disk %s.",
     
    509532        }
    510533
    511         disk->svc_id = sid;
    512534        disk->label = label;
    513535        disk->block_size = block_size;
     
    648670{
    649671        label_t *label;
     672        label_bd_t lbd;
    650673        label_info_t linfo;
    651674        vbds_disk_t *disk;
     
    683706        log_msg(LOG_DEFAULT, LVL_DEBUG, "vbds_label_create(%zu) - label_create", sid);
    684707
    685         rc = label_create(sid, ltype, &label);
     708        lbd.ops = &vbds_label_bd_ops;
     709        lbd.arg = (void *) disk;
     710
     711        rc = label_create(&lbd, ltype, &label);
    686712        if (rc != EOK)
    687713                goto error;
     
    695721        log_msg(LOG_DEFAULT, LVL_DEBUG, "vbds_label_create(%zu) - failure", sid);
    696722        if (disk->label == NULL) {
    697                 rc2 = label_open(sid, &label);
     723                lbd.ops = &vbds_label_bd_ops;
     724                lbd.arg = (void *) disk;
     725
     726                rc2 = label_open(&lbd, &label);
    698727                if (rc2 != EOK) {
    699728                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed to open label in disk %s.",
     
    713742        vbds_disk_t *disk;
    714743        label_t *label;
     744        label_bd_t lbd;
    715745        int rc;
    716746
     
    735765        disk->label = NULL;
    736766
    737         rc = label_open(disk->svc_id, &label);
     767        lbd.ops = &vbds_label_bd_ops;
     768        lbd.arg = (void *) disk;
     769
     770        rc = label_open(&lbd, &label);
    738771        if (rc != EOK) {
    739772                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed to open label in disk %s.",
     
    811844        if (rc != EOK) {
    812845                log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating partition.");
     846                goto error;
     847        }
     848
     849        rc = label_part_empty(lpart);
     850        if (rc != EOK) {
     851                log_msg(LOG_DEFAULT, LVL_ERROR, "Error emptying partition.");
    813852                goto error;
    814853        }
     
    11791218}
    11801219
     1220/** Get block size wrapper for liblabel */
     1221static int vbds_label_get_bsize(void *arg, size_t *bsize)
     1222{
     1223        vbds_disk_t *disk = (vbds_disk_t *)arg;
     1224        return block_get_bsize(disk->svc_id, bsize);
     1225}
     1226
     1227/** Get number of blocks wrapper for liblabel */
     1228static int vbds_label_get_nblocks(void *arg, aoff64_t *nblocks)
     1229{
     1230        vbds_disk_t *disk = (vbds_disk_t *)arg;
     1231        return block_get_nblocks(disk->svc_id, nblocks);
     1232}
     1233
     1234/** Read blocks wrapper for liblabel */
     1235static int vbds_label_read(void *arg, aoff64_t ba, size_t cnt, void *buf)
     1236{
     1237        vbds_disk_t *disk = (vbds_disk_t *)arg;
     1238        return block_read_direct(disk->svc_id, ba, cnt, buf);
     1239}
     1240
     1241/** Write blocks wrapper for liblabel */
     1242static int vbds_label_write(void *arg, aoff64_t ba, size_t cnt, const void *data)
     1243{
     1244        vbds_disk_t *disk = (vbds_disk_t *)arg;
     1245        return block_write_direct(disk->svc_id, ba, cnt, data);
     1246}
     1247
    11811248/** @}
    11821249 */
Note: See TracChangeset for help on using the changeset viewer.