Changeset d30e067 in mainline for uspace/srv


Ignore:
Timestamp:
2025-03-02T20:02:33Z (10 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
8cdf360
Parents:
7debda3 (diff), 4285f384 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge 'upstream/master' into helenraid-para

Location:
uspace/srv
Files:
17 edited

Legend:

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

    r7debda3 rd30e067  
    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/devman/dev.c

    r7debda3 rd30e067  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2010 Lenka Trochtova
    34 * All rights reserved.
     
    5051        refcount_init(&dev->refcnt);
    5152        list_initialize(&dev->functions);
     53        fibril_mutex_initialize(&dev->state_lock);
     54        fibril_condvar_initialize(&dev->state_cv);
    5255        link_initialize(&dev->driver_devices);
    5356
     
    8790        if (refcount_down(&dev->refcnt))
    8891                delete_dev_node(dev);
     92}
     93
     94/** Wait until the device node enters stable state.
     95 *
     96 * @param dev Device node
     97 */
     98void dev_wait_stable(dev_node_t *dev)
     99{
     100        fibril_mutex_lock(&dev->state_lock);
     101        while (dev->state == DEVICE_ATTACHING)
     102                fibril_condvar_wait(&dev->state_cv, &dev->state_lock);
     103        fibril_mutex_unlock(&dev->state_lock);
    89104}
    90105
  • uspace/srv/devman/dev.h

    r7debda3 rd30e067  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2010 Lenka Trochtova
    3  * Copyright (c) 2013 Jiri Svoboda
    44 * All rights reserved.
    55 *
     
    4141extern void dev_add_ref(dev_node_t *);
    4242extern void dev_del_ref(dev_node_t *);
     43extern void dev_wait_stable(dev_node_t *);
    4344
    4445extern dev_node_t *find_dev_node_no_lock(dev_tree_t *tree,
  • uspace/srv/devman/devman.h

    r7debda3 rd30e067  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2010 Lenka Trochtova
    3  * Copyright (c) 2011 Jiri Svoboda
    44 * All rights reserved.
    55 *
     
    105105typedef enum {
    106106        DEVICE_NOT_INITIALIZED = 0,
     107        DEVICE_ATTACHING,
    107108        DEVICE_USABLE,
    108109        DEVICE_NOT_PRESENT,
     
    129130        /** The state of the device. */
    130131        device_state_t state;
     132        /** Protect device state field */
     133        fibril_mutex_t state_lock;
     134        /** Signalled when device state changes */
     135        fibril_condvar_t state_cv;
    131136        /** Link to list of devices owned by driver (driver_t.devices) */
    132137        link_t driver_devices;
  • uspace/srv/devman/devtree.c

    r7debda3 rd30e067  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2010 Lenka Trochtova
    34 * All rights reserved.
     
    314315}
    315316
     317/** Wait for device tree to stabilize.
     318 *
     319 * Blocks until the entire device tree had a chance to finish attaching
     320 * all devices.
     321 *
     322 * @param tree Device tree
     323 */
     324void dev_tree_wait_stable(dev_tree_t *tree)
     325{
     326        dev_wait_stable(tree->root_node->child);
     327}
     328
    316329/** @}
    317330 */
  • uspace/srv/devman/devtree.h

    r7debda3 rd30e067  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2010 Lenka Trochtova
    3  * Copyright (c) 2013 Jiri Svoboda
    44 * All rights reserved.
    55 *
     
    4545extern bool insert_fun_node(dev_tree_t *, fun_node_t *, char *, dev_node_t *);
    4646extern void remove_fun_node(dev_tree_t *, fun_node_t *);
     47extern void dev_tree_wait_stable(dev_tree_t *);
    4748
    4849#endif
  • uspace/srv/devman/driver.c

    r7debda3 rd30e067  
    11/*
    2  * Copyright (c) 2018 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * Copyright (c) 2010 Lenka Trochtova
    44 * All rights reserved.
     
    284284        dev->drv = drv;
    285285        dev->passed_to_driver = false;
    286         dev->state = DEVICE_NOT_INITIALIZED;
     286        fibril_mutex_lock(&dev->state_lock);
     287        dev->state = DEVICE_ATTACHING;
     288        fibril_mutex_unlock(&dev->state_lock);
     289        fibril_condvar_broadcast(&dev->state_cv);
    287290        list_append(&dev->driver_devices, &drv->devices);
    288291
     
    631634void add_device(driver_t *drv, dev_node_t *dev, dev_tree_t *tree)
    632635{
     636        link_t *link;
     637        fun_node_t *fun;
     638
    633639        /*
    634640         * We do not expect to have driver's mutex locked as we do not
     
    664670                async_wait_for(req, &rc);
    665671        }
     672
     673        if (rc == EOK) {
     674                log_msg(LOG_DEFAULT, LVL_DEBUG, "Device was added. Wait for "
     675                    "child functions' devices to stabilize.");
     676                fibril_rwlock_read_lock(&tree->rwlock);
     677                link = list_first(&dev->functions);
     678                while (link != NULL) {
     679                        fun = list_get_instance(link, fun_node_t,
     680                            dev_functions);
     681
     682                        if (fun->child != NULL) {
     683                                log_msg(LOG_DEFAULT, LVL_DEBUG2, "Wait for "
     684                                    "child device %p.", (void *)fun->child);
     685                                fun_add_ref(fun);
     686                                fibril_rwlock_read_unlock(&tree->rwlock);
     687                                dev_wait_stable(fun->child);
     688                                fibril_rwlock_read_lock(&tree->rwlock);
     689                                fun_del_ref(fun);
     690                        }
     691
     692                        link = list_next(link, &dev->functions);
     693                }
     694
     695                fibril_rwlock_read_unlock(&tree->rwlock);
     696                log_msg(LOG_DEFAULT, LVL_DEBUG,
     697                    "Finished waiting for children.");
     698        }
     699
     700        fibril_mutex_lock(&dev->state_lock);
    666701
    667702        switch (rc) {
     
    677712        }
    678713
     714        fibril_mutex_unlock(&dev->state_lock);
     715        fibril_condvar_broadcast(&dev->state_cv);
     716
    679717        dev->passed_to_driver = true;
    680718}
  • uspace/srv/devman/drv_conn.c

    r7debda3 rd30e067  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * Copyright (c) 2010 Lenka Trochtova
    44 * All rights reserved.
     
    453453        fun_busy_unlock(fun);
    454454        fun_del_ref(fun);
     455        async_answer_0(icall, EOK);
     456}
     457
     458/** Wait for function to become stable.
     459 *
     460 */
     461static void devman_drv_fun_wait_stable(ipc_call_t *icall, driver_t *drv)
     462{
     463        fun_node_t *fun;
     464        dev_node_t *dev;
     465
     466        fibril_rwlock_read_lock(&device_tree.rwlock);
     467
     468        fun = find_fun_node(&device_tree, ipc_get_arg1(icall));
     469        if (fun == NULL) {
     470                fibril_rwlock_read_unlock(&device_tree.rwlock);
     471                async_answer_0(icall, ENOENT);
     472                return;
     473        }
     474
     475        if (fun->child == NULL) {
     476                fibril_rwlock_read_unlock(&device_tree.rwlock);
     477                fun_del_ref(fun);
     478                async_answer_0(icall, EOK);
     479                return;
     480        }
     481
     482        dev = fun->child;
     483        dev_add_ref(dev);
     484
     485        fibril_rwlock_read_unlock(&device_tree.rwlock);
     486
     487        dev_wait_stable(dev);
     488        dev_del_ref(dev);
     489
    455490        async_answer_0(icall, EOK);
    456491}
     
    642677                        devman_drv_fun_offline(&call, driver);
    643678                        break;
     679                case DEVMAN_DRV_FUN_WAIT_STABLE:
     680                        devman_drv_fun_wait_stable(&call, driver);
     681                        break;
    644682                case DEVMAN_REMOVE_FUNCTION:
    645683                        devman_remove_function(&call);
  • uspace/srv/devman/main.c

    r7debda3 rd30e067  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * Copyright (c) 2010 Lenka Trochtova
    44 * All rights reserved.
     
    369369
    370370        printf("%s: Accepting connections.\n", NAME);
     371        log_msg(LOG_DEFAULT, LVL_NOTE, "Wait for device tree to stabilize.");
     372        dev_tree_wait_stable(&device_tree);
     373        log_msg(LOG_DEFAULT, LVL_NOTE, "Device tree stable.");
    371374        task_retval(0);
    372375        async_manager();
  • uspace/srv/loader/main.c

    r7debda3 rd30e067  
    300300
    301301#ifdef CONFIG_RTLD
    302         if (prog_info.env) {
    303                 pcb.tcb = rtld_tls_make(prog_info.env);
    304         } else {
    305                 pcb.tcb = tls_make(prog_info.finfo.base);
    306         }
     302        assert(prog_info.env != NULL);
     303        pcb.tcb = rtld_tls_make(prog_info.env);
    307304#else
    308305        pcb.tcb = tls_make(prog_info.finfo.base);
  • uspace/srv/logger/logs.c

    r7debda3 rd30e067  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2012 Vojtech Horky
    34 * All rights reserved.
     
    5556        if (result == NULL)
    5657                return ENOMEM;
    57         if (asprintf(&result->filename, "/log/%s", name) < 0) {
     58        if (asprintf(&result->filename, "/log/%s.txt", name) < 0) {
    5859                free(result);
    5960                return ENOMEM;
  • uspace/srv/system/system.c

    r7debda3 rd30e067  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * Copyright (c) 2005 Martin Decky
    44 * All rights reserved.
     
    382382                printf("%s: System volume is configured.\n", NAME);
    383383
    384                 /* Wait until system volume is mounted */
     384                /* Verify that system volume is mounted */
    385385                sv_mounted = false;
    386386
    387                 while (true) {
    388                         rc = vol_get_parts(vol, &part_ids, &nparts);
     387                rc = vol_get_parts(vol, &part_ids, &nparts);
     388                if (rc != EOK) {
     389                        printf("Error getting list of volumes.\n");
     390                        goto error;
     391                }
     392
     393                for (i = 0; i < nparts; i++) {
     394                        rc = vol_part_info(vol, part_ids[i], &pinfo);
    389395                        if (rc != EOK) {
    390                                 printf("Error getting list of volumes.\n");
     396                                printf("Error getting partition "
     397                                    "information.\n");
     398                                rc = EIO;
    391399                                goto error;
    392400                        }
    393401
    394                         for (i = 0; i < nparts; i++) {
    395                                 rc = vol_part_info(vol, part_ids[i], &pinfo);
    396                                 if (rc != EOK) {
    397                                         printf("Error getting partition "
    398                                             "information.\n");
    399                                         rc = EIO;
    400                                         goto error;
    401                                 }
    402 
    403                                 if (str_cmp(pinfo.cur_mp, "/w") == 0) {
    404                                         sv_mounted = true;
    405                                         break;
    406                                 }
     402                        if (str_cmp(pinfo.cur_mp, "/w") == 0) {
     403                                sv_mounted = true;
     404                                break;
    407405                        }
    408 
    409                         if (sv_mounted)
    410                                 break;
    411 
    412                         free(part_ids);
    413                         part_ids = NULL;
    414 
    415                         fibril_sleep(1);
    416                         printf("Sleeping(1) for system volume.\n");
    417                 }
     406                }
     407
     408                if (sv_mounted == false) {
     409                        printf("System volume not found.\n");
     410                        rc = EIO;
     411                        goto error;
     412                }
     413
     414                free(part_ids);
     415                part_ids = NULL;
     416
    418417        }
    419418
     
    535534
    536535        for (i = 0; i < nparts; i++) {
    537                 rc = vol_part_eject(vol, part_ids[i]);
     536                rc = vol_part_eject(vol, part_ids[i], vef_none);
    538537                if (rc != EOK) {
    539538                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error ejecting "
  • uspace/srv/vfs/vfs_register.c

    r7debda3 rd30e067  
    369369        }
    370370
    371         fstypes->fstypes = calloc(sizeof(char *), count);
     371        fstypes->fstypes = calloc(count, sizeof(char *));
    372372        if (fstypes->fstypes == NULL) {
    373373                free(fstypes->buf);
  • uspace/srv/volsrv/meson.build

    r7debda3 rd30e067  
    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

    r7debda3 rd30e067  
    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

    r7debda3 rd30e067  
    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

    r7debda3 rd30e067  
    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.