Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_node.c

    r96b02eb9 r44451ee  
    104104        bool free_vfs_node = false;
    105105        bool free_fs_node = false;
    106 
    107         fibril_mutex_lock(&nodes_mutex);
     106       
     107        fibril_mutex_lock(&nodes_mutex);
     108       
    108109        if (node->refcnt-- == 1) {
     110               
    109111                /*
    110112                 * We are dropping the last reference to this node.
    111113                 * Remove it from the VFS node hash table.
    112114                 */
     115               
    113116                unsigned long key[] = {
    114117                        [KEY_FS_HANDLE] = node->fs_handle,
     
    116119                        [KEY_INDEX] = node->index
    117120                };
     121               
    118122                hash_table_remove(&nodes, key, 3);
    119123                free_vfs_node = true;
     124               
    120125                if (!node->lnkcnt)
    121126                        free_fs_node = true;
    122127        }
    123         fibril_mutex_unlock(&nodes_mutex);
    124 
     128       
     129        fibril_mutex_unlock(&nodes_mutex);
     130       
    125131        if (free_fs_node) {
    126                 /*
     132               
     133                /*
    127134                 * The node is not visible in the file system namespace.
    128135                 * Free up its resources.
    129136                 */
    130                 int phone = vfs_grab_phone(node->fs_handle);
    131                 sysarg_t rc;
    132                 rc = async_req_2_0(phone, VFS_OUT_DESTROY,
    133                     (sysarg_t)node->devmap_handle, (sysarg_t)node->index);
     137               
     138                async_exch_t *exch = vfs_exchange_grab(node->fs_handle);
     139                sysarg_t rc = async_req_2_0(exch, VFS_OUT_DESTROY,
     140                    (sysarg_t) node->devmap_handle, (sysarg_t)node->index);
     141               
    134142                assert(rc == EOK);
    135                 vfs_release_phone(node->fs_handle, phone);
     143                vfs_exchange_release(exch);
    136144        }
     145       
    137146        if (free_vfs_node)
    138147                free(node);
     
    284293}
    285294
     295
     296/** Perform a remote node open operation.
     297 *
     298 * @return EOK on success or an error code from errno.h.
     299 *
     300 */
     301int vfs_open_node_remote(vfs_node_t *node)
     302{
     303        async_exch_t *exch = vfs_exchange_grab(node->fs_handle);
     304       
     305        ipc_call_t answer;
     306        aid_t req = async_send_2(exch, VFS_OUT_OPEN_NODE,
     307            (sysarg_t) node->devmap_handle, (sysarg_t) node->index, &answer);
     308       
     309        vfs_exchange_release(exch);
     310
     311        sysarg_t rc;
     312        async_wait_for(req, &rc);
     313       
     314        return rc;
     315}
     316
    286317/**
    287318 * @}
Note: See TracChangeset for help on using the changeset viewer.