root / lab4 / .minix-src / include / minix / fsdriver.h @ 14
History | View | Annotate | Download (4.92 KB)
1 |
#ifndef _MINIX_FSDRIVER_H
|
---|---|
2 |
#define _MINIX_FSDRIVER_H
|
3 |
|
4 |
struct stat;
|
5 |
struct statvfs;
|
6 |
struct timespec;
|
7 |
|
8 |
/* Resulting node properties. */
|
9 |
struct fsdriver_node {
|
10 |
ino_t fn_ino_nr; /* inode number */
|
11 |
mode_t fn_mode; /* file mode */
|
12 |
off_t fn_size; /* file size */
|
13 |
uid_t fn_uid; /* owning user ID */
|
14 |
gid_t fn_gid; /* owning group ID */
|
15 |
dev_t fn_dev; /* device number, for block/char dev */
|
16 |
}; |
17 |
|
18 |
/* Opaque data structure for the fsdriver_copyin, _copyout, _zero functions. */
|
19 |
struct fsdriver_data {
|
20 |
endpoint_t endpt; /* source/destination endpoint */
|
21 |
union {
|
22 |
cp_grant_id_t grant; /* grant, if endpt != SELF */
|
23 |
char *ptr; /* local pointer, if endpt == SELF */ |
24 |
}; |
25 |
size_t size; /* total buffer size (check only) */
|
26 |
}; |
27 |
|
28 |
/* Opaque data structure for the fsdriver_dentry_ functions. */
|
29 |
struct fsdriver_dentry {
|
30 |
const struct fsdriver_data *data; |
31 |
size_t data_size; |
32 |
size_t data_off; |
33 |
char *buf;
|
34 |
size_t buf_size; |
35 |
size_t buf_off; |
36 |
}; |
37 |
|
38 |
/*
|
39 |
* For a few groups of calls, the functions have the same signature, so that
|
40 |
* the file system can use a single implementation for multiple functions
|
41 |
* without requiring extra stubs. Thus, we pass in an extra parameter that
|
42 |
* identifies the call; one of the values below. For the same reason, the peek
|
43 |
* and bpeek calls have a "data" parameter which is always set to NULL.
|
44 |
*/
|
45 |
#define FSC_READ 0 /* read or bread call */ |
46 |
#define FSC_WRITE 1 /* write or bwrite call */ |
47 |
#define FSC_PEEK 2 /* peek or bpeek call */ |
48 |
|
49 |
#define FSC_UNLINK 0 /* unlink call */ |
50 |
#define FSC_RMDIR 1 /* rmdir call */ |
51 |
|
52 |
/* Function call table for file system services. */
|
53 |
struct fsdriver {
|
54 |
int (*fdr_mount)(dev_t dev, unsigned int flags, |
55 |
struct fsdriver_node *root_node, unsigned int *res_flags); |
56 |
void (*fdr_unmount)(void); |
57 |
int (*fdr_lookup)(ino_t dir_nr, char *name, struct fsdriver_node *node, |
58 |
int *is_mountpt);
|
59 |
int (*fdr_newnode)(mode_t mode, uid_t uid, gid_t gid, dev_t dev,
|
60 |
struct fsdriver_node *node);
|
61 |
int (*fdr_putnode)(ino_t ino_nr, unsigned int count); |
62 |
ssize_t (*fdr_read)(ino_t ino_nr, struct fsdriver_data *data,
|
63 |
size_t bytes, off_t pos, int call);
|
64 |
ssize_t (*fdr_write)(ino_t ino_nr, struct fsdriver_data *data,
|
65 |
size_t bytes, off_t pos, int call);
|
66 |
ssize_t (*fdr_peek)(ino_t ino_nr, struct fsdriver_data *data,
|
67 |
size_t bytes, off_t pos, int call);
|
68 |
ssize_t (*fdr_getdents)(ino_t ino_nr, struct fsdriver_data *data,
|
69 |
size_t bytes, off_t *pos); |
70 |
int (*fdr_trunc)(ino_t ino_nr, off_t start_pos, off_t end_pos);
|
71 |
void (*fdr_seek)(ino_t ino);
|
72 |
int (*fdr_create)(ino_t dir_nr, char *name, mode_t mode, uid_t uid, |
73 |
gid_t gid, struct fsdriver_node *node);
|
74 |
int (*fdr_mkdir)(ino_t dir_nr, char *name, mode_t mode, uid_t uid, |
75 |
gid_t gid); |
76 |
int (*fdr_mknod)(ino_t dir_nr, char *name, mode_t mode, uid_t uid, |
77 |
gid_t gid, dev_t rdev); |
78 |
int (*fdr_link)(ino_t dir_nr, char *name, ino_t ino_nr); |
79 |
int (*fdr_unlink)(ino_t dir_nr, char *name, int call); |
80 |
int (*fdr_rmdir)(ino_t dir_nr, char *name, int call); |
81 |
int (*fdr_rename)(ino_t old_dir_nr, char *old_name, ino_t new_dir_nr, |
82 |
char *new_name);
|
83 |
int (*fdr_slink)(ino_t dir_nr, char *name, uid_t uid, gid_t gid, |
84 |
struct fsdriver_data *data, size_t bytes);
|
85 |
ssize_t (*fdr_rdlink)(ino_t ino_nr, struct fsdriver_data *data,
|
86 |
size_t bytes); |
87 |
int (*fdr_stat)(ino_t ino_nr, struct stat *buf); |
88 |
int (*fdr_chown)(ino_t ino_nr, uid_t uid, gid_t gid, mode_t *mode);
|
89 |
int (*fdr_chmod)(ino_t ino_nr, mode_t *mode);
|
90 |
int (*fdr_utime)(ino_t ino_nr, struct timespec *atime, |
91 |
struct timespec *mtime);
|
92 |
int (*fdr_mountpt)(ino_t ino_nr);
|
93 |
int (*fdr_statvfs)(struct statvfs *buf); |
94 |
void (*fdr_sync)(void); |
95 |
void (*fdr_driver)(dev_t dev, char *label); |
96 |
ssize_t (*fdr_bread)(dev_t dev, struct fsdriver_data *data,
|
97 |
size_t bytes, off_t pos, int call);
|
98 |
ssize_t (*fdr_bwrite)(dev_t dev, struct fsdriver_data *data,
|
99 |
size_t bytes, off_t pos, int call);
|
100 |
ssize_t (*fdr_bpeek)(dev_t dev, struct fsdriver_data *data,
|
101 |
size_t bytes, off_t pos, int call);
|
102 |
void (*fdr_bflush)(dev_t dev);
|
103 |
void (*fdr_postcall)(void); |
104 |
void (*fdr_other)(const message *m_ptr, int ipc_status); |
105 |
}; |
106 |
|
107 |
/* Functions defined by libfsdriver. */
|
108 |
void fsdriver_process(const struct fsdriver * __restrict fdp, |
109 |
const message * __restrict m_ptr, int ipc_status, int asyn_reply); |
110 |
void fsdriver_terminate(void); |
111 |
void fsdriver_task(struct fsdriver *fdp); |
112 |
|
113 |
int fsdriver_copyin(const struct fsdriver_data *data, size_t off, void *ptr, |
114 |
size_t len); |
115 |
int fsdriver_copyout(const struct fsdriver_data *data, size_t off, |
116 |
const void *ptr, size_t len); |
117 |
int fsdriver_zero(const struct fsdriver_data *data, size_t off, size_t len); |
118 |
|
119 |
void fsdriver_dentry_init(struct fsdriver_dentry * __restrict dentry, |
120 |
const struct fsdriver_data * __restrict data, size_t bytes, |
121 |
char * __restrict buf, size_t bufsize);
|
122 |
ssize_t fsdriver_dentry_add(struct fsdriver_dentry * __restrict dentry,
|
123 |
ino_t ino_nr, const char * __restrict name, size_t namelen, |
124 |
unsigned int type); |
125 |
ssize_t fsdriver_dentry_finish(struct fsdriver_dentry *dentry);
|
126 |
|
127 |
#endif /* !_MINIX_FSDRIVER_H */ |