Subversion Repositories HelenOS

Rev

Rev 3022 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3022 Rev 4055
Line 38... Line 38...
38
#include <futex.h>
38
#include <futex.h>
39
#include <rwlock.h>
39
#include <rwlock.h>
40
#include <sys/types.h>
40
#include <sys/types.h>
41
#include <bool.h>
41
#include <bool.h>
42
 
42
 
-
 
43
// FIXME: according to CONFIG_DEBUG
43
#define dprintf(...)    printf(__VA_ARGS__)
44
// #define dprintf(...) printf(__VA_ARGS__)
44
 
45
 
45
#define VFS_FIRST   IPC_FIRST_USER_METHOD
46
#define dprintf(...)
46
 
47
 
47
#define IPC_METHOD_TO_VFS_OP(m) ((m) - VFS_FIRST)   
48
#define VFS_FIRST   IPC_FIRST_USER_METHOD
48
 
49
 
49
/* Basic types. */
50
/* Basic types. */
50
typedef int16_t fs_handle_t;
51
typedef int16_t fs_handle_t;
51
typedef int16_t dev_handle_t;
52
typedef int16_t dev_handle_t;
52
typedef uint32_t fs_index_t;
53
typedef uint32_t fs_index_t;
Line 60... Line 61...
60
    VFS_LAST_CMN,   /* keep this the last member of this enum */
61
    VFS_LAST_CMN,   /* keep this the last member of this enum */
61
} vfs_request_cmn_t;
62
} vfs_request_cmn_t;
62
 
63
 
63
typedef enum {
64
typedef enum {
64
    VFS_LOOKUP = VFS_LAST_CMN,
65
    VFS_LOOKUP = VFS_LAST_CMN,
-
 
66
    VFS_MOUNTED,
65
    VFS_DESTROY,
67
    VFS_DESTROY,
66
    VFS_LAST_CLNT,  /* keep this the last member of this enum */
68
    VFS_LAST_CLNT,  /* keep this the last member of this enum */
67
} vfs_request_clnt_t;
69
} vfs_request_clnt_t;
68
 
70
 
69
typedef enum {
71
typedef enum {
Line 75... Line 77...
75
    VFS_UNLINK,
77
    VFS_UNLINK,
76
    VFS_RENAME,
78
    VFS_RENAME,
77
    VFS_LAST_SRV,   /* keep this the last member of this enum */
79
    VFS_LAST_SRV,   /* keep this the last member of this enum */
78
} vfs_request_srv_t;
80
} vfs_request_srv_t;
79
 
81
 
80
 
-
 
81
/**
-
 
82
 * An instance of this structure is associated with a particular FS operation.
-
 
83
 * It tells VFS if the FS supports the operation or maybe if a default one
-
 
84
 * should be used.
-
 
85
 */
-
 
86
typedef enum {
-
 
87
    VFS_OP_NULL = 0,
-
 
88
    VFS_OP_DEFAULT,
-
 
89
    VFS_OP_DEFINED
-
 
90
} vfs_op_t;
-
 
91
 
-
 
92
#define FS_NAME_MAXLEN  20
82
#define FS_NAME_MAXLEN  20
93
 
83
 
94
/**
84
/**
95
 * A structure like this is passed to VFS by each individual FS upon its
85
 * A structure like this is passed to VFS by each individual FS upon its
96
 * registration. It assosiates a human-readable identifier with each
86
 * registration. It assosiates a human-readable identifier with each
97
 * registered FS. More importantly, through this structure, the FS announces
-
 
98
 * what operations it supports.
87
 * registered FS.
99
 */
88
 */
100
typedef struct {
89
typedef struct {
101
    /** Unique identifier of the fs. */
90
    /** Unique identifier of the fs. */
102
    char name[FS_NAME_MAXLEN + 1];
91
    char name[FS_NAME_MAXLEN + 1];
103
   
-
 
104
    /** Operations. */
-
 
105
    vfs_op_t ops[VFS_LAST_CLNT - VFS_FIRST];
-
 
106
} vfs_info_t;
92
} vfs_info_t;
107
 
93
 
108
/**
94
/**
109
 * A structure like this will be allocated for each registered file system.
95
 * A structure like this will be allocated for each registered file system.
110
 */
96
 */
Line 184... Line 170...
184
 * L_PARENT performs a lookup but returns the triplet of the parent node.
170
 * L_PARENT performs a lookup but returns the triplet of the parent node.
185
 * This flag may not be combined with any other lookup flag.
171
 * This flag may not be combined with any other lookup flag.
186
 */
172
 */
187
#define L_PARENT    64  
173
#define L_PARENT    64  
188
 
174
 
-
 
175
typedef enum vfs_node_type {
-
 
176
    VFS_NODE_UNKNOWN,
-
 
177
    VFS_NODE_FILE,
-
 
178
    VFS_NODE_DIRECTORY,
-
 
179
} vfs_node_type_t;
-
 
180
 
189
typedef struct {
181
typedef struct {
190
    vfs_triplet_t triplet;
182
    vfs_triplet_t triplet;
-
 
183
    vfs_node_type_t type;
191
    size_t size;
184
    size_t size;
192
    unsigned lnkcnt;
185
    unsigned lnkcnt;
193
} vfs_lookup_res_t;
186
} vfs_lookup_res_t;
194
 
187
 
195
/**
188
/**
Line 207... Line 200...
207
   
200
   
208
    /** Number of names this node has in the file system namespace. */
201
    /** Number of names this node has in the file system namespace. */
209
    unsigned lnkcnt;
202
    unsigned lnkcnt;
210
 
203
 
211
    link_t nh_link;     /**< Node hash-table link. */
204
    link_t nh_link;     /**< Node hash-table link. */
-
 
205
 
-
 
206
    vfs_node_type_t type;   /**< Partial info about the node type. */
-
 
207
 
212
    size_t size;        /**< Cached size if the node is a file. */
208
    size_t size;        /**< Cached size if the node is a file. */
213
 
209
 
214
    /**
210
    /**
215
     * Holding this rwlock prevents modifications of the node's contents.
211
     * Holding this rwlock prevents modifications of the node's contents.
216
     */
212
     */
Line 239... Line 235...
239
 
235
 
240
extern futex_t nodes_futex;
236
extern futex_t nodes_futex;
241
 
237
 
242
extern link_t fs_head;      /**< List of registered file systems. */
238
extern link_t fs_head;      /**< List of registered file systems. */
243
 
239
 
244
extern vfs_triplet_t rootfs;    /**< Root node of the root file system. */
240
extern vfs_pair_t rootfs;   /**< Root file system. */
245
 
241
 
246
#define MAX_PATH_LEN        (64 * 1024)
242
#define MAX_PATH_LEN        (64 * 1024)
247
 
243
 
248
#define PLB_SIZE        (2 * MAX_PATH_LEN)
244
#define PLB_SIZE        (2 * MAX_PATH_LEN)
249
 
245
 
Line 276... Line 272...
276
#define MAX_OPEN_FILES  128
272
#define MAX_OPEN_FILES  128
277
 
273
 
278
extern bool vfs_files_init(void);
274
extern bool vfs_files_init(void);
279
extern vfs_file_t *vfs_file_get(int);
275
extern vfs_file_t *vfs_file_get(int);
280
extern int vfs_fd_alloc(void);
276
extern int vfs_fd_alloc(void);
281
extern void vfs_fd_free(int);
277
extern int vfs_fd_free(int);
282
 
278
 
283
extern void vfs_file_addref(vfs_file_t *);
279
extern void vfs_file_addref(vfs_file_t *);
284
extern void vfs_file_delref(vfs_file_t *);
280
extern void vfs_file_delref(vfs_file_t *);
285
 
281
 
286
extern void vfs_node_addref(vfs_node_t *);
282
extern void vfs_node_addref(vfs_node_t *);
287
extern void vfs_node_delref(vfs_node_t *);
283
extern void vfs_node_delref(vfs_node_t *);
288
 
284
 
-
 
285
extern void vfs_process_pending_mount(void);
289
extern void vfs_register(ipc_callid_t, ipc_call_t *);
286
extern void vfs_register(ipc_callid_t, ipc_call_t *);
290
extern void vfs_mount(ipc_callid_t, ipc_call_t *);
287
extern void vfs_mount(ipc_callid_t, ipc_call_t *);
291
extern void vfs_open(ipc_callid_t, ipc_call_t *);
288
extern void vfs_open(ipc_callid_t, ipc_call_t *);
292
extern void vfs_close(ipc_callid_t, ipc_call_t *);
289
extern void vfs_close(ipc_callid_t, ipc_call_t *);
293
extern void vfs_read(ipc_callid_t, ipc_call_t *);
290
extern void vfs_read(ipc_callid_t, ipc_call_t *);