Ignore:
File:
1 edited

Legend:

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

    rfafb8e5 r4285f384  
    11/*
    2  * Copyright (c) 2016 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3535
    3636#include <adt/list.h>
     37#include <bd.h>
    3738#include <bd_srv.h>
    3839#include <block.h>
     
    5152#include "types/vbd.h"
    5253
     54loc_srv_t *vbds_srv;
     55
    5356static fibril_mutex_t vbds_disks_lock;
    5457static list_t vbds_disks; /* of vbds_disk_t */
     
    6972static errno_t vbds_bd_get_block_size(bd_srv_t *, size_t *);
    7073static errno_t vbds_bd_get_num_blocks(bd_srv_t *, aoff64_t *);
     74static errno_t vbds_bd_eject(bd_srv_t *);
    7175
    7276static errno_t vbds_bsa_translate(vbds_part_t *, aoff64_t, size_t, aoff64_t *);
     
    9195        .write_blocks = vbds_bd_write_blocks,
    9296        .get_block_size = vbds_bd_get_block_size,
    93         .get_num_blocks = vbds_bd_get_num_blocks
     97        .get_num_blocks = vbds_bd_get_num_blocks,
     98        .eject = vbds_bd_eject
    9499};
    95100
     
    497502
    498503        log_msg(LOG_DEFAULT, LVL_DEBUG, "block_init(%zu)", sid);
    499         rc = block_init(sid, 2048);
     504        rc = block_init(sid);
    500505        if (rc != EOK) {
    501506                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed opening block device %s.",
     
    579584        log_msg(LOG_DEFAULT, LVL_DEBUG, "block_fini(%zu)", sid);
    580585        block_fini(sid);
     586        free(disk->svc_name);
    581587        free(disk);
    582588        return EOK;
     
    10691075}
    10701076
     1077static errno_t vbds_bd_eject(bd_srv_t *bd)
     1078{
     1079        vbds_part_t *part = bd_srv_part(bd);
     1080        async_sess_t *sess;
     1081        bd_t *bdc;
     1082        errno_t rc;
     1083
     1084        log_msg(LOG_DEFAULT, LVL_DEBUG, "vbds_bd_eject()");
     1085
     1086        fibril_rwlock_read_lock(&part->lock);
     1087
     1088        sess = loc_service_connect(part->disk->svc_id, INTERFACE_BLOCK, 0);
     1089        if (sess == NULL) {
     1090                log_msg(LOG_DEFAULT, LVL_WARN,
     1091                    "vbds_bd_eject() - failed connect");
     1092                fibril_rwlock_read_unlock(&part->lock);
     1093                return EIO;
     1094        }
     1095
     1096        rc = bd_open(sess, &bdc);
     1097        if (rc != EOK) {
     1098                log_msg(LOG_DEFAULT, LVL_WARN,
     1099                    "vbds_bd_eject() - failed open");
     1100                async_hangup(sess);
     1101                fibril_rwlock_read_unlock(&part->lock);
     1102                return EIO;
     1103        }
     1104
     1105        rc = bd_eject(bdc);
     1106
     1107        bd_close(bdc);
     1108        async_hangup(sess);
     1109
     1110        fibril_rwlock_read_unlock(&part->lock);
     1111        return rc;
     1112}
     1113
    10711114void vbds_bd_conn(ipc_call_t *icall, void *arg)
    10721115{
     
    11221165        log_msg(LOG_DEFAULT, LVL_DEBUG, "loc_service_register('%s')",
    11231166            name);
    1124         rc = loc_service_register(name, &psid);
     1167        rc = loc_service_register(vbds_srv, name, &psid);
    11251168        if (rc != EOK) {
    11261169                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering "
     
    11311174        }
    11321175
    1133         rc = loc_service_add_to_cat(psid, part_cid);
     1176        rc = loc_service_add_to_cat(vbds_srv, psid, part_cid);
    11341177        if (rc != EOK) {
    11351178                log_msg(LOG_DEFAULT, LVL_ERROR, "Failled adding partition "
     
    11381181                free(part);
    11391182
    1140                 rc = loc_service_unregister(psid);
     1183                rc = loc_service_unregister(vbds_srv, psid);
    11411184                if (rc != EOK) {
    11421185                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error unregistering "
     
    11601203            "disk->svc_name='%s', id=%zu)", part->disk->svc_name, part->svc_id);
    11611204
    1162         rc = loc_service_unregister(part->svc_id);
     1205        rc = loc_service_unregister(vbds_srv, part->svc_id);
    11631206        if (rc != EOK)
    11641207                return EIO;
Note: See TracChangeset for help on using the changeset viewer.