Changeset b0f00a9 in mainline for uspace/srv/vfs/vfs_node.c


Ignore:
Timestamp:
2011-11-06T22:21:05Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
898e847
Parents:
2bdf8313 (diff), 7b5f4c9 (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 mainline changes.

File:
1 edited

Legend:

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

    r2bdf8313 rb0f00a9  
    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,
    115                         [KEY_DEV_HANDLE] = node->devmap_handle,
     118                        [KEY_DEV_HANDLE] = node->service_id,
    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->service_id, (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);
     
    151160        unsigned long key[] = {
    152161                [KEY_FS_HANDLE] = node->fs_handle,
    153                 [KEY_DEV_HANDLE] = node->devmap_handle,
     162                [KEY_DEV_HANDLE] = node->service_id,
    154163                [KEY_INDEX] = node->index
    155164        };
     
    175184        unsigned long key[] = {
    176185                [KEY_FS_HANDLE] = result->triplet.fs_handle,
    177                 [KEY_DEV_HANDLE] = result->triplet.devmap_handle,
     186                [KEY_DEV_HANDLE] = result->triplet.service_id,
    178187                [KEY_INDEX] = result->triplet.index
    179188        };
     
    191200                memset(node, 0, sizeof(vfs_node_t));
    192201                node->fs_handle = result->triplet.fs_handle;
    193                 node->devmap_handle = result->triplet.devmap_handle;
     202                node->service_id = result->triplet.service_id;
    194203                node->index = result->triplet.index;
    195204                node->size = result->size;
     
    243252        vfs_node_t *node = hash_table_get_instance(item, vfs_node_t, nh_link);
    244253        return (node->fs_handle == (fs_handle_t) key[KEY_FS_HANDLE]) &&
    245             (node->devmap_handle == key[KEY_DEV_HANDLE]) &&
     254            (node->service_id == key[KEY_DEV_HANDLE]) &&
    246255            (node->index == key[KEY_INDEX]);
    247256}
     
    255264        unsigned refcnt;
    256265        fs_handle_t fs_handle;
    257         devmap_handle_t devmap_handle;
     266        service_id_t service_id;
    258267};
    259268
     
    264273
    265274        if ((node->fs_handle == rd->fs_handle) &&
    266             (node->devmap_handle == rd->devmap_handle))
     275            (node->service_id == rd->service_id))
    267276                rd->refcnt += node->refcnt;
    268277}
    269278
    270279unsigned
    271 vfs_nodes_refcount_sum_get(fs_handle_t fs_handle, devmap_handle_t devmap_handle)
     280vfs_nodes_refcount_sum_get(fs_handle_t fs_handle, service_id_t service_id)
    272281{
    273282        struct refcnt_data rd = {
    274283                .refcnt = 0,
    275284                .fs_handle = fs_handle,
    276                 .devmap_handle = devmap_handle
     285                .service_id = service_id
    277286        };
    278287
     
    282291
    283292        return rd.refcnt;
     293}
     294
     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->service_id, (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;
    284315}
    285316
Note: See TracChangeset for help on using the changeset viewer.