Changeset 4285f384 in mainline for uspace/srv


Ignore:
Timestamp:
2025-02-25T20:25:43Z (8 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
d30e067, f35749e
Parents:
d231a54
Message:

Allow physically ejecting CD-ROM using vol eject -s

Location:
uspace/srv
Files:
6 edited

Legend:

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

    rd231a54 r4285f384  
    11/*
    2  * Copyright (c) 2024 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>
     
    7172static errno_t vbds_bd_get_block_size(bd_srv_t *, size_t *);
    7273static errno_t vbds_bd_get_num_blocks(bd_srv_t *, aoff64_t *);
     74static errno_t vbds_bd_eject(bd_srv_t *);
    7375
    7476static errno_t vbds_bsa_translate(vbds_part_t *, aoff64_t, size_t, aoff64_t *);
     
    9395        .write_blocks = vbds_bd_write_blocks,
    9496        .get_block_size = vbds_bd_get_block_size,
    95         .get_num_blocks = vbds_bd_get_num_blocks
     97        .get_num_blocks = vbds_bd_get_num_blocks,
     98        .eject = vbds_bd_eject
    9699};
    97100
     
    10701073
    10711074        return EOK;
     1075}
     1076
     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;
    10721112}
    10731113
  • uspace/srv/system/system.c

    rd231a54 r4285f384  
    533533
    534534        for (i = 0; i < nparts; i++) {
    535                 rc = vol_part_eject(vol, part_ids[i]);
     535                rc = vol_part_eject(vol, part_ids[i], vef_none);
    536536                if (rc != EOK) {
    537537                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error ejecting "
  • uspace/srv/volsrv/meson.build

    rd231a54 r4285f384  
    11#
    2 # Copyright (c) 2015 Jiri Svoboda
     2# Copyright (c) 2025 Jiri Svoboda
    33# All rights reserved.
    44#
     
    2727#
    2828
    29 deps = [ 'block', 'label', 'sif' ]
     29deps = [ 'block', 'device', 'label', 'sif' ]
    3030
    3131src = files(
  • uspace/srv/volsrv/part.c

    rd231a54 r4285f384  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3636
    3737#include <adt/list.h>
     38#include <bd.h>
    3839#include <errno.h>
    3940#include <fibril_synch.h>
     
    642643}
    643644
    644 errno_t vol_part_eject_part(vol_part_t *part)
     645static errno_t vol_part_eject_device(service_id_t svcid)
     646{
     647        async_sess_t *sess;
     648        errno_t rc;
     649        bd_t *bd;
     650
     651        log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_device(%zu)",
     652            (size_t)svcid);
     653
     654        sess = loc_service_connect(svcid, INTERFACE_BLOCK, 0);
     655        if (sess == NULL)
     656                return EIO;
     657
     658        rc = bd_open(sess, &bd);
     659        if (rc != EOK) {
     660                async_hangup(sess);
     661                return EIO;
     662        }
     663
     664        rc = bd_eject(bd);
     665        if (rc != EOK) {
     666                log_msg(LOG_DEFAULT, LVL_WARN, "vol_part_eject_device(): "
     667                    "eject fail");
     668                bd_close(bd);
     669                async_hangup(sess);
     670                return EIO;
     671        }
     672
     673        bd_close(bd);
     674        async_hangup(sess);
     675        return EOK;
     676}
     677
     678errno_t vol_part_eject_part(vol_part_t *part, vol_eject_flags_t flags)
    645679{
    646680        int rc;
     
    667701                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed deleting "
    668702                            "mount directory %s.", part->cur_mp);
     703                }
     704        }
     705
     706        if ((flags & vef_physical) != 0) {
     707                rc = vol_part_eject_device(part->svc_id);
     708                if (rc != EOK) {
     709                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed physically "
     710                            "ejecting device %s.", part->svc_name);
    669711                }
    670712        }
     
    819861
    820862        if (part->cur_mp != NULL) {
    821                 rc = vol_part_eject_part(part);
     863                rc = vol_part_eject_part(part, vef_none);
    822864                if (rc != EOK)
    823865                        return rc;
  • uspace/srv/volsrv/part.h

    rd231a54 r4285f384  
    11/*
    2  * Copyright (c) 2015 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5555    vol_part_t **);
    5656extern void vol_part_del_ref(vol_part_t *);
    57 extern errno_t vol_part_eject_part(vol_part_t *);
     57extern errno_t vol_part_eject_part(vol_part_t *, vol_eject_flags_t);
    5858extern errno_t vol_part_empty_part(vol_part_t *);
    5959extern errno_t vol_part_insert_part(vol_part_t *);
  • uspace/srv/volsrv/volsrv.c

    rd231a54 r4285f384  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    205205{
    206206        service_id_t sid;
     207        vol_eject_flags_t flags;
    207208        vol_part_t *part;
    208209        errno_t rc;
    209210
    210211        sid = ipc_get_arg1(icall);
    211         log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_srv(%zu)", sid);
     212        flags = ipc_get_arg2(icall);
     213
     214        log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_srv(%zu, %x)",
     215            sid, flags);
    212216
    213217        rc = vol_part_find_by_id_ref(parts, sid, &part);
     
    217221        }
    218222
    219         rc = vol_part_eject_part(part);
     223        rc = vol_part_eject_part(part, flags);
    220224        if (rc != EOK) {
    221225                async_answer_0(icall, EIO);
Note: See TracChangeset for help on using the changeset viewer.