source: mainline/uspace/srv/fs/tmpfs/tmpfs.c@ 516ff92

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 516ff92 was f49b0ea, checked in by Jakub Jermar <jakub@…>, 17 years ago

Split the 'mount another filesystem here' and 'you are being mounted and the
device is this' mount semantics. Add VFS_MOUNTED VFS operation that corresponds
to the latter and reserve VFS_MOUNT only for the former. Because of this
change, the VFS server does not maintain the mr_node VFS node for the name space
root anymore and the VFS_LOOKUP operation is now not meant to be used on
unmounted file system, not even for looking up the root node of unmounted file
systems. In the light of these changes, TMPFS is now initialized from
tmpfs_mounted() function.

  • Property mode set to 100644
File size: 5.0 KB
Line 
1/*
2 * Copyright (c) 2006 Martin Decky
3 * Copyright (c) 2008 Jakub Jermar
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup fs
31 * @{
32 */
33
34/**
35 * @file tmpfs.c
36 * @brief File system driver for in-memory file system.
37 *
38 * Every instance of tmpfs exists purely in memory and has neither a disk layout
39 * nor any permanent storage (e.g. disk blocks). With each system reboot, data
40 * stored in a tmpfs file system is lost.
41 */
42
43#include "tmpfs.h"
44#include <ipc/ipc.h>
45#include <ipc/services.h>
46#include <async.h>
47#include <errno.h>
48#include <unistd.h>
49#include <stdio.h>
50#include <libfs.h>
51#include "../../vfs/vfs.h"
52
53#define NAME "tmpfs"
54
55
56vfs_info_t tmpfs_vfs_info = {
57 .name = "tmpfs",
58 .ops = {
59 [IPC_METHOD_TO_VFS_OP(VFS_LOOKUP)] = VFS_OP_DEFINED,
60 [IPC_METHOD_TO_VFS_OP(VFS_READ)] = VFS_OP_DEFINED,
61 [IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_DEFINED,
62 [IPC_METHOD_TO_VFS_OP(VFS_TRUNCATE)] = VFS_OP_DEFINED,
63 [IPC_METHOD_TO_VFS_OP(VFS_MOUNT)] = VFS_OP_DEFINED,
64 [IPC_METHOD_TO_VFS_OP(VFS_MOUNTED)] = VFS_OP_DEFINED,
65 [IPC_METHOD_TO_VFS_OP(VFS_UNMOUNT)] = VFS_OP_NULL,
66 [IPC_METHOD_TO_VFS_OP(VFS_DESTROY)] = VFS_OP_DEFINED,
67 }
68};
69
70fs_reg_t tmpfs_reg;
71
72/**
73 * This connection fibril processes VFS requests from VFS.
74 *
75 * In order to support simultaneous VFS requests, our design is as follows.
76 * The connection fibril accepts VFS requests from VFS. If there is only one
77 * instance of the fibril, VFS will need to serialize all VFS requests it sends
78 * to FAT. To overcome this bottleneck, VFS can send TMPFS the
79 * IPC_M_CONNECT_ME_TO call. In that case, a new connection fibril will be
80 * created, which in turn will accept the call. Thus, a new phone will be
81 * opened for VFS.
82 *
83 * There are few issues with this arrangement. First, VFS can run out of
84 * available phones. In that case, VFS can close some other phones or use one
85 * phone for more serialized requests. Similarily, TMPFS can refuse to duplicate
86 * the connection. VFS should then just make use of already existing phones and
87 * route its requests through them. To avoid paying the fibril creation price
88 * upon each request, TMPFS might want to keep the connections open after the
89 * request has been completed.
90 */
91static void tmpfs_connection(ipc_callid_t iid, ipc_call_t *icall)
92{
93 if (iid) {
94 /*
95 * This only happens for connections opened by
96 * IPC_M_CONNECT_ME_TO calls as opposed to callback connections
97 * created by IPC_M_CONNECT_TO_ME.
98 */
99 ipc_answer_0(iid, EOK);
100 }
101
102 dprintf("VFS-TMPFS connection established.\n");
103 while (1) {
104 ipc_callid_t callid;
105 ipc_call_t call;
106
107 callid = async_get_call(&call);
108 switch (IPC_GET_METHOD(call)) {
109 case VFS_MOUNTED:
110 tmpfs_mounted(callid, &call);
111 break;
112 case VFS_MOUNT:
113 tmpfs_mount(callid, &call);
114 break;
115 case VFS_LOOKUP:
116 tmpfs_lookup(callid, &call);
117 break;
118 case VFS_READ:
119 tmpfs_read(callid, &call);
120 break;
121 case VFS_WRITE:
122 tmpfs_write(callid, &call);
123 break;
124 case VFS_TRUNCATE:
125 tmpfs_truncate(callid, &call);
126 break;
127 case VFS_DESTROY:
128 tmpfs_destroy(callid, &call);
129 break;
130 default:
131 ipc_answer_0(callid, ENOTSUP);
132 break;
133 }
134 }
135}
136
137int main(int argc, char **argv)
138{
139 int vfs_phone;
140
141 printf(NAME ": HelenOS TMPFS file system server\n");
142
143 vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0);
144 while (vfs_phone < EOK) {
145 usleep(10000);
146 vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0);
147 }
148
149 int rc;
150 rc = fs_register(vfs_phone, &tmpfs_reg, &tmpfs_vfs_info,
151 tmpfs_connection);
152 if (rc != EOK) {
153 printf(NAME ": Failed to register file system (%d)\n", rc);
154 return rc;
155 }
156
157 printf(NAME ": Accepting connections\n");
158 async_manager();
159 /* not reached */
160 return 0;
161}
162
163/**
164 * @}
165 */
Note: See TracBrowser for help on using the repository browser.