source: mainline/uspace/srv/vfs/vfs.h@ 09d5ec8

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

Use async relations introduced in the previous changeset to implement
vfs_grab_phone() and vfs_release_phone().

With this change, VFS will not be pointlessly connecting and disconnecting
phones on each VFS request.

Judging from the output of the top utility, this reduces the share of VFS on
kernel time by about 7% (from 25% down to 18%) and DEVFS kernel time by about 5%
(from 28% to 23%). This also makes CONSOLE the biggest consumer of kernel time,
while it used to be third after DEVFS and VFS.

  • Property mode set to 100644
File size: 6.5 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 <adt/list.h>
38#include <fibril_synch.h>
39#include <sys/types.h>
40#include <devmap.h>
41#include <bool.h>
42#include <ipc/vfs.h>
43
44#ifndef dprintf
45 #define dprintf(...)
46#endif
47
48/**
49 * A structure like this will be allocated for each registered file system.
50 */
51typedef struct {
52 link_t fs_link;
53 vfs_info_t vfs_info;
54 fs_handle_t fs_handle;
55 fibril_mutex_t phone_lock;
56 ipcarg_t phone;
57} fs_info_t;
58
59/**
60 * VFS_PAIR uniquely represents a file system instance.
61 */
62#define VFS_PAIR \
63 fs_handle_t fs_handle; \
64 dev_handle_t dev_handle;
65
66/**
67 * VFS_TRIPLET uniquely identifies a file system node (e.g. directory, file) but
68 * doesn't contain any state. For a stateful structure, see vfs_node_t.
69 *
70 * @note fs_handle, dev_handle and index are meant to be returned in one
71 * IPC reply.
72 */
73#define VFS_TRIPLET \
74 VFS_PAIR; \
75 fs_index_t index;
76
77typedef struct {
78 VFS_PAIR;
79} vfs_pair_t;
80
81typedef struct {
82 VFS_TRIPLET;
83} vfs_triplet_t;
84
85typedef enum vfs_node_type {
86 VFS_NODE_UNKNOWN,
87 VFS_NODE_FILE,
88 VFS_NODE_DIRECTORY,
89} vfs_node_type_t;
90
91typedef struct {
92 vfs_triplet_t triplet;
93 vfs_node_type_t type;
94 aoff64_t size;
95 unsigned int lnkcnt;
96} vfs_lookup_res_t;
97
98/**
99 * Instances of this type represent an active, in-memory VFS node and any state
100 * which may be associated with it.
101 */
102typedef struct {
103 VFS_TRIPLET; /**< Identity of the node. */
104
105 /**
106 * Usage counter. This includes, but is not limited to, all vfs_file_t
107 * structures that reference this node.
108 */
109 unsigned refcnt;
110
111 /** Number of names this node has in the file system namespace. */
112 unsigned lnkcnt;
113
114 link_t nh_link; /**< Node hash-table link. */
115
116 vfs_node_type_t type; /**< Partial info about the node type. */
117
118 aoff64_t size; /**< Cached size if the node is a file. */
119
120 /**
121 * Holding this rwlock prevents modifications of the node's contents.
122 */
123 fibril_rwlock_t contents_rwlock;
124} vfs_node_t;
125
126/**
127 * Instances of this type represent an open file. If the file is opened by more
128 * than one task, there will be a separate structure allocated for each task.
129 */
130typedef struct {
131 /** Serializes access to this open file. */
132 fibril_mutex_t lock;
133
134 vfs_node_t *node;
135
136 /** Number of file handles referencing this file. */
137 unsigned refcnt;
138
139 /** Append on write. */
140 bool append;
141
142 /** Current absolute position in the file. */
143 aoff64_t pos;
144} vfs_file_t;
145
146extern fibril_mutex_t nodes_mutex;
147
148extern fibril_condvar_t fs_head_cv;
149extern fibril_mutex_t fs_head_lock;
150extern link_t fs_head; /**< List of registered file systems. */
151
152extern vfs_pair_t rootfs; /**< Root file system. */
153
154/** Each instance of this type describes one path lookup in progress. */
155typedef struct {
156 link_t plb_link; /**< Active PLB entries list link. */
157 unsigned index; /**< Index of the first character in PLB. */
158 size_t len; /**< Number of characters in this PLB entry. */
159} plb_entry_t;
160
161extern fibril_mutex_t plb_mutex;/**< Mutex protecting plb and plb_head. */
162extern uint8_t *plb; /**< Path Lookup Buffer */
163extern link_t plb_head; /**< List of active PLB entries. */
164
165#define MAX_MNTOPTS_LEN 256
166
167/** Holding this rwlock prevents changes in file system namespace. */
168extern fibril_rwlock_t namespace_rwlock;
169
170extern int vfs_grab_phone(fs_handle_t);
171extern void vfs_release_phone(fs_handle_t, int);
172
173extern fs_handle_t fs_name_to_handle(char *, bool);
174
175extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *,
176 vfs_pair_t *, ...);
177extern int vfs_open_node_internal(vfs_lookup_res_t *);
178extern int vfs_close_internal(vfs_file_t *);
179
180extern bool vfs_nodes_init(void);
181extern vfs_node_t *vfs_node_get(vfs_lookup_res_t *);
182extern void vfs_node_put(vfs_node_t *);
183extern void vfs_node_forget(vfs_node_t *);
184extern unsigned vfs_nodes_refcount_sum_get(fs_handle_t, dev_handle_t);
185
186
187#define MAX_OPEN_FILES 128
188
189extern bool vfs_files_init(void);
190extern void vfs_files_done(void);
191extern vfs_file_t *vfs_file_get(int);
192extern int vfs_fd_assign(vfs_file_t *file, int fd);
193extern int vfs_fd_alloc(bool desc);
194extern int vfs_fd_free(int);
195
196extern void vfs_file_addref(vfs_file_t *);
197extern void vfs_file_delref(vfs_file_t *);
198
199extern void vfs_node_addref(vfs_node_t *);
200extern void vfs_node_delref(vfs_node_t *);
201
202extern void vfs_register(ipc_callid_t, ipc_call_t *);
203extern void vfs_mount(ipc_callid_t, ipc_call_t *);
204extern void vfs_unmount(ipc_callid_t, ipc_call_t *);
205extern void vfs_open(ipc_callid_t, ipc_call_t *);
206extern void vfs_open_node(ipc_callid_t, ipc_call_t *);
207extern void vfs_sync(ipc_callid_t, ipc_call_t *);
208extern void vfs_dup(ipc_callid_t, ipc_call_t *);
209extern void vfs_close(ipc_callid_t, ipc_call_t *);
210extern void vfs_read(ipc_callid_t, ipc_call_t *);
211extern void vfs_write(ipc_callid_t, ipc_call_t *);
212extern void vfs_seek(ipc_callid_t, ipc_call_t *);
213extern void vfs_truncate(ipc_callid_t, ipc_call_t *);
214extern void vfs_fstat(ipc_callid_t, ipc_call_t *);
215extern void vfs_stat(ipc_callid_t, ipc_call_t *);
216extern void vfs_mkdir(ipc_callid_t, ipc_call_t *);
217extern void vfs_unlink(ipc_callid_t, ipc_call_t *);
218extern void vfs_rename(ipc_callid_t, ipc_call_t *);
219
220#endif
221
222/**
223 * @}
224 */
Note: See TracBrowser for help on using the repository browser.