Changeset 4285f384 in mainline for uspace/srv/volsrv


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/volsrv
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • 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.