Changeset 22fb7ab in mainline for uspace/srv/volsrv/disk.c


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:
28ed0d9
Parents:
1356f85a
Message:

Delegate disks to volsrv and labels to vbd.

File:
1 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 */
Note: See TracChangeset for help on using the changeset viewer.