source: mainline/uspace/srv/vfs/vfs.h@ 18ad03f3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 18ad03f3 was f49b0ea, checked in by Jakub Jermar <jakub@…>, 18 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: 8.2 KB
Line 
1/*
2 * Copyright (c) 2008 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup fs
30 * @{
31 */
32
33#ifndef VFS_VFS_H_
34#define VFS_VFS_H_
35
36#include <ipc/ipc.h>
37#include <libadt/list.h>
38#include <futex.h>
39#include <rwlock.h>
40#include <sys/types.h>
41#include <bool.h>
42
43// FIXME: according to CONFIG_DEBUG
44// #define dprintf(...) printf(__VA_ARGS__)
45
46#define dprintf(...)
47
48#define VFS_FIRST IPC_FIRST_USER_METHOD
49
50#define IPC_METHOD_TO_VFS_OP(m) ((m) - VFS_FIRST)
51
52/* Basic types. */
53typedef int16_t fs_handle_t;
54typedef int16_t dev_handle_t;
55typedef uint32_t fs_index_t;
56
57typedef enum {
58 VFS_READ = VFS_FIRST,
59 VFS_WRITE,
60 VFS_TRUNCATE,
61 VFS_MOUNT,
62 VFS_UNMOUNT,
63 VFS_LAST_CMN, /* keep this the last member of this enum */
64} vfs_request_cmn_t;
65
66typedef enum {
67 VFS_LOOKUP = VFS_LAST_CMN,
68 VFS_MOUNTED,
69 VFS_DESTROY,
70 VFS_LAST_CLNT, /* keep this the last member of this enum */
71} vfs_request_clnt_t;
72
73typedef enum {
74 VFS_REGISTER = VFS_LAST_CMN,
75 VFS_OPEN,
76 VFS_CLOSE,
77 VFS_SEEK,
78 VFS_MKDIR,
79 VFS_UNLINK,
80 VFS_RENAME,
81 VFS_LAST_SRV, /* keep this the last member of this enum */
82} vfs_request_srv_t;
83
84
85/**
86 * An instance of this structure is associated with a particular FS operation.
87 * It tells VFS if the FS supports the operation or maybe if a default one
88 * should be used.
89 */
90typedef enum {
91 VFS_OP_NULL = 0,
92 VFS_OP_DEFAULT,
93 VFS_OP_DEFINED
94} vfs_op_t;
95
96#define FS_NAME_MAXLEN 20
97
98/**
99 * A structure like this is passed to VFS by each individual FS upon its
100 * registration. It assosiates a human-readable identifier with each
101 * registered FS. More importantly, through this structure, the FS announces
102 * what operations it supports.
103 */
104typedef struct {
105 /** Unique identifier of the fs. */
106 char name[FS_NAME_MAXLEN + 1];
107
108 /** Operations. */
109 vfs_op_t ops[VFS_LAST_CLNT - VFS_FIRST];
110} vfs_info_t;
111
112/**
113 * A structure like this will be allocated for each registered file system.
114 */
115typedef struct {
116 link_t fs_link;
117 vfs_info_t vfs_info;
118 fs_handle_t fs_handle;
119 futex_t phone_futex; /**< Phone serializing futex. */
120 ipcarg_t phone;
121} fs_info_t;
122
123/**
124 * VFS_PAIR uniquely represents a file system instance.
125 */
126#define VFS_PAIR \
127 fs_handle_t fs_handle; \
128 dev_handle_t dev_handle;
129
130/**
131 * VFS_TRIPLET uniquely identifies a file system node (e.g. directory, file) but
132 * doesn't contain any state. For a stateful structure, see vfs_node_t.
133 *
134 * @note fs_handle, dev_handle and index are meant to be returned in one
135 * IPC reply.
136 */
137#define VFS_TRIPLET \
138 VFS_PAIR; \
139 fs_index_t index;
140
141typedef struct {
142 VFS_PAIR;
143} vfs_pair_t;
144
145typedef struct {
146 VFS_TRIPLET;
147} vfs_triplet_t;
148
149/*
150 * Lookup flags.
151 */
152/**
153 * No lookup flags used.
154 */
155#define L_NONE 0
156/**
157 * Lookup will succeed only if the object is a regular file. If L_CREATE is
158 * specified, an empty file will be created. This flag is mutually exclusive
159 * with L_DIRECTORY.
160 */
161#define L_FILE 1
162/**
163 * Lookup wil succeed only if the object is a directory. If L_CREATE is
164 * specified, an empty directory will be created. This flag is mutually
165 * exclusive with L_FILE.
166 */
167#define L_DIRECTORY 2
168/**
169 * When used with L_CREATE, L_EXCLUSIVE will cause the lookup to fail if the
170 * object already exists. L_EXCLUSIVE is implied when L_DIRECTORY is used.
171 */
172#define L_EXCLUSIVE 4
173/**
174 * L_CREATE is used for creating both regular files and directories.
175 */
176#define L_CREATE 8
177/**
178 * L_LINK is used for linking to an already existing nodes.
179 */
180#define L_LINK 16
181/**
182 * L_UNLINK is used to remove leaves from the file system namespace. This flag
183 * cannot be passed directly by the client, but will be set by VFS during
184 * VFS_UNLINK.
185 */
186#define L_UNLINK 32
187/**
188 * L_PARENT performs a lookup but returns the triplet of the parent node.
189 * This flag may not be combined with any other lookup flag.
190 */
191#define L_PARENT 64
192
193typedef struct {
194 vfs_triplet_t triplet;
195 size_t size;
196 unsigned lnkcnt;
197} vfs_lookup_res_t;
198
199/**
200 * Instances of this type represent an active, in-memory VFS node and any state
201 * which may be associated with it.
202 */
203typedef struct {
204 VFS_TRIPLET; /**< Identity of the node. */
205
206 /**
207 * Usage counter. This includes, but is not limited to, all vfs_file_t
208 * structures that reference this node.
209 */
210 unsigned refcnt;
211
212 /** Number of names this node has in the file system namespace. */
213 unsigned lnkcnt;
214
215 link_t nh_link; /**< Node hash-table link. */
216 size_t size; /**< Cached size if the node is a file. */
217
218 /**
219 * Holding this rwlock prevents modifications of the node's contents.
220 */
221 rwlock_t contents_rwlock;
222} vfs_node_t;
223
224/**
225 * Instances of this type represent an open file. If the file is opened by more
226 * than one task, there will be a separate structure allocated for each task.
227 */
228typedef struct {
229 /** Serializes access to this open file. */
230 futex_t lock;
231
232 vfs_node_t *node;
233
234 /** Number of file handles referencing this file. */
235 unsigned refcnt;
236
237 /** Append on write. */
238 bool append;
239
240 /** Current position in the file. */
241 off_t pos;
242} vfs_file_t;
243
244extern futex_t nodes_futex;
245
246extern link_t fs_head; /**< List of registered file systems. */
247
248extern vfs_pair_t rootfs; /**< Root file system. */
249
250#define MAX_PATH_LEN (64 * 1024)
251
252#define PLB_SIZE (2 * MAX_PATH_LEN)
253
254/** Each instance of this type describes one path lookup in progress. */
255typedef struct {
256 link_t plb_link; /**< Active PLB entries list link. */
257 unsigned index; /**< Index of the first character in PLB. */
258 size_t len; /**< Number of characters in this PLB entry. */
259} plb_entry_t;
260
261extern futex_t plb_futex; /**< Futex protecting plb and plb_head. */
262extern uint8_t *plb; /**< Path Lookup Buffer */
263extern link_t plb_head; /**< List of active PLB entries. */
264
265/** Holding this rwlock prevents changes in file system namespace. */
266extern rwlock_t namespace_rwlock;
267
268extern int vfs_grab_phone(fs_handle_t);
269extern void vfs_release_phone(int);
270
271extern fs_handle_t fs_name_to_handle(char *, bool);
272
273extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, vfs_pair_t *,
274 ...);
275
276extern bool vfs_nodes_init(void);
277extern vfs_node_t *vfs_node_get(vfs_lookup_res_t *);
278extern void vfs_node_put(vfs_node_t *);
279
280#define MAX_OPEN_FILES 128
281
282extern bool vfs_files_init(void);
283extern vfs_file_t *vfs_file_get(int);
284extern int vfs_fd_alloc(void);
285extern void vfs_fd_free(int);
286
287extern void vfs_file_addref(vfs_file_t *);
288extern void vfs_file_delref(vfs_file_t *);
289
290extern void vfs_node_addref(vfs_node_t *);
291extern void vfs_node_delref(vfs_node_t *);
292
293extern void vfs_register(ipc_callid_t, ipc_call_t *);
294extern void vfs_mount(ipc_callid_t, ipc_call_t *);
295extern void vfs_open(ipc_callid_t, ipc_call_t *);
296extern void vfs_close(ipc_callid_t, ipc_call_t *);
297extern void vfs_read(ipc_callid_t, ipc_call_t *);
298extern void vfs_write(ipc_callid_t, ipc_call_t *);
299extern void vfs_seek(ipc_callid_t, ipc_call_t *);
300extern void vfs_truncate(ipc_callid_t, ipc_call_t *);
301extern void vfs_mkdir(ipc_callid_t, ipc_call_t *);
302extern void vfs_unlink(ipc_callid_t, ipc_call_t *);
303extern void vfs_rename(ipc_callid_t, ipc_call_t *);
304
305#endif
306
307/**
308 * @}
309 */
Note: See TracBrowser for help on using the repository browser.