Changeset ec01adf in mainline for uspace/srv/vfs/vfs_open.c


Ignore:
Timestamp:
2007-11-03T17:16:47Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3e56ab9
Parents:
828d215
Message:

VFS work.
Start implementing VFS side of VFS_OPEN.
Add vfs_node.c to contain VFS node related internal functions.

File:
1 edited

Legend:

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

    r828d215 rec01adf  
    3232
    3333/**
    34  * @file        vfs.c
     34 * @file        vfs_open.c
    3535 * @brief       VFS_OPEN method.
    3636 */
     
    6767static bool vfs_conn_open_files_init(void)
    6868{
     69        /*
     70         * Optimized fast path that will never go to sleep unnecessarily.
     71         * The assumption is that once files is non-zero, it will never be zero
     72         * again.
     73         */
     74        if (files)
     75                return true;
     76               
    6977        futex_down(&files_futex);
    7078        if (!files) {
     
    8694                return;
    8795        }
     96
     97        /*
     98         * The POSIX interface is open(path, flags, mode).
     99         * We can receive flags and mode along with the VFS_OPEN call; the path
     100         * will need to arrive in another call.
     101         */
     102        int flags = IPC_GET_ARG1(*request);
     103        int mode = IPC_GET_ARG2(*request);
     104        size_t size;
     105
     106        ipc_callid_t callid;
     107        ipc_call_t call;
     108
     109        if (!ipc_data_receive(&callid, &call, NULL, &size)) {
     110                ipc_answer_fast_0(callid, EINVAL);
     111                ipc_answer_fast_0(rid, EINVAL);
     112                return;
     113        }
     114
     115        /*
     116         * Now we are on the verge of accepting the path.
     117         *
     118         * There is one optimization we could do in the future: copy the path
     119         * directly into the PLB using some kind of a callback.
     120         */
     121        char *path = malloc(size);
     122       
     123        if (!path) {
     124                ipc_answer_fast_0(callid, ENOMEM);
     125                ipc_answer_fast_0(rid, ENOMEM);
     126                return;
     127        }
     128
     129        int rc;
     130        if (rc = ipc_data_deliver(callid, &call, path, size)) {
     131                ipc_answer_fast_0(rid, rc);
     132                free(path);
     133                return;
     134        }
     135       
     136        /*
     137         * The path is now populated and we can call vfs_lookup_internal().
     138         */
     139        vfs_triplet_t triplet;
     140        rc = vfs_lookup_internal(path, size, &triplet, NULL);
     141        if (rc) {
     142                ipc_answer_fast_0(rid, rc);
     143                free(path);
     144                return;
     145        }
     146
     147        /*
     148         * Path is no longer needed.
     149         */
     150        free(path);
     151
     152        vfs_node_t *node = vfs_node_get(&triplet);
     153        // TODO: not finished   
    88154}
    89155
Note: See TracChangeset for help on using the changeset viewer.