Changeset 7de65cd in mainline


Ignore:
Timestamp:
2011-02-27T21:23:39Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6a8d2659
Parents:
e2ad8e4
Message:

Connect minixfs to VFS

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/minixfs/mfs.c

    re2ad8e4 r7de65cd  
    6060fs_reg_t mfs_reg;
    6161
     62
     63
     64/**
     65 * This connection fibril processes VFS requests from VFS.
     66 *
     67 * In order to support simultaneous VFS requests, our design is as follows.
     68 * The connection fibril accepts VFS requests from VFS. If there is only one
     69 * instance of the fibril, VFS will need to serialize all VFS requests it sends
     70 * to FAT. To overcome this bottleneck, VFS can send FAT the IPC_M_CONNECT_ME_TO
     71 * call. In that case, a new connection fibril will be created, which in turn
     72 * will accept the call. Thus, a new phone will be opened for VFS.
     73 *
     74 * There are few issues with this arrangement. First, VFS can run out of
     75 * available phones. In that case, VFS can close some other phones or use one
     76 * phone for more serialized requests. Similarily, FAT can refuse to duplicate
     77 * the connection. VFS should then just make use of already existing phones and
     78 * route its requests through them. To avoid paying the fibril creation price
     79 * upon each request, FAT might want to keep the connections open after the
     80 * request has been completed.
     81 */
     82
     83static void mfs_connection(ipc_callid_t iid, ipc_call_t *icall)
     84{
     85        if (iid) {
     86                /*
     87                 * This only happens for connections opened by
     88                 * IPC_M_CONNECT_ME_TO calls as opposed to callback connections
     89                 * created by IPC_M_CONNECT_TO_ME.
     90                 */
     91                async_answer_0(iid, EOK);
     92        }
     93       
     94        printf(NAME ": connection opened\n");
     95        while (1) {
     96                ipc_callid_t callid;
     97                ipc_call_t call;
     98       
     99                callid = async_get_call(&call);
     100                switch  (IPC_GET_IMETHOD(call)) {
     101                default:
     102                case IPC_M_PHONE_HUNGUP:
     103                        return;         
     104                }
     105        }
     106}
     107
     108
    62109int main(int argc, char **argv)
    63110{
     111        int vfs_phone;
     112        int rc;
     113
    64114        printf(NAME ": HelenOS Minix file system server\n");
     115
     116        vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0);
     117
     118        if (vfs_phone < EOK) {
     119                printf(NAME ": failed to connect to VFS\n");
     120                return -1;
     121        }
     122
     123        rc = fs_register(vfs_phone, &mfs_reg, &mfs_vfs_info, mfs_connection);
     124        if (rc != EOK)
     125                goto err;
     126
    65127        return 0;
     128
     129err:
     130        printf(NAME ": Failed to register file system (%d)\n", rc);
     131        return rc;
    66132}
    67133
Note: See TracChangeset for help on using the changeset viewer.