Subversion Repositories HelenOS

Rev

Rev 2637 | Rev 2644 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2637 Rev 2643
Line 41... Line 41...
41
#include <ipc/services.h>
41
#include <ipc/services.h>
42
#include <async.h>
42
#include <async.h>
43
#include <errno.h>
43
#include <errno.h>
44
#include <unistd.h>
44
#include <unistd.h>
45
#include <stdio.h>
45
#include <stdio.h>
46
#include <as.h>
46
#include <libfs.h>
47
#include "../../vfs/vfs.h"
47
#include "../../vfs/vfs.h"
48
 
48
 
49
 
49
 
50
vfs_info_t fat_vfs_info = {
50
vfs_info_t fat_vfs_info = {
51
    .name = "fat",
51
    .name = "fat",
Line 61... Line 61...
61
        [IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_NULL,
61
        [IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_NULL,
62
        [IPC_METHOD_TO_VFS_OP(VFS_SEEK)] = VFS_OP_DEFAULT
62
        [IPC_METHOD_TO_VFS_OP(VFS_SEEK)] = VFS_OP_DEFAULT
63
    }
63
    }
64
};
64
};
65
 
65
 
66
uint8_t *plb_ro = NULL;
66
fs_reg_t fat_reg;
67
 
-
 
68
int fs_handle = 0;
-
 
69
 
67
 
70
/**
68
/**
71
 * This connection fibril processes VFS requests from VFS.
69
 * This connection fibril processes VFS requests from VFS.
72
 *
70
 *
73
 * In order to support simultaneous VFS requests, our design is as follows.
71
 * In order to support simultaneous VFS requests, our design is as follows.
Line 130... Line 128...
130
    while (vfs_phone < EOK) {
128
    while (vfs_phone < EOK) {
131
        usleep(10000);
129
        usleep(10000);
132
        vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0);
130
        vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0);
133
    }
131
    }
134
   
132
   
135
    /*
-
 
136
     * Tell VFS that we are here and want to get registered.
-
 
137
     * We use the async framework because VFS will answer the request
-
 
138
     * out-of-order, when it knows that the operation succeeded or failed.
-
 
139
     */
133
    int rc;
140
    ipc_call_t answer;
-
 
141
    aid_t req = async_send_2(vfs_phone, VFS_REGISTER, 0, 0, &answer);
-
 
142
 
-
 
143
    /*
-
 
144
     * Send our VFS info structure to VFS.
-
 
145
     */
-
 
146
    int rc = ipc_data_send(vfs_phone, &fat_vfs_info, sizeof(fat_vfs_info));
134
    rc = fs_register(vfs_phone, &fat_reg, &fat_vfs_info, fat_connection);
147
    if (rc != EOK) {
135
    if (rc != EOK) {
148
        async_wait_for(req, NULL);
-
 
149
        return rc;
-
 
150
    }
-
 
151
 
-
 
152
    /*
-
 
153
     * Ask VFS for callback connection.
-
 
154
     */
-
 
155
    ipcarg_t phonehash;
-
 
156
    ipc_connect_to_me(vfs_phone, 0, 0, 0, &phonehash);
136
        printf("Failed to register the FAT file system (%d)\n", rc);
157
 
-
 
158
    /*
-
 
159
     * Allocate piece of address space for PLB.
-
 
160
     */
-
 
161
    plb_ro = as_get_mappable_page(PLB_SIZE);
-
 
162
    if (!plb_ro) {
-
 
163
        async_wait_for(req, NULL);
-
 
164
        return ENOMEM;
-
 
165
    }
-
 
166
 
-
 
167
    /*
-
 
168
     * Request sharing the Path Lookup Buffer with VFS.
-
 
169
     */
-
 
170
    rc = ipc_call_sync_2_0(vfs_phone, IPC_M_AS_AREA_RECV, (ipcarg_t) plb_ro,
-
 
171
        PLB_SIZE);
-
 
172
    if (rc) {
-
 
173
        async_wait_for(req, NULL);
-
 
174
        return rc;
137
        return rc;
175
    }
138
    }
176
     
-
 
177
    /*
-
 
178
     * Pick up the answer for the request to the VFS_REQUEST call.
-
 
179
     */
-
 
180
    async_wait_for(req, NULL);
-
 
181
    fs_handle = (int) IPC_GET_ARG1(answer);
-
 
182
    dprintf("FAT filesystem registered, fs_handle=%d.\n", fs_handle);
-
 
183
 
-
 
184
    /*
-
 
185
     * Create a connection fibril to handle the callback connection.
-
 
186
     */
-
 
187
    async_new_connection(phonehash, 0, NULL, fat_connection);
-
 
188
   
139
   
189
    /*
-
 
190
     * Tell the async framework that other connections are to be handled by
140
    dprintf("FAT filesystem registered, fs_handle=%d.\n", fat_reg.fs_handle);
191
     * the same connection fibril as well.
-
 
192
     */
-
 
193
    async_set_client_connection(fat_connection);
-
 
194
 
141
 
195
    async_manager();
142
    async_manager();
196
    /* not reached */
143
    /* not reached */
197
    return 0;
144
    return 0;
198
}
145
}