Changeset 22fb7ab in mainline for uspace/srv/volsrv


Ignore:
Timestamp:
2015-06-26T16:15:31Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
28ed0d95
Parents:
1356f85a
Message:

Delegate disks to volsrv and labels to vbd.

Location:
uspace/srv/volsrv
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/volsrv/disk.c

    r1356f85a r22fb7ab  
    4242#include <stdlib.h>
    4343#include <str.h>
     44#include <vbd.h>
    4445
    4546#include "disk.h"
     
    4849static int vol_disk_add(service_id_t);
    4950
    50 static LIST_INITIALIZE(vol_disks);
     51static LIST_INITIALIZE(vol_disks); /* of vol_disk_t */
    5152static FIBRIL_MUTEX_INITIALIZE(vol_disks_lock);
     53static vbd_t *vbd;
    5254
    5355/** Check for new disk devices */
     
    113115
    114116        link_initialize(&disk->ldisks);
     117        disk->dcnt = dc_empty;
    115118
    116119        return disk;
     
    129132{
    130133        vol_disk_t *disk;
     134        vbd_disk_info_t dinfo;
    131135        int rc;
    132136
     
    147151
    148152        log_msg(LOG_DEFAULT, LVL_NOTE, "Probe disk %s", disk->svc_name);
    149 /*      rc = inetcfg_link_add(sid);
    150         if (rc != EOK) {
    151                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed configuring link "
    152                     "'%s'.\n", nlink->svc_name);
    153                 goto error;
    154         }
    155 */
     153
     154        rc = vbd_disk_add(vbd, sid);
     155        if (rc == EOK) {
     156                log_msg(LOG_DEFAULT, LVL_NOTE, "Disk %s accepted by VBD.",
     157                    disk->svc_name);
     158
     159                rc = vbd_disk_info(vbd, sid, &dinfo);
     160                if (rc != EOK) {
     161                        log_msg(LOG_DEFAULT, LVL_NOTE, "Cannot get disk label "
     162                            "information.");
     163                        rc = EIO;
     164                        goto error;
     165                }
     166
     167                disk->dcnt = dc_label;
     168                disk->ltype = dinfo.ltype;
     169        } else {
     170                log_msg(LOG_DEFAULT, LVL_NOTE, "Disk %s not accepted by VBD.",
     171                    disk->svc_name);
     172                disk->dcnt = dc_unknown;
     173        }
     174
    156175        list_append(&disk->ldisks, &vol_disks);
    157176
     
    168187}
    169188
     189int vol_disk_init(void)
     190{
     191        int rc;
     192
     193        rc = vbd_create(&vbd);
     194        if (rc != EOK) {
     195                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing VBD.");
     196                return EIO;
     197        }
     198
     199        return EOK;
     200}
     201
    170202int vol_disk_discovery_start(void)
    171203{
     
    182214}
    183215
     216/** Get list of disks as array of service IDs. */
     217int vol_disk_get_ids(service_id_t *id_buf, size_t buf_size, size_t *act_size)
     218{
     219        size_t act_cnt;
     220        size_t buf_cnt;
     221
     222        fibril_mutex_lock(&vol_disks_lock);
     223
     224        buf_cnt = buf_size / sizeof(service_id_t);
     225
     226        act_cnt = list_count(&vol_disks);
     227        *act_size = act_cnt * sizeof(service_id_t);
     228
     229        if (buf_size % sizeof(service_id_t) != 0) {
     230                fibril_mutex_unlock(&vol_disks_lock);
     231                return EINVAL;
     232        }
     233
     234        size_t pos = 0;
     235        list_foreach(vol_disks, ldisks, vol_disk_t, disk) {
     236                if (pos < buf_cnt)
     237                        id_buf[pos] = disk->svc_id;
     238                pos++;
     239        }
     240
     241        fibril_mutex_unlock(&vol_disks_lock);
     242        return EOK;
     243}
     244
     245int vol_disk_find_by_id(service_id_t sid, vol_disk_t **rdisk)
     246{
     247        list_foreach(vol_disks, ldisks, vol_disk_t, disk) {
     248                if (disk->svc_id == sid) {
     249                        *rdisk = disk;
     250                        /* XXX Add reference */
     251                        return EOK;
     252                }
     253        }
     254
     255        return ENOENT;
     256}
     257
    184258/** @}
    185259 */
  • uspace/srv/volsrv/disk.h

    r1356f85a r22fb7ab  
    3939
    4040#include <sys/types.h>
     41#include "types/disk.h"
    4142
     43extern int vol_disk_init(void);
    4244extern int vol_disk_discovery_start(void);
     45extern int vol_disk_get_ids(service_id_t *, size_t, size_t *);
     46extern int vol_disk_find_by_id(service_id_t, vol_disk_t **);
    4347
    4448#endif
  • uspace/srv/volsrv/types/disk.h

    r1356f85a r22fb7ab  
    3838#define TYPES_DISK_H_
    3939
     40#include <types/label.h>
     41
    4042/** Disk */
    4143typedef struct {
     
    4648        /** Service name */
    4749        char *svc_name;
     50        /** Disk contents */
     51        label_disk_cnt_t dcnt;
     52        /** Label type */
     53        label_type_t ltype;
    4854} vol_disk_t;
    4955
  • uspace/srv/volsrv/volsrv.c

    r1356f85a r22fb7ab  
    3838#include <io/log.h>
    3939#include <ipc/services.h>
     40#include <ipc/vol.h>
    4041#include <loc.h>
    4142#include <stdio.h>
     
    5455        log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_init()");
    5556
     57        rc = vol_disk_init();
     58        if (rc != EOK)
     59                return rc;
     60
    5661        rc = vol_disk_discovery_start();
    5762        if (rc != EOK)
     
    7681}
    7782
     83static void vol_get_disks_srv(ipc_callid_t iid, ipc_call_t *icall)
     84{
     85        ipc_callid_t callid;
     86        size_t size;
     87        size_t act_size;
     88        int rc;
     89
     90        if (!async_data_read_receive(&callid, &size)) {
     91                async_answer_0(callid, EREFUSED);
     92                async_answer_0(iid, EREFUSED);
     93                return;
     94        }
     95
     96        service_id_t *id_buf = (service_id_t *) malloc(size);
     97        if (id_buf == NULL) {
     98                async_answer_0(callid, ENOMEM);
     99                async_answer_0(iid, ENOMEM);
     100                return;
     101        }
     102
     103        rc = vol_disk_get_ids(id_buf, size, &act_size);
     104        if (rc != EOK) {
     105                async_answer_0(callid, rc);
     106                async_answer_0(iid, rc);
     107                return;
     108        }
     109
     110        sysarg_t retval = async_data_read_finalize(callid, id_buf, size);
     111        free(id_buf);
     112
     113        async_answer_1(iid, retval, act_size);
     114}
     115
     116static void vol_disk_info_srv(ipc_callid_t iid, ipc_call_t *icall)
     117{
     118        service_id_t sid;
     119        vol_disk_t *disk;
     120        int rc;
     121
     122        sid = IPC_GET_ARG1(*icall);
     123        rc = vol_disk_find_by_id(sid, &disk);
     124        if (rc != EOK) {
     125                async_answer_0(iid, ENOENT);
     126                return;
     127        }
     128
     129        async_answer_2(iid, rc, disk->dcnt, disk->ltype);
     130}
     131
     132static void vol_label_create_srv(ipc_callid_t iid, ipc_call_t *icall)
     133{
     134        service_id_t sid;
     135        vol_disk_t *disk;
     136        label_type_t ltype;
     137        int rc;
     138
     139        sid = IPC_GET_ARG1(*icall);
     140        ltype = IPC_GET_ARG2(*icall);
     141
     142        rc = vol_disk_find_by_id(sid, &disk);
     143        if (rc != EOK) {
     144                async_answer_0(iid, ENOENT);
     145                return;
     146        }
     147
     148        disk->dcnt = dc_label;
     149        disk->ltype = ltype;
     150
     151        async_answer_0(iid, EOK);
     152}
     153
     154static void vol_disk_empty_srv(ipc_callid_t iid, ipc_call_t *icall)
     155{
     156        service_id_t sid;
     157        vol_disk_t *disk;
     158        int rc;
     159
     160        sid = IPC_GET_ARG1(*icall);
     161
     162        rc = vol_disk_find_by_id(sid, &disk);
     163        if (rc != EOK) {
     164                async_answer_0(iid, ENOENT);
     165                return;
     166        }
     167
     168        disk->dcnt = dc_empty;
     169
     170        async_answer_0(iid, EOK);
     171}
    78172
    79173static void vol_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     
    96190
    97191                switch (method) {
     192                case VOL_GET_DISKS:
     193                        vol_get_disks_srv(callid, &call);
     194                        break;
     195                case VOL_DISK_INFO:
     196                        vol_disk_info_srv(callid, &call);
     197                        break;
     198                case VOL_LABEL_CREATE:
     199                        vol_label_create_srv(callid, &call);
     200                        break;
     201                case VOL_DISK_EMPTY:
     202                        vol_disk_empty_srv(callid, &call);
     203                        break;
    98204                default:
    99205                        async_answer_0(callid, EINVAL);
Note: See TracChangeset for help on using the changeset viewer.