source: mainline/uspace/srv/vfs/vfs.h@ 95ba2b8

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

Make VFS use the new synchronization for fibrils. Now there should be no (or
only secondary) fibril serialization. Code reorganized not to hold the phone
lock during async_wait_for() in most cases. Tested on ia32. On amd64, VFS
crashes, but I think it is an unrelated problem.

  • Property mode set to 100644
File size: 6.1 KB
RevLine 
[c952465d]1/*
[4db6eaf]2 * Copyright (c) 2008 Jakub Jermar
[c952465d]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 * @{
[05b9912]31 */
[c952465d]32
33#ifndef VFS_VFS_H_
34#define VFS_VFS_H_
35
[d79dcdb]36#include <ipc/ipc.h>
[d9c8c81]37#include <adt/list.h>
[230260ac]38#include <fibril_sync.h>
[c31d773]39#include <futex.h>
[bcf23cf]40#include <sys/types.h>
[1090b8c]41#include <devmap.h>
[90e6025]42#include <bool.h>
[05b9912]43#include <ipc/vfs.h>
[d79dcdb]44
[6c89f20d]45// FIXME: according to CONFIG_DEBUG
[05b9912]46// #define dprintf(...) printf(__VA_ARGS__)
[6c89f20d]47
48#define dprintf(...)
[8f9ede5]49
[8c20b26]50/**
51 * A structure like this will be allocated for each registered file system.
52 */
[2b20947]53typedef struct {
54 link_t fs_link;
55 vfs_info_t vfs_info;
[f2ec8c8]56 fs_handle_t fs_handle;
[230260ac]57 fibril_mutex_t phone_lock;
[a0edf5f]58 ipcarg_t phone;
[2b20947]59} fs_info_t;
60
[8c20b26]61/**
[4d21cf8]62 * VFS_PAIR uniquely represents a file system instance.
63 */
[05b9912]64#define VFS_PAIR \
65 fs_handle_t fs_handle; \
[f2ec8c8]66 dev_handle_t dev_handle;
[4d21cf8]67
68/**
69 * VFS_TRIPLET uniquely identifies a file system node (e.g. directory, file) but
70 * doesn't contain any state. For a stateful structure, see vfs_node_t.
[8c20b26]71 *
72 * @note fs_handle, dev_handle and index are meant to be returned in one
73 * IPC reply.
74 */
[05b9912]75#define VFS_TRIPLET \
76 VFS_PAIR; \
[f2ec8c8]77 fs_index_t index;
[4d21cf8]78
79typedef struct {
80 VFS_PAIR;
81} vfs_pair_t;
82
83typedef struct {
84 VFS_TRIPLET;
85} vfs_triplet_t;
86
[b17186d]87typedef enum vfs_node_type {
88 VFS_NODE_UNKNOWN,
89 VFS_NODE_FILE,
90 VFS_NODE_DIRECTORY,
91} vfs_node_type_t;
92
[eb27ce5a]93typedef struct {
94 vfs_triplet_t triplet;
[b17186d]95 vfs_node_type_t type;
[eb27ce5a]96 size_t size;
[b5553a2]97 unsigned lnkcnt;
[eb27ce5a]98} vfs_lookup_res_t;
99
[4d21cf8]100/**
101 * Instances of this type represent an active, in-memory VFS node and any state
102 * which may be associated with it.
103 */
[8c20b26]104typedef struct {
[4d21cf8]105 VFS_TRIPLET; /**< Identity of the node. */
[b5553a2]106
107 /**
108 * Usage counter. This includes, but is not limited to, all vfs_file_t
109 * structures that reference this node.
110 */
111 unsigned refcnt;
112
113 /** Number of names this node has in the file system namespace. */
114 unsigned lnkcnt;
115
[320c884]116 link_t nh_link; /**< Node hash-table link. */
[b17186d]117
118 vfs_node_type_t type; /**< Partial info about the node type. */
119
[f689a3e]120 size_t size; /**< Cached size if the node is a file. */
[f57f8ea]121
[4db6eaf]122 /**
123 * Holding this rwlock prevents modifications of the node's contents.
124 */
[230260ac]125 fibril_rwlock_t contents_rwlock;
[8c20b26]126} vfs_node_t;
127
128/**
129 * Instances of this type represent an open file. If the file is opened by more
130 * than one task, there will be a separate structure allocated for each task.
131 */
132typedef struct {
[10d6b858]133 /** Serializes access to this open file. */
[230260ac]134 fibril_mutex_t lock;
[10d6b858]135
[8c20b26]136 vfs_node_t *node;
137
138 /** Number of file handles referencing this file. */
[320c884]139 unsigned refcnt;
[8c20b26]140
[15b9970]141 /** Append on write. */
142 bool append;
143
[8c20b26]144 /** Current position in the file. */
145 off_t pos;
146} vfs_file_t;
147
[c31d773]148extern futex_t nodes_futex;
149
[bcf23cf]150extern link_t fs_head; /**< List of registered file systems. */
151
[f49b0ea]152extern vfs_pair_t rootfs; /**< Root file system. */
[bcf23cf]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
[c31d773]161extern futex_t plb_futex; /**< Futex protecting plb and plb_head. */
[bcf23cf]162extern uint8_t *plb; /**< Path Lookup Buffer */
163extern link_t plb_head; /**< List of active PLB entries. */
[8f9ede5]164
[594303b]165#define MAX_MNTOPTS_LEN 256
166
[b3c38750]167/** Holding this rwlock prevents changes in file system namespace. */
[230260ac]168extern fibril_rwlock_t namespace_rwlock;
[320c884]169
[f2ec8c8]170extern int vfs_grab_phone(fs_handle_t);
[5f4cfb1e]171extern void vfs_release_phone(int);
172
[f2ec8c8]173extern fs_handle_t fs_name_to_handle(char *, bool);
[84b86dcb]174
[05b9912]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 *);
[320c884]178
[b818cff]179extern bool vfs_nodes_init(void);
[eb27ce5a]180extern vfs_node_t *vfs_node_get(vfs_lookup_res_t *);
[320c884]181extern void vfs_node_put(vfs_node_t *);
182
[b818cff]183#define MAX_OPEN_FILES 128
184
[320c884]185extern bool vfs_files_init(void);
186extern vfs_file_t *vfs_file_get(int);
187extern int vfs_fd_alloc(void);
[b7f9087]188extern int vfs_fd_free(int);
[320c884]189
190extern void vfs_file_addref(vfs_file_t *);
191extern void vfs_file_delref(vfs_file_t *);
192
193extern void vfs_node_addref(vfs_node_t *);
194extern void vfs_node_delref(vfs_node_t *);
[6c117bb]195
[8dc72b64]196extern void vfs_process_pending_mount(void);
[bcf23cf]197extern void vfs_register(ipc_callid_t, ipc_call_t *);
[6c117bb]198extern void vfs_mount(ipc_callid_t, ipc_call_t *);
[5b890cfd]199extern void vfs_open(ipc_callid_t, ipc_call_t *);
[05b9912]200extern void vfs_open_node(ipc_callid_t, ipc_call_t *);
201extern void vfs_device(ipc_callid_t, ipc_call_t *);
202extern void vfs_sync(ipc_callid_t, ipc_call_t *);
203extern void vfs_node(ipc_callid_t, ipc_call_t *);
[e704503]204extern void vfs_close(ipc_callid_t, ipc_call_t *);
[b3cd9eb]205extern void vfs_read(ipc_callid_t, ipc_call_t *);
[ee1b8ca]206extern void vfs_write(ipc_callid_t, ipc_call_t *);
[222e57c]207extern void vfs_seek(ipc_callid_t, ipc_call_t *);
[0ee4322]208extern void vfs_truncate(ipc_callid_t, ipc_call_t *);
[72bde81]209extern void vfs_mkdir(ipc_callid_t, ipc_call_t *);
[f15cf1a6]210extern void vfs_unlink(ipc_callid_t, ipc_call_t *);
[a8e9ab8d]211extern void vfs_rename(ipc_callid_t, ipc_call_t *);
[8f9ede5]212
[c952465d]213#endif
214
215/**
216 * @}
[d79dcdb]217 */
Note: See TracBrowser for help on using the repository browser.