~martin-decky/helenos/rcu

« back to all changes in this revision

Viewing changes to uspace/srv/vfs/vfs.h

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

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