Ignore:
File:
1 edited

Legend:

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

    rffa2c8ef r4979403  
    3030/** @addtogroup fs
    3131 * @{
    32  */ 
     32 */
    3333
    3434/**
     
    4343#include "tmpfs.h"
    4444#include <ipc/services.h>
    45 #include <ipc/ns.h>
     45#include <ns.h>
    4646#include <async.h>
    4747#include <errno.h>
     
    5959        .concurrent_read_write = false,
    6060        .write_retains_size = false,
     61        .instance = 0,
    6162};
    62 
    63 fs_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  */
    84 static 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 }
    14963
    15064int main(int argc, char **argv)
     
    15266        printf(NAME ": HelenOS TMPFS file system server\n");
    15367
     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       
    15477        if (!tmpfs_init()) {
    15578                printf(NAME ": failed to initialize TMPFS\n");
    15679                return -1;
    15780        }
    158 
    159         int vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0);
    160         if (vfs_phone < EOK) {
     81       
     82        async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE,
     83            SERVICE_VFS, 0, 0);
     84        if (!vfs_sess) {
    16185                printf(NAME ": Unable to connect to VFS\n");
    16286                return -1;
    16387        }
    164 
    165         int rc = fs_register(vfs_phone, &tmpfs_reg, &tmpfs_vfs_info,
    166             tmpfs_connection);
     88       
     89        int rc = fs_register(vfs_sess, &tmpfs_vfs_info, &tmpfs_ops,
     90            &tmpfs_libfs_ops);
    16791        if (rc != EOK) {
    16892                printf(NAME ": Failed to register file system (%d)\n", rc);
    16993                return rc;
    17094        }
    171 
     95       
    17296        printf(NAME ": Accepting connections\n");
    17397        task_retval(0);
    17498        async_manager();
    175         /* not reached */
     99       
     100        /* Not reached */
    176101        return 0;
    177102}
     
    179104/**
    180105 * @}
    181  */ 
     106 */
Note: See TracChangeset for help on using the changeset viewer.