puffs_priv.h revision 1.20.2.3 1 /* puffs_priv.h,v 1.20.2.2 2008/01/09 01:36:52 matt Exp */
2
3 /*
4 * Copyright (c) 2006, 2007, 2008 Antti Kantee. All Rights Reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. 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 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28 #ifndef _PUFFS_PRIVATE_H_
29 #define _PUFFS_PRIVATE_H_
30
31 #include <sys/types.h>
32 #include <fs/puffs/puffs_msgif.h>
33
34 #include <puffs.h>
35 #include <ucontext.h>
36
37 #ifdef PUFFS_WITH_THREADS
38 #include <pthread.h>
39
40 extern pthread_mutex_t pu_lock;
41 #define PU_LOCK() pthread_mutex_lock(&pu_lock)
42 #define PU_UNLOCK() pthread_mutex_unlock(&pu_lock)
43 #else
44 #define PU_LOCK()
45 #define PU_UNLOCK()
46 #endif
47
48 #define PU_CMAP(pu, c) (pu->pu_cmap ? pu->pu_cmap(pu,c) : (struct puffs_node*)c)
49
50 struct puffs_framectrl {
51 puffs_framev_readframe_fn rfb;
52 puffs_framev_writeframe_fn wfb;
53 puffs_framev_cmpframe_fn cmpfb;
54 puffs_framev_gotframe_fn gotfb;
55 puffs_framev_fdnotify_fn fdnotfn;
56 };
57
58 struct puffs_fctrl_io {
59 struct puffs_framectrl *fctrl;
60
61 int io_fd;
62 int stat;
63
64 int rwait;
65 int wwait;
66
67 struct puffs_framebuf *cur_in;
68
69 TAILQ_HEAD(, puffs_framebuf) snd_qing; /* queueing to be sent */
70 TAILQ_HEAD(, puffs_framebuf) res_qing; /* q'ing for rescue */
71 LIST_HEAD(, puffs_fbevent) ev_qing; /* q'ing for events */
72
73 LIST_ENTRY(puffs_fctrl_io) fio_entries;
74 };
75 #define FIO_WR 0x01
76 #define FIO_WRGONE 0x02
77 #define FIO_RDGONE 0x04
78 #define FIO_DEAD 0x08
79 #define FIO_ENABLE_R 0x10
80 #define FIO_ENABLE_W 0x20
81
82 #define FIO_EN_WRITE(fio) \
83 (!(fio->stat & FIO_WR) \
84 && ((!TAILQ_EMPTY(&fio->snd_qing) \
85 && (fio->stat & FIO_ENABLE_W)) \
86 || fio->wwait))
87
88 #define FIO_RM_WRITE(fio) \
89 ((fio->stat & FIO_WR) \
90 && (((TAILQ_EMPTY(&fio->snd_qing) \
91 || (fio->stat & FIO_ENABLE_W) == 0)) \
92 && (fio->wwait == 0)))
93
94
95 /*
96 * usermount: describes one file system instance
97 */
98 struct puffs_usermount {
99 struct puffs_ops pu_ops;
100
101 int pu_fd;
102 size_t pu_maxreqlen;
103
104 uint32_t pu_flags;
105 int pu_cc_stackshift;
106
107 struct puffs_cc *pu_cc_main;
108 #define PUFFS_CCMAXSTORE 32
109 int pu_cc_nstored;
110
111 int pu_kq;
112 int pu_state;
113 #define PU_STATEMASK 0xff
114 #define PU_INLOOP 0x100
115 #define PU_ASYNCFD 0x200
116 #define PU_HASKQ 0x400
117 #define PU_PUFFSDAEMON 0x800
118 #define PU_SETSTATE(pu, s) (pu->pu_state = (s) | (pu->pu_state & ~PU_STATEMASK))
119 int pu_dpipe[2];
120
121 struct puffs_node *pu_pn_root;
122
123 LIST_HEAD(, puffs_node) pu_pnodelst;
124
125 LIST_HEAD(, puffs_cc) pu_ccmagazin;
126 TAILQ_HEAD(, puffs_cc) pu_lazyctx;
127 TAILQ_HEAD(, puffs_cc) pu_sched;
128
129 pu_cmap_fn pu_cmap;
130
131 pu_pathbuild_fn pu_pathbuild;
132 pu_pathtransform_fn pu_pathtransform;
133 pu_pathcmp_fn pu_pathcmp;
134 pu_pathfree_fn pu_pathfree;
135 pu_namemod_fn pu_namemod;
136
137 pu_errnotify_fn pu_errnotify;
138
139 pu_prepost_fn pu_oppre;
140 pu_prepost_fn pu_oppost;
141
142 struct puffs_framectrl pu_framectrl[2];
143 #define PU_FRAMECTRL_FS 0
144 #define PU_FRAMECTRL_USER 1
145 LIST_HEAD(, puffs_fctrl_io) pu_ios;
146 LIST_HEAD(, puffs_fctrl_io) pu_ios_rmlist;
147 struct kevent *pu_evs;
148 size_t pu_nfds;
149
150 puffs_ml_loop_fn pu_ml_lfn;
151 struct timespec pu_ml_timeout;
152 struct timespec *pu_ml_timep;
153
154 struct puffs_kargs *pu_kargp;
155
156 uint64_t pu_nextreq;
157 void *pu_privdata;
158 };
159
160 /* call context */
161
162 struct puffs_cc;
163 typedef void (*puffs_ccfunc)(struct puffs_cc *);
164
165 struct puffs_cc {
166 struct puffs_usermount *pcc_pu;
167 struct puffs_framebuf *pcc_pb;
168
169 /* real cc */
170 union {
171 struct {
172 ucontext_t uc; /* "continue" */
173 ucontext_t uc_ret; /* "yield" */
174 } real;
175 struct {
176 puffs_ccfunc func;
177 void *farg;
178 } fake;
179 } pcc_u;
180
181 pid_t pcc_pid;
182 lwpid_t pcc_lid;
183
184 int pcc_flags;
185
186 TAILQ_ENTRY(puffs_cc) pcc_schedent;
187 LIST_ENTRY(puffs_cc) pcc_rope;
188 };
189 #define pcc_uc pcc_u.real.uc
190 #define pcc_uc_ret pcc_u.real.uc_ret
191 #define pcc_func pcc_u.fake.func
192 #define pcc_farg pcc_u.fake.farg
193 #define PCC_DONE 0x01
194 #define PCC_BORROWED 0x02
195 #define PCC_HASCALLER 0x04
196 #define PCC_MLCONT 0x08
197
198 struct puffs_newinfo {
199 void **pni_cookie;
200 enum vtype *pni_vtype;
201 voff_t *pni_size;
202 dev_t *pni_rdev;
203 };
204
205 #define PUFFS_MAKEKCRED(to, from) \
206 /*LINTED: tnilxnaht, the cast is ok */ \
207 const struct puffs_kcred *to = (const void *)from
208 #define PUFFS_MAKECRED(to, from) \
209 /*LINTED: tnilxnaht, the cast is ok */ \
210 const struct puffs_cred *to = (const void *)from
211 #define PUFFS_KCREDTOCRED(to, from) \
212 /*LINTED: tnilxnaht, the cast is ok */ \
213 to = (void *)from
214
215 __BEGIN_DECLS
216
217 void puffs__framev_input(struct puffs_usermount *, struct puffs_framectrl *,
218 struct puffs_fctrl_io *);
219 int puffs__framev_output(struct puffs_usermount *, struct puffs_framectrl*,
220 struct puffs_fctrl_io *);
221 void puffs__framev_exit(struct puffs_usermount *);
222 void puffs__framev_readclose(struct puffs_usermount *,
223 struct puffs_fctrl_io *, int);
224 void puffs__framev_writeclose(struct puffs_usermount *,
225 struct puffs_fctrl_io *, int);
226 void puffs__framev_notify(struct puffs_fctrl_io *, int);
227 void *puffs__framebuf_getdataptr(struct puffs_framebuf *);
228 int puffs__framev_addfd_ctrl(struct puffs_usermount *, int, int,
229 struct puffs_framectrl *);
230 void puffs__framebuf_moveinfo(struct puffs_framebuf *,
231 struct puffs_framebuf *);
232
233 void puffs__theloop(struct puffs_cc *);
234 void puffs__ml_dispatch(struct puffs_usermount *, struct puffs_framebuf *);
235
236 int puffs__cc_create(struct puffs_usermount *, puffs_ccfunc,
237 struct puffs_cc **);
238 void puffs__cc_cont(struct puffs_cc *);
239 void puffs__cc_destroy(struct puffs_cc *, int);
240 void puffs__cc_setcaller(struct puffs_cc *, pid_t, lwpid_t);
241 void puffs__goto(struct puffs_cc *);
242
243 int puffs__fsframe_read(struct puffs_usermount *, struct puffs_framebuf *,
244 int, int *);
245 int puffs__fsframe_write(struct puffs_usermount *, struct puffs_framebuf *,
246 int, int *);
247 int puffs__fsframe_cmp(struct puffs_usermount *, struct puffs_framebuf *,
248 struct puffs_framebuf *, int *);
249 void puffs__fsframe_gotframe(struct puffs_usermount *,
250 struct puffs_framebuf *);
251
252 uint64_t puffs__nextreq(struct puffs_usermount *pu);
253
254 __END_DECLS
255
256 #endif /* _PUFFS_PRIVATE_H_ */
257