Changeset 1626cd4 in mainline for uspace/srv


Ignore:
Timestamp:
2015-07-02T19:01:37Z (10 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.

Location:
uspace/srv
Files:
5 edited

Legend:

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

    r3faa03d r1626cd4  
    268268int vbds_disk_info(service_id_t sid, vbds_disk_info_t *info)
    269269{
     270        vbds_disk_t *disk;
     271        label_info_t linfo;
     272        int rc;
     273
    270274        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_disk_info(%zu)", sid);
    271         info->ltype = lt_mbr;
    272         return EOK;
    273 }
     275
     276        rc = vbds_disk_by_svcid(sid, &disk);
     277        if (rc != EOK)
     278                return rc;
     279
     280        rc = label_get_info(disk->label, &linfo);
     281
     282        info->ltype = linfo.ltype;
     283        info->ablock0 = linfo.ablock0;
     284        info->anblocks = linfo.anblocks;
     285        info->block_size = disk->block_size;
     286        return EOK;
     287}
     288
     289int vbds_get_parts(service_id_t sid, service_id_t *id_buf, size_t buf_size,
     290    size_t *act_size)
     291{
     292        vbds_disk_t *disk;
     293        size_t act_cnt;
     294        size_t buf_cnt;
     295        int rc;
     296
     297        rc = vbds_disk_by_svcid(sid, &disk);
     298        if (rc != EOK)
     299                return rc;
     300
     301        buf_cnt = buf_size / sizeof(service_id_t);
     302
     303        act_cnt = list_count(&disk->parts);
     304        *act_size = act_cnt * sizeof(service_id_t);
     305
     306        if (buf_size % sizeof(service_id_t) != 0)
     307                return EINVAL;
     308
     309        size_t pos = 0;
     310        list_foreach(disk->parts, ldisk, vbds_part_t, part) {
     311                if (pos < buf_cnt)
     312                        id_buf[pos] = part->id;
     313                pos++;
     314        }
     315
     316        return EOK;
     317}
     318
    274319
    275320int vbds_label_create(service_id_t sid, label_type_t ltype)
     
    328373{
    329374        vbds_part_t *part;
     375        label_part_info_t lpinfo;
    330376        int rc;
    331377
     
    334380                return rc;
    335381
     382        label_part_get_info(part->lpart, &lpinfo);
     383
     384        pinfo->index = lpinfo.index;
     385        pinfo->block0 = lpinfo.block0;
     386        pinfo->nblocks = lpinfo.nblocks;
    336387        return EOK;
    337388}
  • uspace/srv/bd/vbd/disk.h

    r3faa03d r1626cd4  
    4545extern int vbds_disk_remove(service_id_t);
    4646extern int vbds_disk_info(service_id_t, vbds_disk_info_t *);
     47extern int vbds_get_parts(service_id_t, service_id_t *, size_t, size_t *);
    4748extern int vbds_label_create(service_id_t, label_type_t);
    4849extern int vbds_label_delete(service_id_t);
  • uspace/srv/bd/vbd/types/vbd.h

    r3faa03d r1626cd4  
    4242#include <label.h>
    4343#include <loc.h>
     44#include <sys/types.h>
    4445#include <types/label.h>
    4546
     
    4849/** Disk info */
    4950typedef struct {
    50         /** Label */
    51         label_t *label;
    5251        /** Label type */
    5352        label_type_t ltype;
     53        /** First block that can be allocated */
     54        aoff64_t ablock0;
     55        /** Number of blocks that can be allocated */
     56        aoff64_t anblocks;
     57        /** Block size */
     58        size_t block_size;
    5459} vbds_disk_info_t;
    5560
     
    9297} vbds_disk_t;
    9398
     99/** Partition info */
    94100typedef struct {
     101        /** Partition index */
     102        int index;
     103        /** First block */
     104        aoff64_t block0;
     105        /** Number of blocks */
     106        aoff64_t nblocks;
    95107} vbds_part_info_t;
    96108
  • uspace/srv/bd/vbd/vbd.c

    r3faa03d r1626cd4  
    4040#include <ipc/vbd.h>
    4141#include <loc.h>
     42#include <macros.h>
    4243#include <stdio.h>
    4344#include <stdlib.h>
     
    112113        disk_sid = IPC_GET_ARG1(*icall);
    113114        rc = vbds_disk_info(disk_sid, &dinfo);
    114         async_answer_1(iid, (sysarg_t)rc, (sysarg_t)dinfo.ltype);
     115        if (rc != EOK) {
     116                log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() call failed");
     117                async_answer_0(iid, rc);
     118                return;
     119        }
     120
     121        log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() data_read_receive");
     122        ipc_callid_t callid;
     123        size_t size;
     124        if (!async_data_read_receive(&callid, &size)) {
     125                log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() failed");
     126                async_answer_0(callid, EREFUSED);
     127                async_answer_0(iid, EREFUSED);
     128                return;
     129        }
     130
     131        log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() check size");
     132        if (size != sizeof(vbds_disk_info_t)) {
     133                log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() wrong size");
     134                async_answer_0(callid, EINVAL);
     135                async_answer_0(iid, EINVAL);
     136                return;
     137        }
     138
     139        log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() data_read_finalize");
     140        rc = async_data_read_finalize(callid, &dinfo,
     141            min(size, sizeof(dinfo)));
     142        if (rc != EOK) {
     143                async_answer_0(callid, rc);
     144                async_answer_0(iid, rc);
     145                return;
     146        }
     147
     148        log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info() reply EOK");
     149        async_answer_0(iid, EOK);
    115150}
    116151
     
    143178static void vbds_label_get_parts_srv(ipc_callid_t iid, ipc_call_t *icall)
    144179{
    145 //      service_id_t disk_sid;
    146 //      int rc;
     180        ipc_callid_t callid;
     181        size_t size;
     182        size_t act_size;
     183        service_id_t sid;
     184        int rc;
    147185
    148186        log_msg(LOG_DEFAULT, LVL_NOTE, "vbds_label_get_parts_srv()");
    149187
    150 //      disk_sid = IPC_GET_ARG1(*icall);
    151 //      rc = vbds_label_delete(disk_sid);
    152 //      async_answer_0(iid, (sysarg_t) rc);
    153         async_answer_0(iid, ENOTSUP);
    154 }
     188        if (!async_data_read_receive(&callid, &size)) {
     189                async_answer_0(callid, EREFUSED);
     190                async_answer_0(iid, EREFUSED);
     191                return;
     192        }
     193
     194        sid = IPC_GET_ARG1(*icall);
     195
     196        category_id_t *id_buf = (category_id_t *) malloc(size);
     197        if (id_buf == NULL) {
     198                async_answer_0(callid, ENOMEM);
     199                async_answer_0(iid, ENOMEM);
     200                return;
     201        }
     202
     203        rc = vbds_get_parts(sid, id_buf, size, &act_size);
     204        if (rc != EOK) {
     205                async_answer_0(callid, rc);
     206                async_answer_0(iid, rc);
     207                return;
     208        }
     209
     210        sysarg_t retval = async_data_read_finalize(callid, id_buf, size);
     211        free(id_buf);
     212
     213        async_answer_1(iid, retval, act_size);
     214}
     215
    155216
    156217static void vbds_part_get_info_srv(ipc_callid_t iid, ipc_call_t *icall)
     
    164225        part = IPC_GET_ARG1(*icall);
    165226        rc = vbds_part_get_info(part, &pinfo);
    166         async_answer_0(iid, (sysarg_t)rc);
     227        async_answer_5(iid, (sysarg_t)rc, pinfo.index,
     228            LOWER32(pinfo.block0), UPPER32(pinfo.block0),
     229            LOWER32(pinfo.nblocks), UPPER32(pinfo.nblocks));
    167230}
    168231
  • uspace/srv/volsrv/disk.c

    r3faa03d r1626cd4  
    137137        assert(fibril_mutex_is_locked(&vol_disks_lock));
    138138
    139         log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_disk_add()");
     139        log_msg(LOG_DEFAULT, LVL_NOTE, "vol_disk_add()");
    140140        disk = vol_disk_new();
    141141        if (disk == NULL)
     
    158158
    159159                rc = vbd_disk_info(vbd, sid, &dinfo);
     160                log_msg(LOG_DEFAULT, LVL_NOTE, "Got disk info.");
    160161                if (rc != EOK) {
    161162                        log_msg(LOG_DEFAULT, LVL_NOTE, "Cannot get disk label "
Note: See TracChangeset for help on using the changeset viewer.