xref: /minix3/minix/include/minix/fsdriver.h (revision 89c9de7d091f384bd4337bd6775fb15c93b8e8c6)
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 */
128