Changes in uspace/srv/vfs/vfs.c [d60ce4a:c1f7a315] in mainline


Ignore:
File:
1 edited

Legend:

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

    rd60ce4a rc1f7a315  
    3737
    3838#include <vfs/vfs.h>
     39#include <stdlib.h>
    3940#include <ipc/services.h>
    40 #include <abi/ipc/event.h>
    41 #include <event.h>
     41#include <abi/ipc/methods.h>
     42#include <libarch/config.h>
    4243#include <ns.h>
    4344#include <async.h>
     
    5354#define NAME  "vfs"
    5455
    55 enum {
    56         VFS_TASK_STATE_CHANGE
    57 };
     56static void vfs_pager(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     57{
     58        async_answer_0(iid, EOK);
     59
     60        while (true) {
     61                ipc_call_t call;
     62                ipc_callid_t callid = async_get_call(&call);
     63               
     64                if (!IPC_GET_IMETHOD(call))
     65                        break;
     66               
     67                switch (IPC_GET_IMETHOD(call)) {
     68                case IPC_M_PAGE_IN:
     69                        vfs_page_in(callid, &call);
     70                        break;
     71                default:
     72                        async_answer_0(callid, ENOTSUP);
     73                        break;
     74                }
     75        }
     76}
    5877
    5978static void vfs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     
    8099                        break;
    81100                case VFS_IN_MOUNT:
    82                         vfs_mount(callid, &call);
     101                        vfs_mount_srv(callid, &call);
    83102                        break;
    84103                case VFS_IN_UNMOUNT:
    85                         vfs_unmount(callid, &call);
    86                         break;
    87                 case VFS_IN_WALK:
    88                         vfs_walk(callid, &call);
    89                         break;
    90                 case VFS_IN_OPEN2:
    91                         vfs_open2(callid, &call);
     104                        vfs_unmount_srv(callid, &call);
     105                        break;
     106                case VFS_IN_OPEN:
     107                        vfs_open(callid, &call);
    92108                        break;
    93109                case VFS_IN_CLOSE:
     
    109125                        vfs_fstat(callid, &call);
    110126                        break;
    111                 case VFS_IN_UNLINK2:
    112                         vfs_unlink2(callid, &call);
     127                case VFS_IN_STAT:
     128                        vfs_stat(callid, &call);
     129                        break;
     130                case VFS_IN_MKDIR:
     131                        vfs_mkdir(callid, &call);
     132                        break;
     133                case VFS_IN_UNLINK:
     134                        vfs_unlink(callid, &call);
    113135                        break;
    114136                case VFS_IN_RENAME:
     
    127149                        vfs_get_mtab(callid, &call);
    128150                        break;
     151                case VFS_IN_STATFS:
     152                        vfs_statfs(callid, &call);
     153                        break;
    129154                default:
    130155                        async_answer_0(callid, ENOTSUP);
     
    139164}
    140165
    141 static void notification_received(ipc_callid_t callid, ipc_call_t *call)
    142 {
    143         switch (IPC_GET_IMETHOD(*call)) {
    144         case VFS_TASK_STATE_CHANGE:
    145                 if (IPC_GET_ARG1(*call) == VFS_PASS_HANDLE)
    146                         vfs_pass_handle(
    147                             (task_id_t) MERGE_LOUP32(IPC_GET_ARG4(*call),
    148                             IPC_GET_ARG5(*call)), call->in_task_id,
    149                             (int) IPC_GET_ARG2(*call));
    150                 break;
    151         default:
    152                 break;
    153         }
     166static void notification_handler(ipc_callid_t callid, ipc_call_t *call, void *arg)
     167{
     168        if (IPC_GET_ARG1(*call) == VFS_PASS_HANDLE)
     169                vfs_pass_handle(
     170                    (task_id_t) MERGE_LOUP32(IPC_GET_ARG4(*call),
     171                    IPC_GET_ARG5(*call)), call->in_task_id,
     172                    (int) IPC_GET_ARG2(*call));
    154173}
    155174
    156175int main(int argc, char **argv)
    157176{
     177        int rc;
     178
    158179        printf("%s: HelenOS VFS server\n", NAME);
    159180       
     
    171192         */
    172193        plb = as_area_create(AS_AREA_ANY, PLB_SIZE,
    173             AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
     194            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, AS_AREA_UNPAGED);
    174195        if (plb == AS_MAP_FAILED) {
    175196                printf("%s: Cannot create address space area\n", NAME);
     
    185206
    186207        /*
     208         * Create a port for the pager.
     209         */
     210        port_id_t port;
     211        rc = async_create_port(INTERFACE_PAGER, vfs_pager, NULL, &port);
     212        if (rc != EOK)
     213                return rc;
     214               
     215        /*
    187216         * Set a connection handling function/fibril.
    188217         */
    189         async_set_client_connection(vfs_connection);
    190 
    191         /*
    192          * Set notification handler and subscribe to notifications.
    193          */
    194         async_set_interrupt_received(notification_received);
    195         event_task_subscribe(EVENT_TASK_STATE_CHANGE, VFS_TASK_STATE_CHANGE);
     218        async_set_fallback_port_handler(vfs_connection, NULL);
     219
     220        /*
     221         * Subscribe to notifications.
     222         */
     223        async_event_task_subscribe(EVENT_TASK_STATE_CHANGE, notification_handler,
     224            NULL);
    196225       
    197226        /*
    198227         * Register at the naming service.
    199228         */
    200         int rc = service_register(SERVICE_VFS);
     229        rc = service_register(SERVICE_VFS);
    201230        if (rc != EOK) {
    202231                printf("%s: Cannot register VFS service\n", NAME);
Note: See TracChangeset for help on using the changeset viewer.