Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/tmpfs/tmpfs.c

    r4979403 rffa2c8ef  
    3030/** @addtogroup fs
    3131 * @{
    32  */
     32 */ 
    3333
    3434/**
     
    4343#include "tmpfs.h"
    4444#include <ipc/services.h>
    45 #include <ns.h>
     45#include <ipc/ns.h>
    4646#include <async.h>
    4747#include <errno.h>
     
    5959        .concurrent_read_write = false,
    6060        .write_retains_size = false,
    61         .instance = 0,
    6261};
     62
     63fs_reg_t tmpfs_reg;
     64
     65/**
     66 * This connection fibril processes VFS requests from VFS.
     67 *
     68 * In order to support simultaneous VFS requests, our design is as follows.
     69 * The connection fibril accepts VFS requests from VFS. If there is only one
     70 * instance of the fibril, VFS will need to serialize all VFS requests it sends
     71 * to FAT. To overcome this bottleneck, VFS can send TMPFS the
     72 * IPC_M_CONNECT_ME_TO call. In that case, a new connection fibril will be
     73 * created, which in turn will accept the call. Thus, a new phone will be
     74 * opened for VFS.
     75 *
     76 * There are few issues with this arrangement. First, VFS can run out of
     77 * available phones. In that case, VFS can close some other phones or use one
     78 * phone for more serialized requests. Similarily, TMPFS can refuse to duplicate
     79 * the connection. VFS should then just make use of already existing phones and
     80 * route its requests through them. To avoid paying the fibril creation price
     81 * upon each request, TMPFS might want to keep the connections open after the
     82 * request has been completed.
     83 */
     84static void tmpfs_connection(ipc_callid_t iid, ipc_call_t *icall)
     85{
     86        if (iid) {
     87                /*
     88                 * This only happens for connections opened by
     89                 * IPC_M_CONNECT_ME_TO calls as opposed to callback connections
     90                 * created by IPC_M_CONNECT_TO_ME.
     91                 */
     92                async_answer_0(iid, EOK);
     93        }
     94       
     95        dprintf(NAME ": connection opened\n");
     96        while (1) {
     97                ipc_callid_t callid;
     98                ipc_call_t call;
     99       
     100                callid = async_get_call(&call);
     101                switch  (IPC_GET_IMETHOD(call)) {
     102                case IPC_M_PHONE_HUNGUP:
     103                        return;
     104                case VFS_OUT_MOUNTED:
     105                        tmpfs_mounted(callid, &call);
     106                        break;
     107                case VFS_OUT_MOUNT:
     108                        tmpfs_mount(callid, &call);
     109                        break;
     110                case VFS_OUT_UNMOUNTED:
     111                        tmpfs_unmounted(callid, &call);
     112                        break;
     113                case VFS_OUT_UNMOUNT:
     114                        tmpfs_unmount(callid, &call);
     115                        break;
     116                case VFS_OUT_LOOKUP:
     117                        tmpfs_lookup(callid, &call);
     118                        break;
     119                case VFS_OUT_READ:
     120                        tmpfs_read(callid, &call);
     121                        break;
     122                case VFS_OUT_WRITE:
     123                        tmpfs_write(callid, &call);
     124                        break;
     125                case VFS_OUT_TRUNCATE:
     126                        tmpfs_truncate(callid, &call);
     127                        break;
     128                case VFS_OUT_CLOSE:
     129                        tmpfs_close(callid, &call);
     130                        break;
     131                case VFS_OUT_DESTROY:
     132                        tmpfs_destroy(callid, &call);
     133                        break;
     134                case VFS_OUT_OPEN_NODE:
     135                        tmpfs_open_node(callid, &call);
     136                        break;
     137                case VFS_OUT_STAT:
     138                        tmpfs_stat(callid, &call);
     139                        break;
     140                case VFS_OUT_SYNC:
     141                        tmpfs_sync(callid, &call);
     142                        break;
     143                default:
     144                        async_answer_0(callid, ENOTSUP);
     145                        break;
     146                }
     147        }
     148}
    63149
    64150int main(int argc, char **argv)
     
    66152        printf(NAME ": HelenOS TMPFS file system server\n");
    67153
    68         if (argc == 3) {
    69                 if (!str_cmp(argv[1], "--instance"))
    70                         tmpfs_vfs_info.instance = strtol(argv[2], NULL, 10);
    71                 else {
    72                         printf(NAME " Unrecognized parameters");
    73                         return -1;
    74                 }
    75         }
    76        
    77154        if (!tmpfs_init()) {
    78155                printf(NAME ": failed to initialize TMPFS\n");
    79156                return -1;
    80157        }
    81        
    82         async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE,
    83             SERVICE_VFS, 0, 0);
    84         if (!vfs_sess) {
     158
     159        int vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0);
     160        if (vfs_phone < EOK) {
    85161                printf(NAME ": Unable to connect to VFS\n");
    86162                return -1;
    87163        }
    88        
    89         int rc = fs_register(vfs_sess, &tmpfs_vfs_info, &tmpfs_ops,
    90             &tmpfs_libfs_ops);
     164
     165        int rc = fs_register(vfs_phone, &tmpfs_reg, &tmpfs_vfs_info,
     166            tmpfs_connection);
    91167        if (rc != EOK) {
    92168                printf(NAME ": Failed to register file system (%d)\n", rc);
    93169                return rc;
    94170        }
    95        
     171
    96172        printf(NAME ": Accepting connections\n");
    97173        task_retval(0);
    98174        async_manager();
    99        
    100         /* Not reached */
     175        /* not reached */
    101176        return 0;
    102177}
     
    104179/**
    105180 * @}
    106  */
     181 */ 
Note: See TracChangeset for help on using the changeset viewer.