source: mainline/uspace/srv/vfs/vfs.h@ 63d46341

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 63d46341 was 984a9ba, checked in by Martin Decky <martin@…>, 7 years ago

do not expose the call capability handler from the async framework

Keep the call capability handler encapsulated within the async framework
and do not expose it explicitly via its API. Use the pointer to
ipc_call_t as the sole object identifying an IPC call in the code that
uses the async framework.

This plugs a major leak in the abstraction and also simplifies both the
async framework (slightly) and all IPC servers.

  • Property mode set to 100644
File size: 7.3 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 <async.h>
37#include <adt/list.h>
38#include <adt/hash_table.h>
39#include <fibril_synch.h>
40#include <stddef.h>
41#include <stdint.h>
42#include <loc.h>
43#include <stdbool.h>
44#include <ipc/vfs.h>
45#include <task.h>
46#include <vfs/vfs.h>
47
48#ifndef dprintf
49#define dprintf(...)
50#endif
51
52/**
53 * A structure like this will be allocated for each registered file system.
54 */
55typedef struct {
56 link_t fs_link;
57 vfs_info_t vfs_info;
58 fs_handle_t fs_handle;
59 async_sess_t *sess;
60} fs_info_t;
61
62/** Uniquely represents a file system instance. */
63typedef struct {
64 fs_handle_t fs_handle;
65 service_id_t service_id;
66} vfs_pair_t;
67
68/** Uniquely identifies a file system node (e.g. directory, file)
69 * but doesn't contain any state. For a stateful structure, see vfs_node_t.
70 *
71 * @note fs_handle, service_id and index are meant to be returned in one
72 * IPC reply.
73 */
74typedef struct {
75 fs_handle_t fs_handle;
76 service_id_t service_id;
77 fs_index_t index;
78} vfs_triplet_t;
79
80typedef enum vfs_node_type {
81 VFS_NODE_UNKNOWN,
82 VFS_NODE_FILE,
83 VFS_NODE_DIRECTORY,
84} vfs_node_type_t;
85
86typedef struct {
87 vfs_triplet_t triplet;
88 vfs_node_type_t type;
89 aoff64_t size;
90} vfs_lookup_res_t;
91
92/**
93 * Instances of this type represent an active, in-memory VFS node and any state
94 * which may be associated with it.
95 */
96typedef struct _vfs_node {
97 /*
98 * Identity of the node
99 */
100
101 fs_handle_t fs_handle;
102 service_id_t service_id;
103 fs_index_t index;
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 ht_link_t nh_link; /**< Node hash-table link. */
112
113 vfs_node_type_t type; /**< Partial info about the node type. */
114
115 aoff64_t size; /**< Cached size if the node is a file. */
116
117 /**
118 * Holding this rwlock prevents modifications of the node's contents.
119 */
120 fibril_rwlock_t contents_rwlock;
121
122 struct _vfs_node *mount;
123} vfs_node_t;
124
125/**
126 * Instances of this type represent an open file. If the file is opened by more
127 * than one task, there will be a separate structure allocated for each task.
128 */
129typedef struct {
130 /** Serializes access to this open file. */
131 fibril_mutex_t _lock;
132
133 vfs_node_t *node;
134
135 /** Number of file handles referencing this file. */
136 unsigned refcnt;
137
138 int permissions;
139 bool open_read;
140 bool open_write;
141
142 /** Append on write. */
143 bool append;
144} vfs_file_t;
145
146extern fibril_mutex_t nodes_mutex;
147
148extern fibril_condvar_t fs_list_cv;
149extern fibril_mutex_t fs_list_lock;
150extern list_t fs_list; /**< List of registered file systems. */
151
152extern fibril_mutex_t fs_mntlist_lock;
153extern list_t fs_mntlist; /**< List of mounted file systems. */
154
155extern vfs_pair_t rootfs; /**< Root file system. */
156
157/** Each instance of this type describes one path lookup in progress. */
158typedef struct {
159 link_t plb_link; /**< Active PLB entries list link. */
160 unsigned index; /**< Index of the first character in PLB. */
161 size_t len; /**< Number of characters in this PLB entry. */
162} plb_entry_t;
163
164extern fibril_mutex_t plb_mutex;/**< Mutex protecting plb and plb_entries. */
165extern uint8_t *plb; /**< Path Lookup Buffer */
166extern list_t plb_entries; /**< List of active PLB entries. */
167
168/** Holding this rwlock prevents changes in file system namespace. */
169extern fibril_rwlock_t namespace_rwlock;
170
171extern async_exch_t *vfs_exchange_grab(fs_handle_t);
172extern void vfs_exchange_release(async_exch_t *);
173
174extern fs_handle_t fs_name_to_handle(unsigned int instance, const char *, bool);
175extern vfs_info_t *fs_handle_to_info(fs_handle_t);
176extern errno_t vfs_get_fstypes(vfs_fstypes_t *);
177
178extern errno_t vfs_lookup_internal(vfs_node_t *, char *, int, vfs_lookup_res_t *);
179extern errno_t vfs_link_internal(vfs_node_t *, char *, vfs_triplet_t *);
180
181extern bool vfs_nodes_init(void);
182extern vfs_node_t *vfs_node_get(vfs_lookup_res_t *);
183extern vfs_node_t *vfs_node_peek(vfs_lookup_res_t *result);
184extern void vfs_node_put(vfs_node_t *);
185extern void vfs_node_forget(vfs_node_t *);
186extern unsigned vfs_nodes_refcount_sum_get(fs_handle_t, service_id_t);
187
188extern bool vfs_node_has_children(vfs_node_t *node);
189
190extern void *vfs_client_data_create(void);
191extern void vfs_client_data_destroy(void *);
192
193extern void vfs_op_pass_handle(task_id_t, task_id_t, int);
194extern errno_t vfs_wait_handle_internal(bool, int *);
195
196extern vfs_file_t *vfs_file_get(int);
197extern void vfs_file_put(vfs_file_t *);
198extern errno_t vfs_fd_assign(vfs_file_t *, int);
199extern errno_t vfs_fd_alloc(vfs_file_t **file, bool desc, int *);
200extern errno_t vfs_fd_free(int);
201
202extern void vfs_node_addref(vfs_node_t *);
203extern void vfs_node_delref(vfs_node_t *);
204extern errno_t vfs_open_node_remote(vfs_node_t *);
205
206extern errno_t vfs_op_clone(int oldfd, int newfd, bool desc, int *);
207extern errno_t vfs_op_fsprobe(const char *, service_id_t, vfs_fs_probe_info_t *);
208extern errno_t vfs_op_mount(int mpfd, unsigned servid, unsigned flags, unsigned instance, const char *opts, const char *fsname, int *outfd);
209extern errno_t vfs_op_mtab_get(void);
210extern errno_t vfs_op_open(int fd, int flags);
211extern errno_t vfs_op_put(int fd);
212extern errno_t vfs_op_read(int fd, aoff64_t, size_t *out_bytes);
213extern errno_t vfs_op_rename(int basefd, char *old, char *new);
214extern errno_t vfs_op_resize(int fd, int64_t size);
215extern errno_t vfs_op_stat(int fd);
216extern errno_t vfs_op_statfs(int fd);
217extern errno_t vfs_op_sync(int fd);
218extern errno_t vfs_op_unlink(int parentfd, int expectfd, char *path);
219extern errno_t vfs_op_unmount(int mpfd);
220extern errno_t vfs_op_wait_handle(bool high_fd, int *out_fd);
221extern errno_t vfs_op_walk(int parentfd, int flags, char *path, int *out_fd);
222extern errno_t vfs_op_write(int fd, aoff64_t, size_t *out_bytes);
223
224extern void vfs_register(ipc_call_t *);
225
226extern void vfs_page_in(ipc_call_t *);
227
228typedef struct {
229 void *buffer;
230 size_t size;
231} rdwr_io_chunk_t;
232
233extern errno_t vfs_rdwr_internal(int, aoff64_t, bool, rdwr_io_chunk_t *);
234
235extern void vfs_connection(ipc_call_t *, void *);
236
237#endif
238
239/**
240 * @}
241 */
Note: See TracBrowser for help on using the repository browser.