Changeset efd4a72 in mainline for uspace/lib/libfs/libfs.c


Ignore:
Timestamp:
2007-12-16T16:25:26Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0c82d28
Parents:
74303b6
Message:

VFS work.
Move FS registration code to libfs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libfs/libfs.c

    r74303b6 refd4a72  
    3636
    3737#include "libfs.h"
     38#include "../../srv/vfs/vfs.h"
     39#include <errno.h>
     40#include <async.h>
     41#include <ipc/ipc.h>
     42#include <as.h>
     43
     44/** Register file system server.
     45 *
     46 * This function abstracts away the tedious registration protocol from
     47 * file system implementations and lets them to reuse this registration glue
     48 * code.
     49 *
     50 * @param vfs_phone     Open phone for communication with VFS.
     51 * @param reg           File system registration structure. It will be
     52 *                      initialized by this function.
     53 * @param info          VFS info structure supplied by the file system
     54 *                      implementation.
     55 * @param conn          Connection fibril for handling all calls originating in
     56 *                      VFS.
     57 *
     58 * @return              EOK on success or a non-zero error code on errror.
     59 */
     60int fs_register(int vfs_phone, fs_reg_t *reg, vfs_info_t *info,
     61    async_client_conn_t conn)
     62{
     63        /*
     64         * Tell VFS that we are here and want to get registered.
     65         * We use the async framework because VFS will answer the request
     66         * out-of-order, when it knows that the operation succeeded or failed.
     67         */
     68        ipc_call_t answer;
     69        aid_t req = async_send_0(vfs_phone, VFS_REGISTER, &answer);
     70
     71        /*
     72         * Send our VFS info structure to VFS.
     73         */
     74        int rc = ipc_data_send(vfs_phone, info, sizeof(*info));
     75        if (rc != EOK) {
     76                async_wait_for(req, NULL);
     77                return rc;
     78        }
     79
     80        /*
     81         * Ask VFS for callback connection.
     82         */
     83        ipc_connect_to_me(vfs_phone, 0, 0, 0, &reg->vfs_phonehash);
     84
     85        /*
     86         * Allocate piece of address space for PLB.
     87         */
     88        reg->plb_ro = as_get_mappable_page(PLB_SIZE);
     89        if (!reg->plb_ro) {
     90                async_wait_for(req, NULL);
     91                return ENOMEM;
     92        }
     93
     94        /*
     95         * Request sharing the Path Lookup Buffer with VFS.
     96         */
     97        rc = ipc_call_sync_2_0(vfs_phone, IPC_M_AS_AREA_RECV,
     98            (ipcarg_t) reg->plb_ro, PLB_SIZE);
     99        if (rc) {
     100                async_wait_for(req, NULL);
     101                return rc;
     102        }
     103         
     104        /*
     105         * Pick up the answer for the request to the VFS_REQUEST call.
     106         */
     107        async_wait_for(req, NULL);
     108        reg->fs_handle = (int) IPC_GET_ARG1(answer);
     109       
     110        /*
     111         * Create a connection fibril to handle the callback connection.
     112         */
     113        async_new_connection(reg->vfs_phonehash, 0, NULL, conn);
     114       
     115        /*
     116         * Tell the async framework that other connections are to be handled by
     117         * the same connection fibril as well.
     118         */
     119        async_set_client_connection(conn);
     120
     121        return IPC_GET_RETVAL(answer);
     122}
    38123
    39124/** @}
Note: See TracChangeset for help on using the changeset viewer.